summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoaosaffran <joao.saffran@microsoft.com>2025-04-14 18:39:35 +0000
committerjoaosaffran <joao.saffran@microsoft.com>2025-04-14 18:39:35 +0000
commitc0ac522ce0000f58092c99b66bc94150aed70122 (patch)
tree6454ee52d9072b8ee407bad6df2a2c1467cc1de9
parent69869451be4e9e9ab4f6bdd9468ab02728670f29 (diff)
adding tests and changing parameter typeusers/joaosaffran/127840
-rw-r--r--llvm/include/llvm/Object/DXContainer.h3
-rw-r--r--llvm/include/llvm/ObjectYAML/DXContainerYAML.h8
-rw-r--r--llvm/lib/Object/DXContainer.cpp13
-rw-r--r--llvm/lib/ObjectYAML/DXContainerYAML.cpp20
-rw-r--r--llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll2
-rw-r--r--llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml4
-rw-r--r--llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidType.yaml29
-rw-r--r--llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidVisibility.yaml33
-rw-r--r--llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml20
-rw-r--r--llvm/unittests/Object/DXContainerTest.cpp41
-rw-r--r--llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp8
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