|
11 | 11 | #include "llvm/BinaryFormat/Magic.h" |
12 | 12 | #include "llvm/ObjectYAML/DXContainerYAML.h" |
13 | 13 | #include "llvm/ObjectYAML/yaml2obj.h" |
| 14 | +#include "llvm/Support/Error.h" |
14 | 15 | #include "llvm/Support/MemoryBufferRef.h" |
15 | 16 | #include "llvm/Testing/Support/Error.h" |
16 | 17 | #include "gtest/gtest.h" |
@@ -824,38 +825,52 @@ TEST(DXCFile, MalformedSignature) { |
824 | 825 |
|
825 | 826 | TEST(RootSignature, MalformedData) { |
826 | 827 | { |
827 | | - // RootParametersOffset is 255. |
| 828 | + // Root Parameters offset has changed to 36, additional padding was added, |
| 829 | + // as well as fixing the parameter offset. |
828 | 830 | uint8_t Buffer[] = { |
829 | 831 | 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, |
830 | 832 | 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, |
831 | 833 | 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, |
832 | 834 | 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
833 | | - 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
834 | | - 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
835 | | - 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, |
| 835 | + 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 836 | + 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 837 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 838 | + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, |
836 | 839 | 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
837 | 840 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
838 | 841 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
839 | 842 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
840 | 843 | 0x00}; |
| 844 | + |
841 | 845 | DXContainer C = |
842 | | - llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer))); |
| 846 | + llvm::cantFail(DXContainer::create(getMemoryBuffer<144>(Buffer))); |
843 | 847 |
|
844 | 848 | auto MaybeRS = C.getRootSignature(); |
845 | 849 | ASSERT_TRUE(MaybeRS.has_value()); |
846 | 850 | const auto &RS = MaybeRS.value(); |
847 | 851 | ASSERT_EQ(RS.getVersion(), 2u); |
848 | 852 | ASSERT_EQ(RS.getNumParameters(), 1u); |
849 | | - ASSERT_EQ(RS.getRootParametersOffset(), 255u); |
| 853 | + ASSERT_EQ(RS.getRootParametersOffset(), 36u); |
850 | 854 | ASSERT_EQ(RS.getNumStaticSamplers(), 0u); |
851 | 855 | ASSERT_EQ(RS.getStaticSamplersOffset(), 44u); |
852 | 856 | ASSERT_EQ(RS.getFlags(), 17u); |
853 | 857 |
|
854 | | - // Since the offset is wrong, the data becomes invalid. |
855 | 858 | auto RootParam = *RS.param_headers().begin(); |
| 859 | + ASSERT_EQ((unsigned)RootParam.ParameterType, 1u); |
| 860 | + ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 2u); |
856 | 861 | auto ParamView = RS.getParameter(RootParam); |
857 | | - ASSERT_THAT_ERROR(ParamView.takeError(), |
858 | | - FailedWithMessage("invalid parameter type")); |
| 862 | + ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); |
| 863 | + |
| 864 | + DirectX::RootConstantView *RootConstantsView = |
| 865 | + dyn_cast<DirectX::RootConstantView>(&*ParamView); |
| 866 | + ASSERT_TRUE(RootConstantsView != nullptr); |
| 867 | + auto Constants = RootConstantsView->read(); |
| 868 | + |
| 869 | + ASSERT_THAT_ERROR(Constants.takeError(), Succeeded()); |
| 870 | + |
| 871 | + ASSERT_EQ(Constants->ShaderRegister, 15u); |
| 872 | + ASSERT_EQ(Constants->RegisterSpace, 14u); |
| 873 | + ASSERT_EQ(Constants->Num32BitValues, 16u); |
859 | 874 | } |
860 | 875 | } |
861 | 876 |
|
|
0 commit comments