Skip to content

Commit b6ac185

Browse files
committed
[HLSL][DirectX] update verifyRootDescriptorFlag to match the spec
1 parent 56ae9d9 commit b6ac185

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ bool verifyRootFlag(uint32_t Flags);
2727
bool verifyVersion(uint32_t Version);
2828
bool verifyRegisterValue(uint32_t RegisterValue);
2929
bool verifyRegisterSpace(uint32_t RegisterSpace);
30-
bool verifyDescriptorFlag(uint32_t Flags);
30+
bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal);
3131
bool verifyRangeType(uint32_t Type);
3232
bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
3333
uint32_t FlagsVal);

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,24 @@ bool verifyRegisterSpace(uint32_t RegisterSpace) {
3232
return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
3333
}
3434

35-
bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
35+
bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal) {
36+
using FlagT = dxbc::RootDescriptorFlags;
37+
FlagT Flags = FlagT(FlagsVal);
38+
if (Version == 1)
39+
return FlagsVal == FlagT::DataVolatile;
40+
41+
assert(Version == 2 && "Provided invalid root signature version");
42+
43+
// The data-specific flags are mutually exclusive.
44+
FlagT DataFlags = FlagT::DataVolatile | FlagT::DataStatic |
45+
FlagT::DataStaticWhileSetAtExecute;
46+
47+
if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
48+
return false;
49+
50+
// Only a data flag or no flags is valid
51+
return (FlagsVal & ~0xE) == 0;
52+
}
3653

3754
bool verifyRangeType(uint32_t Type) {
3855
switch (Type) {

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,8 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
432432
return reportValueError(Ctx, "RegisterSpace", Descriptor.RegisterSpace);
433433

434434
if (RSD.Version > 1) {
435-
if (!llvm::hlsl::rootsig::verifyDescriptorFlag(Descriptor.Flags))
435+
if (!llvm::hlsl::rootsig::verifyRootDescriptorFlag(RSD.Version,
436+
Descriptor.Flags))
436437
return reportValueError(Ctx, "DescriptorRangeFlag", Descriptor.Flags);
437438
}
438439
break;

0 commit comments

Comments
 (0)