Skip to content

Commit 8dbef2c

Browse files
joaosaffrangithub-actions[bot]
authored andcommitted
Automerge: [DirectX] Updating DXContainer Yaml to represent Root Signature 1.2 (#159659)
This PR updates the YAML representation of DXContainer to support Root Signature 1.2, this also requires updating the write logic to support testing.
2 parents 5481a3c + 7d2f6fd commit 8dbef2c

File tree

13 files changed

+174
-4
lines changed

13 files changed

+174
-4
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,15 @@ enum class DescriptorRangeFlags : uint32_t {
185185

186186
LLVM_ABI ArrayRef<EnumEntry<DescriptorRangeFlags>> getDescriptorRangeFlags();
187187

188+
#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) Enum = Num,
189+
enum class StaticSamplerFlags : uint32_t {
190+
#include "DXContainerConstants.def"
191+
192+
LLVM_MARK_AS_BITMASK_ENUM(NonNormalizedCoordinates)
193+
};
194+
195+
LLVM_ABI ArrayRef<EnumEntry<StaticSamplerFlags>> getStaticSamplerFlags();
196+
188197
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
189198
enum class RootParameterType : uint32_t {
190199
#include "DXContainerConstants.def"
@@ -813,6 +822,22 @@ struct DescriptorRange {
813822
}
814823
};
815824
} // namespace v2
825+
826+
namespace v3 {
827+
struct StaticSampler : public v1::StaticSampler {
828+
uint32_t Flags;
829+
830+
StaticSampler() = default;
831+
explicit StaticSampler(v1::StaticSampler &Base)
832+
: v1::StaticSampler(Base), Flags(0U) {}
833+
834+
void swapBytes() {
835+
v1::StaticSampler::swapBytes();
836+
sys::swapByteOrder(Flags);
837+
}
838+
};
839+
840+
} // namespace v3
816841
} // namespace RTS0
817842

818843
// D3D_ROOT_SIGNATURE_VERSION

llvm/include/llvm/BinaryFormat/DXContainerConstants.def

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ DESCRIPTOR_RANGE_FLAG(0x10000, DescriptorsStaticKeepingBufferBoundsChecks, DESCR
104104
#undef DESCRIPTOR_RANGE_FLAG
105105
#endif // DESCRIPTOR_RANGE_FLAG
106106

107+
// STATIC_SAMPLER_FLAG(flag value, name, flag).
108+
#ifdef STATIC_SAMPLER_FLAG
109+
110+
STATIC_SAMPLER_FLAG(0x0, None, SAMPLER_FLAG_NONE)
111+
STATIC_SAMPLER_FLAG(0x1, UintBorderColor, SAMPLER_FLAG_UINT_BORDER_COLOR)
112+
STATIC_SAMPLER_FLAG(0x2, NonNormalizedCoordinates, SAMPLER_FLAG_NON_NORMALIZED_COORDINATES)
113+
114+
#undef STATIC_SAMPLER_FLAG
115+
#endif // STATIC_SAMPLER_FLAG
116+
107117
#ifdef ROOT_PARAMETER
108118

109119
ROOT_PARAMETER(0, DescriptorTable)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ 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, uint32_t FlagsNumber);
3637
LLVM_ABI bool verifyNumDescriptors(uint32_t NumDescriptors);
3738
LLVM_ABI bool verifyMipLODBias(float MipLODBias);
3839
LLVM_ABI bool verifyMaxAnisotropy(uint32_t MaxAnisotropy);

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ struct StaticSampler {
7474
uint32_t ShaderRegister;
7575
uint32_t RegisterSpace;
7676
dxbc::ShaderVisibility ShaderVisibility;
77+
// Version 3 onwards:
78+
uint32_t Flags = 0;
7779
};
7880

7981
struct RootParametersContainer {

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,11 @@ struct StaticSamplerYamlDesc {
178178
uint32_t ShaderRegister;
179179
uint32_t RegisterSpace;
180180
dxbc::ShaderVisibility ShaderVisibility;
181+
182+
LLVM_ABI uint32_t getEncodedFlags() const;
183+
184+
#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) bool Enum = false;
185+
#include "llvm/BinaryFormat/DXContainerConstants.def"
181186
};
182187

183188
struct RootSignatureYamlDesc {

llvm/lib/BinaryFormat/DXContainer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ ArrayRef<EnumEntry<DescriptorRangeFlags>> dxbc::getDescriptorRangeFlags() {
8989
return ArrayRef(DescriptorRangeFlagNames);
9090
}
9191

92+
static const EnumEntry<StaticSamplerFlags> StaticSamplerFlagNames[] = {
93+
#define STATIC_SAMPLER_FLAG(Val, Enum, Flag) {#Enum, StaticSamplerFlags::Enum},
94+
#include "llvm/BinaryFormat/DXContainerConstants.def"
95+
};
96+
97+
ArrayRef<EnumEntry<StaticSamplerFlags>> dxbc::getStaticSamplerFlags() {
98+
return ArrayRef(StaticSamplerFlagNames);
99+
}
100+
92101
#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},
93102

94103
static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,12 @@ Error MetadataParser::validateRootSignature(
719719
joinErrors(std::move(DeferredErrs),
720720
make_error<RootSignatureValidationError<uint32_t>>(
721721
"RegisterSpace", Sampler.RegisterSpace));
722+
723+
if (!hlsl::rootsig::verifyStaticSamplerFlags(RSD.Version, Sampler.Flags))
724+
DeferredErrs =
725+
joinErrors(std::move(DeferredErrs),
726+
make_error<RootSignatureValidationError<uint32_t>>(
727+
"Static Sampler Flag", Sampler.Flags));
722728
}
723729

724730
return DeferredErrs;

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ namespace rootsig {
2020

2121
bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
2222

23-
bool verifyVersion(uint32_t Version) { return (Version == 1 || Version == 2); }
23+
bool verifyVersion(uint32_t Version) {
24+
return (Version == 1 || Version == 2 || Version == 3);
25+
}
2426

2527
bool verifyRegisterValue(uint32_t RegisterValue) {
2628
return RegisterValue != ~0U;
@@ -111,6 +113,25 @@ bool verifyDescriptorRangeFlag(uint32_t Version, dxil::ResourceClass Type,
111113
return (Flags & ~Mask) == FlagT::None;
112114
}
113115

116+
bool verifyStaticSamplerFlags(uint32_t Version, uint32_t FlagsNumber) {
117+
uint32_t LargestValue = llvm::to_underlying(
118+
dxbc::StaticSamplerFlags::LLVM_BITMASK_LARGEST_ENUMERATOR);
119+
if (FlagsNumber >= NextPowerOf2(LargestValue))
120+
return false;
121+
122+
dxbc::StaticSamplerFlags Flags = dxbc::StaticSamplerFlags(FlagsNumber);
123+
if (Version <= 2)
124+
return Flags == dxbc::StaticSamplerFlags::None;
125+
126+
assert(Version == 3 && "Provided invalid root signature version");
127+
128+
dxbc::StaticSamplerFlags Mask =
129+
dxbc::StaticSamplerFlags::NonNormalizedCoordinates |
130+
dxbc::StaticSamplerFlags::UintBorderColor |
131+
dxbc::StaticSamplerFlags::None;
132+
return (Flags | Mask) == Mask;
133+
}
134+
114135
bool verifyNumDescriptors(uint32_t NumDescriptors) {
115136
return NumDescriptors > 0;
116137
}

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +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-
StaticSamplers.size() * sizeof(dxbc::RTS0::v1::StaticSampler);
35+
size_t StaticSamplersSize = sizeof(dxbc::RTS0::v1::StaticSampler);
36+
if (Version > 2)
37+
StaticSamplersSize = sizeof(dxbc::RTS0::v3::StaticSampler);
3738

38-
return size_t(StaticSamplersOffset) + StaticSamplersSize;
39+
return size_t(StaticSamplersOffset) +
40+
(StaticSamplersSize * StaticSamplers.size());
3941
}
4042

4143
uint32_t RootSignatureDesc::computeRootParametersOffset() const {
@@ -171,6 +173,9 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
171173
support::endian::write(BOS, S.ShaderRegister, llvm::endianness::little);
172174
support::endian::write(BOS, S.RegisterSpace, llvm::endianness::little);
173175
support::endian::write(BOS, S.ShaderVisibility, llvm::endianness::little);
176+
177+
if (Version > 2)
178+
support::endian::write(BOS, S.Flags, llvm::endianness::little);
174179
}
175180
assert(Storage.size() == getSize());
176181
OS.write(Storage.data(), Storage.size());

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
343343
NewSampler.RegisterSpace = Param.RegisterSpace;
344344
NewSampler.ShaderVisibility = Param.ShaderVisibility;
345345

346+
if (RS.Version > 2)
347+
NewSampler.Flags = Param.getEncodedFlags();
348+
346349
RS.StaticSamplers.push_back(NewSampler);
347350
}
348351

0 commit comments

Comments
 (0)