[llvm] 4ff986a - [DirectX] Updating DXContainer logic to read version 1.2 of static samplers (#160184)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 26 10:07:49 PDT 2025
Author: joaosaffran
Date: 2025-09-26T17:07:45Z
New Revision: 4ff986af637f76117b5e70190f144fe7ce10533e
URL: https://github.com/llvm/llvm-project/commit/4ff986af637f76117b5e70190f144fe7ce10533e
DIFF: https://github.com/llvm/llvm-project/commit/4ff986af637f76117b5e70190f144fe7ce10533e.diff
LOG: [DirectX] Updating DXContainer logic to read version 1.2 of static samplers (#160184)
This PR is updating `Object/DXContainer.h` so that we can read data from
root signature version 1.2, which adds flags into static samplers.
Added:
llvm/test/ObjectYAML/DXContainer/RootSignature-StaticSamplers1.3.yaml
Modified:
llvm/include/llvm/Object/DXContainer.h
llvm/lib/Object/DXContainer.cpp
llvm/lib/ObjectYAML/DXContainerYAML.cpp
llvm/unittests/Object/DXContainerTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 9bc1918852335..5a5a4dbaae2ad 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -228,11 +228,11 @@ class RootSignature {
uint32_t Flags;
ViewArray<dxbc::RTS0::v1::RootParameterHeader> ParametersHeaders;
StringRef PartData;
- ViewArray<dxbc::RTS0::v1::StaticSampler> StaticSamplers;
+ ViewArray<dxbc::RTS0::v3::StaticSampler> StaticSamplers;
using param_header_iterator =
ViewArray<dxbc::RTS0::v1::RootParameterHeader>::iterator;
- using samplers_iterator = ViewArray<dxbc::RTS0::v1::StaticSampler>::iterator;
+ using samplers_iterator = ViewArray<dxbc::RTS0::v3::StaticSampler>::iterator;
public:
RootSignature(StringRef PD) : PartData(PD) {}
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 031b9414f4c1a..7b7b8d88c63fc 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -276,10 +276,13 @@ Error DirectX::RootSignature::parse() {
RootParametersOffset,
NumParameters * sizeof(dxbc::RTS0::v1::RootParameterHeader));
- StaticSamplers.Stride = sizeof(dxbc::RTS0::v1::StaticSampler);
- StaticSamplers.Data = PartData.substr(
- StaticSamplersOffset,
- NumStaticSamplers * sizeof(dxbc::RTS0::v1::StaticSampler));
+ StaticSamplers.Stride = (Version <= 2)
+ ? sizeof(dxbc::RTS0::v1::StaticSampler)
+ : sizeof(dxbc::RTS0::v3::StaticSampler);
+
+ StaticSamplers.Data = PartData.substr(StaticSamplersOffset,
+ static_cast<size_t>(NumStaticSamplers) *
+ StaticSamplers.Stride);
return Error::success();
}
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 42074731c4e16..3c09ae4e5f2bc 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -209,6 +209,11 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewS.RegisterSpace = S.RegisterSpace;
NewS.ShaderVisibility = dxbc::ShaderVisibility(S.ShaderVisibility);
+ if (Version > 2) {
+#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
+ NewS.Enum = (S.Flags & llvm::to_underlying(dxbc::StaticSamplerFlags::Enum));
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+ }
RootSigDesc.StaticSamplers.push_back(NewS);
}
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-StaticSamplers1.3.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-StaticSamplers1.3.yaml
new file mode 100644
index 0000000000000..1623b05def009
--- /dev/null
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-StaticSamplers1.3.yaml
@@ -0,0 +1,65 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !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: 3
+ NumRootParameters: 0
+ RootParametersOffset: 24
+ NumStaticSamplers: 1
+ StaticSamplersOffset: 24
+ Parameters: []
+ Samplers:
+ - Filter: MinLinearMagMipPoint
+ AddressU: Wrap
+ AddressV: Mirror
+ AddressW: MirrorOnce
+ MipLODBias: 1.23
+ MaxAnisotropy: 20
+ ComparisonFunc: LessEqual
+ BorderColor: TransparentBlack
+ MinLOD: 4.56
+ MaxLOD: 8.90
+ ShaderRegister: 31
+ RegisterSpace: 32
+ ShaderVisibility: Mesh
+ SAMPLER_FLAG_UINT_BORDER_COLOR: true
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+
+#CHECK: - Name: RTS0
+#CHECK-NEXT: Size: 80
+#CHECK-NEXT: RootSignature:
+#CHECK-NEXT: Version: 3
+#CHECK-NEXT: NumRootParameters: 0
+#CHECK-NEXT: RootParametersOffset: 24
+#CHECK-NEXT: NumStaticSamplers: 1
+#CHECK-NEXT: StaticSamplersOffset: 24
+#CHECK-NEXT: Parameters: []
+#CHECK-NEXT: Samplers:
+#CHECK-NEXT: - Filter: MinLinearMagMipPoint
+#CHECK-NEXT: AddressU: Wrap
+#CHECK-NEXT: AddressV: Mirror
+#CHECK-NEXT: AddressW: MirrorOnce
+#CHECK-NEXT: MipLODBias: 1.23
+#CHECK-NEXT: MaxAnisotropy: 20
+#CHECK-NEXT: ComparisonFunc: LessEqual
+#CHECK-NEXT: BorderColor: TransparentBlack
+#CHECK-NEXT: MinLOD: 4.56
+#CHECK-NEXT: MaxLOD: 8.9
+#CHECK-NEXT: ShaderRegister: 31
+#CHECK-NEXT: RegisterSpace: 32
+#CHECK-NEXT: ShaderVisibility: Mesh
+#CHECK-NEXT: SAMPLER_FLAG_UINT_BORDER_COLOR: true
+#CHECK-NEXT: AllowInputAssemblerInputLayout: true
+#CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 396d060a75bfd..d6f7b26b99cd7 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1200,4 +1200,52 @@ TEST(RootSignature, ParseStaticSamplers) {
ASSERT_EQ(Sampler.RegisterSpace, 32u);
ASSERT_EQ(Sampler.ShaderVisibility, 7u);
}
+ {
+ // this is testing static sampler parsing for root signature version 1.2,
+ // it changes: the version number, the size of root signature being emitted
+ // and the values for flag fields.
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 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,
+ 0x52, 0x54, 0x53, 0x30, 0x4c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0xa4, 0x70, 0x9d, 0x3f, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x85, 0xeb, 0x91, 0x40, 0x66, 0x66, 0x0e, 0x41,
+ 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00};
+ DXContainer C =
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<148>(Buffer)));
+
+ auto MaybeRS = C.getRootSignature();
+ ASSERT_TRUE(MaybeRS.has_value());
+ const auto &RS = MaybeRS.value();
+ ASSERT_EQ(RS.getVersion(), 3U);
+ ASSERT_EQ(RS.getNumParameters(), 0U);
+ ASSERT_EQ(RS.getRootParametersOffset(), 0U);
+ ASSERT_EQ(RS.getNumStaticSamplers(), 1U);
+ ASSERT_EQ(RS.getStaticSamplersOffset(), 24U);
+ ASSERT_EQ(RS.getFlags(), 17U);
+
+ auto Sampler = *RS.samplers().begin();
+
+ ASSERT_EQ(Sampler.Filter, 10U);
+ ASSERT_EQ(Sampler.AddressU, 1U);
+ ASSERT_EQ(Sampler.AddressV, 2U);
+ ASSERT_EQ(Sampler.AddressW, 5U);
+ ASSERT_FLOAT_EQ(Sampler.MipLODBias, 1.23F);
+ ASSERT_EQ(Sampler.MaxAnisotropy, 20U);
+ ASSERT_EQ(Sampler.ComparisonFunc, 4U);
+ ASSERT_EQ(Sampler.BorderColor, 0U);
+ ASSERT_FLOAT_EQ(Sampler.MinLOD, 4.56F);
+ ASSERT_FLOAT_EQ(Sampler.MaxLOD, 8.9F);
+ ASSERT_EQ(Sampler.ShaderRegister, 31U);
+ ASSERT_EQ(Sampler.RegisterSpace, 32U);
+ ASSERT_EQ(Sampler.ShaderVisibility, 7U);
+ ASSERT_EQ(Sampler.Flags, 1U);
+ }
}
More information about the llvm-commits
mailing list