diff options
| author | joaosaffran <joao.saffran@microsoft.com> | 2025-04-14 18:39:35 +0000 |
|---|---|---|
| committer | joaosaffran <joao.saffran@microsoft.com> | 2025-04-14 18:39:35 +0000 |
| commit | c0ac522ce0000f58092c99b66bc94150aed70122 (patch) | |
| tree | 6454ee52d9072b8ee407bad6df2a2c1467cc1de9 | |
| parent | 69869451be4e9e9ab4f6bdd9468ab02728670f29 (diff) | |
adding tests and changing parameter typeusers/joaosaffran/127840
11 files changed, 104 insertions, 77 deletions
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index 656ef864c947..561e4c1d1c63 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -167,12 +167,13 @@ private: public: RootSignature(StringRef PD) : PartData(PD) {} - Error parse(StringRef Data); + Error parse(); uint32_t getVersion() const { return Version; } uint32_t getNumParameters() const { return NumParameters; } uint32_t getRootParametersOffset() const { return RootParametersOffset; } uint32_t getNumStaticSamplers() const { return NumStaticSamplers; } uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; } + uint32_t getNumRootParameters() const { return ParametersHeaders.size(); } llvm::iterator_range<param_header_iterator> param_headers() const { return llvm::make_range(ParametersHeaders.begin(), ParametersHeaders.end()); } diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h index c57a87986501..393bba9c79bf 100644 --- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h +++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h @@ -82,8 +82,8 @@ struct RootConstantsYaml { }; struct RootParameterYamlDesc { - dxbc::RootParameterType Type; - dxbc::ShaderVisibility Visibility; + uint32_t Type; + uint32_t Visibility; uint32_t Offset; union { @@ -95,6 +95,8 @@ struct RootSignatureYamlDesc { RootSignatureYamlDesc() = default; uint32_t Version; + uint32_t NumRootParameters; + uint32_t RootParametersOffset; uint32_t NumStaticSamplers; uint32_t StaticSamplersOffset; @@ -224,8 +226,6 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision) -LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType) -LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibility) namespace llvm { diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 88e548267f97..77303edce1a4 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -97,7 +97,7 @@ Error DXContainer::parseRootSignature(StringRef Part) { if (RootSignature) return parseFailed("More than one RTS0 part is present in the file"); RootSignature = DirectX::RootSignature(Part); - if (Error Err = RootSignature->parse(Part)) + if (Error Err = RootSignature->parse()) return Err; return Error::success(); } @@ -242,12 +242,11 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) { IteratorState.Offset = Offset; } -Error DirectX::RootSignature::parse(StringRef Data) { - const char *Begin = Data.begin(); - const char *Current = Data.begin(); +Error DirectX::RootSignature::parse() { + const char *Current = PartData.begin(); // Root Signature headers expects 6 integers to be present. - if (Data.size() < 6 * sizeof(uint32_t)) + if (PartData.size() < 6 * sizeof(uint32_t)) return parseFailed( "Invalid root signature, insufficient space for header."); @@ -273,9 +272,9 @@ Error DirectX::RootSignature::parse(StringRef Data) { Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current); Current += sizeof(uint32_t); - assert(Current == Begin + RootParametersOffset); + assert(Current == PartData.begin() + RootParametersOffset); - ParametersHeaders.Data = Data.substr( + ParametersHeaders.Data = PartData.substr( RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader)); return Error::success(); diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 7d43e6c7f66b..d94347a94612 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -40,6 +40,8 @@ DXContainerYAML::RootSignatureYamlDesc::create( RootSigDesc.Version = Data.getVersion(); RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers(); RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset(); + RootSigDesc.NumRootParameters = Data.getNumRootParameters(); + RootSigDesc.RootParametersOffset = Data.getRootParametersOffset(); uint32_t Flags = Data.getFlags(); for (const auto &PH : Data.param_headers()) { @@ -51,13 +53,13 @@ DXContainerYAML::RootSignatureYamlDesc::create( return createStringError(std::errc::invalid_argument, "Invalid value for parameter type"); - NewP.Type = (dxbc::RootParameterType)PH.ParameterType; + NewP.Type = PH.ParameterType; if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility)) return createStringError(std::errc::invalid_argument, "Invalid value for shader visibility"); - NewP.Visibility = (dxbc::ShaderVisibility)PH.ShaderVisibility; + NewP.Visibility = PH.ShaderVisibility; llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr = Data.getParameter(PH); @@ -257,6 +259,8 @@ void MappingTraits<DXContainerYAML::Signature>::mapping( void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping( IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) { IO.mapRequired("Version", S.Version); + IO.mapRequired("NumRootParameters", S.NumRootParameters); + IO.mapRequired("RootParametersOffset", S.RootParametersOffset); IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers); IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset); IO.mapRequired("Parameters", S.Parameters); @@ -385,18 +389,6 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration( IO.enumCase(Value, E.Name.str().c_str(), E.Value); } -void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration( - IO &IO, dxbc::RootParameterType &Value) { - for (const auto &E : dxbc::getRootParameterTypes()) - IO.enumCase(Value, E.Name.str().c_str(), E.Value); -} - -void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration( - IO &IO, dxbc::ShaderVisibility &Value) { - for (const auto &E : dxbc::getShaderVisibility()) - IO.enumCase(Value, E.Name.str().c_str(), E.Value); -} - } // namespace yaml void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) { diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll index 1ca6ebb7ddab..e81679732a5d 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll @@ -22,6 +22,8 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: Size: 24 ; DXC-NEXT: RootSignature: ; DXC-NEXT: Version: 2 +; DXC-NEXT: NumRootParameters: 0 +; DXC-NEXT: RootParametersOffset: 24 ; DXC-NEXT: NumStaticSamplers: 0 ; DXC-NEXT: StaticSamplersOffset: 0 ; DXC-NEXT: Parameters: [] diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml index 0d7902afdaa6..831664de2c9d 100644 --- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml @@ -14,6 +14,8 @@ Parts: Size: 24 RootSignature: Version: 2 + NumRootParameters: 0 + RootParametersOffset: 24 NumStaticSamplers: 4 StaticSamplersOffset: 5 Parameters: [] @@ -24,6 +26,8 @@ Parts: # CHECK-NEXT: Size: 24 # CHECK-NEXT: RootSignature: # CHECK-NEXT: Version: 2 +# CHECK-NEXT: NumRootParameters: 0 +# CHECK-NEXT: RootParametersOffset: 24 # CHECK-NEXT: NumStaticSamplers: 0 # CHECK-NEXT: StaticSamplersOffset: 0 # CHECK-NEXT: Parameters: [] diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidType.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidType.yaml new file mode 100644 index 000000000000..091e70789d95 --- /dev/null +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidType.yaml @@ -0,0 +1,29 @@ +# RUN: yaml2obj %s -o %t +# RUN: not obj2yaml 2>&1 %t | FileCheck %s -DFILE=%t + +# CHECK: Error reading file: [[FILE]]: Invalid value for parameter type + + +--- !dxcontainer +Header: + Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] + Version: + Major: 1 + Minor: 0 + PartCount: 1 + PartOffsets: [ 60 ] +Parts: + - Name: RTS0 + Size: 80 + RootSignature: + Version: 2 + NumRootParameters: 2 + RootParametersOffset: 24 + NumStaticSamplers: 0 + StaticSamplersOffset: 64 + Parameters: + - ParameterType: 255 # INVALID + ShaderVisibility: 2 # Hull + AllowInputAssemblerInputLayout: true + DenyGeometryShaderRootAccess: true diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidVisibility.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidVisibility.yaml new file mode 100644 index 000000000000..1acaf6e4e08a --- /dev/null +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidVisibility.yaml @@ -0,0 +1,33 @@ +# RUN: yaml2obj %s -o %t +# RUN: not obj2yaml 2>&1 %t | FileCheck %s -DFILE=%t + +# CHECK: Error reading file: [[FILE]]: Invalid value for shader visibility + + +--- !dxcontainer +Header: + Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] + Version: + Major: 1 + Minor: 0 + PartCount: 1 + PartOffsets: [ 60 ] +Parts: + - Name: RTS0 + Size: 80 + RootSignature: + Version: 2 + NumRootParameters: 2 + RootParametersOffset: 24 + NumStaticSamplers: 0 + StaticSamplersOffset: 64 + Parameters: + - ParameterType: 1 # Constants32Bit + ShaderVisibility: 255 # INVALID + Constants: + Num32BitValues: 21 + ShaderRegister: 22 + RegisterSpace: 23 + AllowInputAssemblerInputLayout: true + DenyGeometryShaderRootAccess: true diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml index 8d5ab5c1b0b2..d6316765e42f 100644 --- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml @@ -14,17 +14,19 @@ Parts: Size: 80 RootSignature: Version: 2 + NumRootParameters: 2 + RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 64 Parameters: - - ParameterType: Constants32Bit - ShaderVisibility: Hull + - ParameterType: 1 # Constants32Bit + ShaderVisibility: 2 # Hull Constants: Num32BitValues: 16 ShaderRegister: 15 RegisterSpace: 14 - - ParameterType: Constants32Bit - ShaderVisibility: Geometry + - ParameterType: 1 # Constants32Bit + ShaderVisibility: 4 # Geometry Constants: Num32BitValues: 21 ShaderRegister: 22 @@ -36,17 +38,19 @@ Parts: # CHECK-NEXT: Size: 80 # CHECK-NEXT: RootSignature: # CHECK-NEXT: Version: 2 +# CHECK-NEXT: NumRootParameters: 2 +# CHECK-NEXT: RootParametersOffset: 24 # CHECK-NEXT: NumStaticSamplers: 0 # CHECK-NEXT: StaticSamplersOffset: 0 # CHECK-NEXT: Parameters: -# CHECK-NEXT: - ParameterType: Constants32Bit -# CHECK-NEXT: ShaderVisibility: Hull +# CHECK-NEXT: - ParameterType: 1 +# CHECK-NEXT: ShaderVisibility: 2 # CHECK-NEXT: Constants: # CHECK-NEXT: Num32BitValues: 16 # CHECK-NEXT: RegisterSpace: 14 # CHECK-NEXT: ShaderRegister: 15 -# CHECK-NEXT: - ParameterType: Constants32Bit -# CHECK-NEXT: ShaderVisibility: Geometry +# CHECK-NEXT: - ParameterType: 1 +# CHECK-NEXT: ShaderVisibility: 4 # CHECK-NEXT: Constants: # CHECK-NEXT: Num32BitValues: 21 # CHECK-NEXT: RegisterSpace: 23 diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp index e8c299f4d5c0..bf32c0795152 100644 --- a/llvm/unittests/Object/DXContainerTest.cpp +++ b/llvm/unittests/Object/DXContainerTest.cpp @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "llvm/Object/DXContainer.h" -#include "../../tools/obj2yaml/dxcontainer2yaml.cpp" #include "llvm/ADT/StringRef.h" #include "llvm/BinaryFormat/Magic.h" #include "llvm/ObjectYAML/DXContainerYAML.h" @@ -908,44 +907,4 @@ TEST(RootSignature, ParseRootConstant) { ASSERT_EQ(Constants->RegisterSpace, 14u); ASSERT_EQ(Constants->Num32BitValues, 16u); } - { - uint8_t Buffer[] = { - 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, - 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00}; - - SmallString<256> Storage; - raw_svector_ostream OS(Storage); - EXPECT_THAT_ERROR(dxcontainer2yaml(OS, getMemoryBuffer<133>(Buffer)), - FailedWithMessage("Invalid value for parameter type")); - } - { - uint8_t Buffer[] = { - 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, - 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00}; - - SmallString<256> Storage; - raw_svector_ostream OS(Storage); - EXPECT_THAT_ERROR(dxcontainer2yaml(OS, getMemoryBuffer<133>(Buffer)), - FailedWithMessage("Invalid value for shader visibility")); - } } diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp index 3e5b79be2ccf..99ca16188349 100644 --- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp +++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp @@ -127,6 +127,8 @@ TEST(RootSignature, ParseRootFlags) { Size: 24 RootSignature: Version: 2 + NumRootParameters: 0 + RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 0 Parameters: [] @@ -165,11 +167,13 @@ TEST(RootSignature, ParseRootConstants) { Size: 89 RootSignature: Version: 2 + NumRootParameters: 1 + RootParametersOffset: 24 NumStaticSamplers: 0 StaticSamplersOffset: 56 Parameters: - - ParameterType: Constants32Bit - ShaderVisibility: Hull + - ParameterType: 1 + ShaderVisibility: 2 Constants: Num32BitValues: 16 ShaderRegister: 15 |
