Просмотр исходного кода

Added unit tests and fixed packing

Signed-off-by: Martin Winter <[email protected]>
Martin Winter 3 лет назад
Родитель
Сommit
914d1100cd

+ 4 - 2
src/AzslcUtils.h

@@ -746,11 +746,13 @@ namespace AZ::ShaderCompiler
 
         inline uint32_t PackedSizeof(int indexInAzslPredefined_Scalar)
         {
-            // the array is generated but it's expected to look like: {"bool", "double", "dword", "float", "half", "int", "uint", "unsigned int"}
+            // the array is generated but it's expected to look like: {"bool", "double", "dword", "float", "half", "int", "int32_t", "int64_t", "uint", "uint32_t", "uint64_t", "unsigned int"}
             // just update that code if it changes one day, the assert will pop.
-            if (indexInAzslPredefined_Scalar == 1)
+            if (indexInAzslPredefined_Scalar == 1 || indexInAzslPredefined_Scalar == 7 || indexInAzslPredefined_Scalar == 10)
             {
                 assert(string_view{"double"} == AZ::ShaderCompiler::Predefined::Scalar[1]);
+				assert(string_view{"int64_t"} == AZ::ShaderCompiler::Predefined::Scalar[7]);
+				assert(string_view{"uint64_t"} == AZ::ShaderCompiler::Predefined::Scalar[10]);
                 // Shader packing reference:
                 // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-packing-rules
                 return 8;

+ 8 - 0
tests/Advanced/srg-layouts-structs.azsl

@@ -27,6 +27,13 @@ ShaderResourceGroup ExampleSRG : ExampleBinding
         float  a;  // Offset  0
         float4 b;  // Offset 16
     };
+
+	struct U {
+		int32_t  a; // Offset 0
+		int64_t  b; // Offset 4
+		uint32_t c; // Offset 12
+		uint64_t d; // Offset 16
+	};
     
     // Note! dxc's SpirV generation has the following error:
     // fatal error: generated SPIR-V is invalid: Structure id 5 decorated as BufferBlock for variable 
@@ -43,6 +50,7 @@ ShaderResourceGroup ExampleSRG : ExampleBinding
         Sac      ac;           // Offset  64 (+32)
         S        s;            // Offset  80 (+16)
         float    a_float;      // Offset 112 (+32)
+		U        u;            // Offset 116/128 (+4/16)
     };
 
     T m_CB;

+ 42 - 8
tests/Advanced/srg-layouts.py

@@ -437,10 +437,27 @@ def verifyStructsPackingVulkan(thefile, compilerPath, silent):
         predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 112)
         predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"]   ==   4)
 
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"]      ==   "/ExampleSRG/m_CB")
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["typeName"]           ==   "/ExampleSRG/T")
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] ==   0)
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"]   == 128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"]      ==   "/ExampleSRG/U/a")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] ==   128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"]   ==   4)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["qualifiedName"]      ==   "/ExampleSRG/U/b")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] ==   132)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"]   ==   8)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["qualifiedName"]      ==   "/ExampleSRG/U/c")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] ==   140)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"]   ==   4)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["qualifiedName"]      ==   "/ExampleSRG/U/d")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] ==   144)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"]   ==   8)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["qualifiedName"]      ==   "/ExampleSRG/T/u") # Complex type
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["typeName"]           ==   "/ExampleSRG/U")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] ==   128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"]   ==  32)
+
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["qualifiedName"]      ==   "/ExampleSRG/m_CB")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["typeName"]           ==   "/ExampleSRG/T")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] ==   0)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"]   == 160)
 
         if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
         ok = testfuncs.verifyAllPredicates(predicates, j)
@@ -629,10 +646,27 @@ def verifyStructsPackingOpenGL(thefile, compilerPath, silent):
         predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 112)
         predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"]   ==   4)
 
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"]      ==   "/ExampleSRG/m_CB")
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["typeName"]           ==   "/ExampleSRG/T")
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] ==   0)
-        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"]   == 128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"]      ==   "/ExampleSRG/U/a")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] ==   116)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"]   ==   4)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["qualifiedName"]      ==   "/ExampleSRG/U/b")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] ==   120)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"]   ==   8)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["qualifiedName"]      ==   "/ExampleSRG/U/c")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] ==   128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"]   ==   4)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["qualifiedName"]      ==   "/ExampleSRG/U/d")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] ==   132)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"]   ==   8)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["qualifiedName"]      ==   "/ExampleSRG/T/u") # Complex type
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["typeName"]           ==   "/ExampleSRG/U")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] ==   128)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"]   ==  28)
+
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["qualifiedName"]      ==   "/ExampleSRG/m_CB")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["typeName"]           ==   "/ExampleSRG/T")
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] ==   0)
+        predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"]   == 160)
 
         if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
         ok = testfuncs.verifyAllPredicates(predicates, j)

+ 2 - 0
tests/Semantic/srg-constant-buffer.azsl

@@ -21,6 +21,8 @@ ShaderResourceGroupSemantic UpdateSrgTwo
 struct GlobalStruct
 {
     float4 m_diffuseColor;
+	uint64_t m_bitMask1;
+	uint64_t m_bitMask2;
 };
 
 ShaderResourceGroup MySRGTwo : UpdateSrgTwo

+ 1 - 0
tests/Syntax/function-signatures.azsl

@@ -6,3 +6,4 @@ MyT func5();
 MyT func6(MyT);
 MyT func7(MyT arg1);
 float4x4 func8(double arg1, float3x3 arg2, int, bool);
+uint64_t func9(int32_t arg1, int64_t arg2, uint32_t arg3, uint64_t arg4);

+ 10 - 0
tests/Syntax/srg-declaration-arrays.azsl

@@ -11,6 +11,14 @@ struct UserStruct
     bool     m_myBool;
 };
 
+struct IntegerTypesStruct
+{
+	int32_t m_int32;
+	uint32_t m_uint32;
+	int64_t m_int64;
+	uint64_t m_uint64;
+};
+
 ShaderResourceGroup PerEmpty : UpdatePerEmpty
 {
     Texture1D                                          m_texArray[4];
@@ -59,6 +67,8 @@ ShaderResourceGroup PerEmpty : UpdatePerEmpty
     RasterizerOrderedBuffer<int4>                      m_bufferView[4];
     RasterizerOrderedByteAddressBuffer                 m_bufferView[4];
     RasterizerOrderedStructuredBuffer<UserStruct>      m_bufferView[4];
+	RWStructuredBuffer<IntegerTypesStruct>             m_bufferView[4];
+	RWStructuredBuffer<uint64_t>                       m_bufferView[4];
 
     ConstantBuffer<UserStruct>                         m_materialConstants[4];
 };

+ 8 - 0
tests/Syntax/srg-declaration.azsl

@@ -89,6 +89,10 @@ ShaderResourceGroup PerBuffer : UpdatePerBuffer
     RasterizerOrderedBuffer<int4>                      m_bufferView;
     RasterizerOrderedByteAddressBuffer                 m_bufferView;
     RasterizerOrderedStructuredBuffer<UserStruct>      m_bufferView;
+	RWStructuredBuffer<int32_t>                       m_bufferView;
+	RWStructuredBuffer<uint32_t>                       m_bufferView;
+	RWStructuredBuffer<int64_t>                       m_bufferView;
+	RWStructuredBuffer<uint64_t>                       m_bufferView;
 };
 
 ShaderResourceGroup PerSampler : UpdatePerSampler
@@ -235,6 +239,8 @@ ShaderResourceGroup PerCB : UpdatePerCB
         half4x3                          m_sameNameVariable;
         half4x4                          m_sameNameVariable;
         int                              m_sameNameVariable;
+		int32_t                          m_sameNameVariable;
+		int64_t                          m_sameNameVariable;
         int1                             m_sameNameVariable;
         int2                             m_sameNameVariable;
         int3                             m_sameNameVariable;
@@ -256,6 +262,8 @@ ShaderResourceGroup PerCB : UpdatePerCB
         int4x3                           m_sameNameVariable;
         int4x4                           m_sameNameVariable;
         uint                             m_sameNameVariable;
+		uint32_t                         m_sameNameVariable;
+		uint64_t                         m_sameNameVariable;
         uint1                            m_sameNameVariable;
         uint2                            m_sameNameVariable;
         uint3                            m_sameNameVariable;

+ 4 - 2
tests/Syntax/srg-variables.azsl

@@ -6,6 +6,8 @@ ShaderResourceGroupSemantic UpdateFrequency
 // [Atom-614]
 ShaderResourceGroup ThatHasSRGConstants : UpdateFrequency
 {
-    int    m_srgConstInteger;
-	float4 m_srgConstFloat4;
+    int      m_srgConstInteger;
+	float4   m_srgConstFloat4;
+	int32_t  m_srgConstInteger32;
+	uint64_t m_srgConstUnsignedInteger64;
 };