| //===- DXContainerTest.cpp - Tests for DXContainerFile --------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/ADT/Twine.h" |
| #include "llvm/ObjectYAML/ObjectYAML.h" |
| #include "llvm/ObjectYAML/yaml2obj.h" |
| #include "llvm/Support/MemoryBufferRef.h" |
| #include "llvm/Support/YAMLTraits.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include "llvm/Testing/Support/Error.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| using namespace llvm::object; |
| |
| static bool convert(SmallVectorImpl<char> &Output, const char *YAML) { |
| raw_svector_ostream OS(Output); |
| yaml::Input YIn(YAML); |
| return convertYAML(YIn, OS, [](const Twine &Err) { errs() << Err; }); |
| } |
| |
| TEST(DXCFile, ParseEmptyParts) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
| 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 116 |
| PartCount: 7 |
| PartOffsets: [ 60, 68, 76, 84, 92, 100, 108 ] |
| Parts: |
| - Name: FKE0 |
| Size: 0 |
| - Name: FKE1 |
| Size: 0 |
| - Name: FKE2 |
| Size: 0 |
| - Name: FKE3 |
| Size: 0 |
| - Name: FKE4 |
| Size: 0 |
| - Name: FKE5 |
| Size: 0 |
| - Name: FKE6 |
| Size: 0 |
| ... |
| )")); |
| |
| // Result |
| char 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, |
| 0x74, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, |
| 0x44, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, |
| 0x5C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, |
| 0x46, 0x4B, 0x45, 0x30, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x31, |
| 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x32, 0x00, 0x00, 0x00, 0x00, |
| 0x46, 0x4B, 0x45, 0x33, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x34, |
| 0x00, 0x00, 0x00, 0x00, 0x46, 0x4B, 0x45, 0x35, 0x00, 0x00, 0x00, 0x00, |
| 0x46, 0x4B, 0x45, 0x36, 0x00, 0x00, 0x00, 0x00, |
| }; |
| |
| EXPECT_EQ(Storage.size(), 116u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 116) == 0); |
| |
| Storage.clear(); |
| |
| // Next, read the same file without the part offsets or file size. Both cases |
| // should result in the same final output. |
| ASSERT_TRUE(convert(Storage, R"(--- !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: 7 |
| Parts: |
| - Name: FKE0 |
| Size: 0 |
| - Name: FKE1 |
| Size: 0 |
| - Name: FKE2 |
| Size: 0 |
| - Name: FKE3 |
| Size: 0 |
| - Name: FKE4 |
| Size: 0 |
| - Name: FKE5 |
| Size: 0 |
| - Name: FKE6 |
| Size: 0 |
| ... |
| )")); |
| |
| EXPECT_EQ(Storage.size(), 116u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 116) == 0); |
| } |
| |
| TEST(RootSignature, ParseRootFlags) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 68 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 24 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 0 |
| RootParametersOffset: 24 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 0 |
| Parameters: [] |
| AllowInputAssemblerInputLayout: true |
| )")); |
| |
| 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, |
| 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, |
| 0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| }; |
| |
| EXPECT_EQ(Storage.size(), 68u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0); |
| } |
| |
| TEST(RootSignature, HeaderData) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 1 |
| RootParametersOffset: 255 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 0 |
| Parameters: |
| - ParameterType: 1 |
| ShaderVisibility: 2 |
| Constants: |
| Num32BitValues: 16 |
| ShaderRegister: 15 |
| RegisterSpace: 14 |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 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}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseRootConstants) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 1 |
| RootParametersOffset: 36 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 0 |
| Parameters: |
| - ParameterType: 1 |
| ShaderVisibility: 2 |
| Constants: |
| Num32BitValues: 16 |
| ShaderRegister: 15 |
| RegisterSpace: 14 |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 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}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseRootDescriptorsV10) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 1 |
| NumRootParameters: 1 |
| RootParametersOffset: 24 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 60 |
| Parameters: |
| - ParameterType: 2 # SRV |
| ShaderVisibility: 3 # Domain |
| Descriptor: |
| ShaderRegister: 31 |
| RegisterSpace: 32 |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, 0x01, 0x00, 0x00, 0x00, |
| 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
| 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, |
| 0x20, 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, 0x00, 0x00, 0x00, |
| 0x00}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseRootDescriptorsV11) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 1 |
| RootParametersOffset: 24 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 60 |
| Parameters: |
| - ParameterType: 2 # SRV |
| ShaderVisibility: 3 # Domain |
| Descriptor: |
| ShaderRegister: 31 |
| RegisterSpace: 32 |
| DATA_STATIC_WHILE_SET_AT_EXECUTE: true |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, |
| 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
| 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, |
| 0x20, 0x00, 0x00, 0x00, 0x04, 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}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseDescriptorTableV10) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 1 |
| NumRootParameters: 1 |
| RootParametersOffset: 24 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 60 |
| Parameters: |
| - ParameterType: 0 # SRV |
| ShaderVisibility: 3 # Domain |
| Table: |
| NumRanges: 1 |
| Ranges: |
| - RangeType: 0 |
| NumDescriptors: 41 |
| BaseShaderRegister: 42 |
| RegisterSpace: 43 |
| OffsetInDescriptorsFromTableStart: 44 |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, 0x01, 0x00, 0x00, 0x00, |
| 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, |
| 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 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}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseDescriptorTableV11) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer |
| Header: |
| Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, |
| 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ] |
| Version: |
| Major: 1 |
| Minor: 0 |
| FileSize: 133 |
| PartCount: 1 |
| PartOffsets: [ 36 ] |
| Parts: |
| - Name: RTS0 |
| Size: 89 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 1 |
| RootParametersOffset: 24 |
| NumStaticSamplers: 0 |
| StaticSamplersOffset: 60 |
| Parameters: |
| - ParameterType: 0 # Descriptor Table |
| ShaderVisibility: 3 # Domain |
| Table: |
| NumRanges: 1 |
| Ranges: |
| - RangeType: 0 |
| NumDescriptors: -1 |
| BaseShaderRegister: 42 |
| RegisterSpace: 43 |
| OffsetInDescriptorsFromTableStart: 41 |
| DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, |
| 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, |
| 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, |
| 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00}; |
| |
| EXPECT_EQ(Storage.size(), 133u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0); |
| } |
| |
| TEST(RootSignature, ParseStaticSamplers) { |
| SmallString<128> Storage; |
| |
| // First read a fully explicit yaml with all sizes and offsets provided |
| ASSERT_TRUE(convert(Storage, R"(--- !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: 76 |
| RootSignature: |
| Version: 2 |
| NumRootParameters: 0 |
| RootParametersOffset: 0 |
| NumStaticSamplers: 1 |
| StaticSamplersOffset: 24 |
| Parameters: [] |
| Samplers: |
| - Filter: 10 |
| AddressU: 1 |
| AddressV: 2 |
| AddressW: 5 |
| MipLODBias: 1.23 |
| MaxAnisotropy: 20 |
| ComparisonFunc: 4 |
| BorderColor: 0 |
| MinLOD: 4.56 |
| MaxLOD: 8.90 |
| ShaderRegister: 31 |
| RegisterSpace: 32 |
| ShaderVisibility: 7 |
| AllowInputAssemblerInputLayout: true |
| DenyGeometryShaderRootAccess: true |
| )")); |
| |
| 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, 0x02, 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}; |
| |
| EXPECT_EQ(Storage.size(), 144u); |
| EXPECT_TRUE(memcmp(Buffer, Storage.data(), 144u) == 0); |
| } |