-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[DirectX] Updating DXContainer logic to read version 1.2 of static samplers #160184
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DirectX] Updating DXContainer logic to read version 1.2 of static samplers #160184
Conversation
…llvm-project into obj2yaml/root-signature-1.2
|
@llvm/pr-subscribers-objectyaml @llvm/pr-subscribers-llvm-binary-utilities Author: None (joaosaffran) ChangesThis PR is updating Full diff: https://github.com/llvm/llvm-project/pull/160184.diff 5 Files Affected:
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..bfb3837707f0a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -209,6 +209,12 @@ 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)) > 0;
+#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..7fec8addc8d52 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1200,4 +1200,49 @@ TEST(RootSignature, ParseStaticSamplers) {
ASSERT_EQ(Sampler.RegisterSpace, 32u);
ASSERT_EQ(Sampler.ShaderVisibility, 7u);
}
+ {
+ 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);
+ }
}
|
|
@llvm/pr-subscribers-backend-directx Author: None (joaosaffran) ChangesThis PR is updating Full diff: https://github.com/llvm/llvm-project/pull/160184.diff 5 Files Affected:
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..bfb3837707f0a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -209,6 +209,12 @@ 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)) > 0;
+#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..7fec8addc8d52 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1200,4 +1200,49 @@ TEST(RootSignature, ParseStaticSamplers) {
ASSERT_EQ(Sampler.RegisterSpace, 32u);
ASSERT_EQ(Sampler.ShaderVisibility, 7u);
}
+ {
+ 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);
+ }
}
|
inbelic
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, just some nits
| if (Version > 2) { | ||
| #define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \ | ||
| NewS.Enum = \ | ||
| (S.Flags & llvm::to_underlying(dxbc::StaticSamplerFlags::Enum)) > 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: I think the > 0 comparison is redundant
bogner
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM once @inbelic is happy with it
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
…mplers (llvm#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.
This PR is updating
Object/DXContainer.hso that we can read data from root signature version 1.2, which adds flags into static samplers.