Skip to content

Commit 73e6bb5

Browse files
committed
addressing inbelic comments
1 parent 284901c commit 73e6bb5

File tree

6 files changed

+49
-6
lines changed

6 files changed

+49
-6
lines changed

llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ LLVM_ABI bool verifyRangeType(uint32_t Type);
3333
LLVM_ABI bool verifyDescriptorRangeFlag(uint32_t Version,
3434
dxil::ResourceClass Type,
3535
dxbc::DescriptorRangeFlags FlagsVal);
36+
LLVM_ABI bool verifyStaticSamplerFlags(uint32_t Version,
37+
dxbc::StaticSamplerFlags Flags);
3638
LLVM_ABI bool verifyNumDescriptors(uint32_t NumDescriptors);
3739
LLVM_ABI bool verifyMipLODBias(float MipLODBias);
3840
LLVM_ABI bool verifyMaxAnisotropy(uint32_t MaxAnisotropy);

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ struct StaticSampler {
7575
uint32_t RegisterSpace;
7676
dxbc::ShaderVisibility ShaderVisibility;
7777
// Version 3 onwards:
78-
uint32_t Flags;
78+
uint32_t Flags = 0;
7979
};
8080

8181
struct RootParametersContainer {

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,13 @@ Error MetadataParser::validateRootSignature(
651651
joinErrors(std::move(DeferredErrs),
652652
make_error<RootSignatureValidationError<uint32_t>>(
653653
"RegisterSpace", Sampler.RegisterSpace));
654+
655+
if (!hlsl::rootsig::verifyStaticSamplerFlags(
656+
RSD.Version, dxbc::StaticSamplerFlags(Sampler.Flags)))
657+
DeferredErrs =
658+
joinErrors(std::move(DeferredErrs),
659+
make_error<RootSignatureValidationError<uint32_t>>(
660+
"Static Sampler Flag", Sampler.Flags));
654661
}
655662

656663
return DeferredErrs;

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,21 @@ bool verifyDescriptorRangeFlag(uint32_t Version, dxil::ResourceClass Type,
113113
return (Flags & ~Mask) == FlagT::None;
114114
}
115115

116+
bool verifyStaticSamplerFlags(uint32_t Version,
117+
dxbc::StaticSamplerFlags Flags) {
118+
119+
if (Version <= 2)
120+
return Flags == dxbc::StaticSamplerFlags::None;
121+
122+
assert(Version == 3 && "Provided invalid root signature version");
123+
124+
dxbc::StaticSamplerFlags Mask =
125+
dxbc::StaticSamplerFlags::NonNormalizedCoordinates |
126+
dxbc::StaticSamplerFlags::UintBorderColor |
127+
dxbc::StaticSamplerFlags::None;
128+
return (Flags | Mask) == Mask;
129+
}
130+
116131
bool verifyNumDescriptors(uint32_t NumDescriptors) {
117132
return NumDescriptors > 0;
118133
}

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ static uint32_t rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
3232

3333
size_t RootSignatureDesc::getSize() const {
3434
uint32_t StaticSamplersOffset = computeStaticSamplersOffset();
35-
size_t StaticSamplersSize =
36-
(Version > 2 ? sizeof(dxbc::RTS0::v3::StaticSampler)
37-
: sizeof(dxbc::RTS0::v1::StaticSampler)) *
38-
StaticSamplers.size();
35+
size_t StaticSamplersSize = sizeof(dxbc::RTS0::v1::StaticSampler);
36+
if (Version > 2)
37+
StaticSamplersSize = sizeof(dxbc::RTS0::v3::StaticSampler);
3938

40-
return size_t(StaticSamplersOffset) + StaticSamplersSize;
39+
return size_t(StaticSamplersOffset) +
40+
(StaticSamplersSize * StaticSamplers.size());
4141
}
4242

4343
uint32_t RootSignatureDesc::computeRootParametersOffset() const {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
2+
3+
4+
target triple = "dxil-unknown-shadermodel6.0-compute"
5+
6+
; CHECK: error: Invalid value for ShaderVisibility: 666
7+
; CHECK-NOT: Root Signature Definitions
8+
9+
define void @main() #0 {
10+
entry:
11+
ret void
12+
}
13+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
14+
15+
16+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
17+
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
18+
!3 = !{ !5 } ; list of root signature elements
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 666 }

0 commit comments

Comments
 (0)