2
0
Эх сурвалжийг харах

Fix library cbuffer reflection for matrix array Elements count (#2513)

Tex Riddell 5 жил өмнө
parent
commit
ee534ef3a1

+ 7 - 1
lib/HLSL/DxilContainerReflection.cpp

@@ -28,6 +28,7 @@
 #include "dxc/DXIL/DxilFunctionProps.h"
 #include "dxc/DXIL/DxilPDB.h"
 #include "dxc/DXIL/DxilUtil.h"
+#include "dxc/HLSL/HLMatrixType.h"
 
 #include <unordered_set>
 #include "llvm/ADT/SetVector.h"
@@ -848,7 +849,12 @@ HRESULT CShaderReflectionType::Initialize(
     // We might have an array of matrices, though, so we only exit if
     // the field annotation says we have a matrix, and we've bottomed
     // out and the element type isn't itself an array.
-    if(typeAnnotation.HasMatrixAnnotation() && !elementType->isArrayTy())
+    //
+    // For libraries however, we may have unlowered matrix types, so
+    // we have to check for HLMatrixType so we don't skip counting the
+    // inner-most matrix array size.
+    if(typeAnnotation.HasMatrixAnnotation() && !elementType->isArrayTy() &&
+       !HLMatrixType::isa(elementType))
     {
       break;
     }

+ 104 - 0
tools/clang/test/HLSLFileCheck/d3dreflect/lib_cb_matrix_array.hlsl

@@ -0,0 +1,104 @@
+// RUN: %dxc -T lib_6_5 %s | %D3DReflect %s | FileCheck %s
+
+cbuffer SomeBuffer : register(b0)
+{
+    float4 Color;
+    float4 VectorArray[3];
+    float FloatArray[16];
+    float4x4 MatrixArray[2];
+};
+
+RWTexture2D<float4> g_Output;
+
+[shader("raygeneration")]
+void RayGenShader()
+{
+    uint2 LaunchIndex = DispatchRaysIndex().xy;
+    uint2 LaunchDim = DispatchRaysDimensions().xy;
+
+    float4x4 m0 = MatrixArray[0];
+    float4x4 m1 = MatrixArray[1];
+    g_Output[LaunchIndex] = Color * m0[0][0] * m1[0][0] * VectorArray[1] * FloatArray[2];
+}
+
+// CHECK: ID3D12LibraryReflection:
+// CHECK:     FunctionCount: 1
+// CHECK-NEXT:   ID3D12FunctionReflection:
+// CHECK-NEXT:     D3D12_FUNCTION_DESC: Name: \01?RayGenShader@@YAXXZ
+// CHECK-NEXT:       Shader Version: RayGeneration 6.5
+// CHECK:       ConstantBuffers: 1
+// CHECK-NEXT:       BoundResources: 2
+// CHECK-NEXT:       FunctionParameterCount: 0
+// CHECK-NEXT:       HasReturn: FALSE
+// CHECK-NEXT:     Constant Buffers:
+// CHECK-NEXT:       ID3D12ShaderReflectionConstantBuffer:
+// CHECK-NEXT:         D3D12_SHADER_BUFFER_DESC: Name: SomeBuffer
+// CHECK-NEXT:           Type: D3D_CT_CBUFFER
+// CHECK-NEXT:           Size: 448
+// CHECK-NEXT:           uFlags: 0
+// CHECK-NEXT:           Num Variables: 4
+// CHECK-NEXT:         {
+// CHECK-NEXT:           ID3D12ShaderReflectionVariable:
+// CHECK-NEXT:             D3D12_SHADER_VARIABLE_DESC: Name: Color
+// CHECK-NEXT:               Size: 16
+// CHECK-NEXT:               StartOffset: 0
+// CHECK-NEXT:               uFlags: 0x2
+// CHECK-NEXT:               DefaultValue: <nullptr>
+// CHECK-NEXT:             ID3D12ShaderReflectionType:
+// CHECK-NEXT:               D3D12_SHADER_TYPE_DESC: Name: float4
+// CHECK-NEXT:                 Class: D3D_SVC_VECTOR
+// CHECK-NEXT:                 Type: D3D_SVT_FLOAT
+// CHECK-NEXT:                 Elements: 0
+// CHECK-NEXT:                 Rows: 1
+// CHECK-NEXT:                 Columns: 4
+// CHECK-NEXT:                 Members: 0
+// CHECK-NEXT:                 Offset: 0
+// CHECK-NEXT:             CBuffer: SomeBuffer
+// CHECK-NEXT:           ID3D12ShaderReflectionVariable:
+// CHECK-NEXT:             D3D12_SHADER_VARIABLE_DESC: Name: VectorArray
+// CHECK-NEXT:               Size: 48
+// CHECK-NEXT:               StartOffset: 16
+// CHECK-NEXT:               uFlags: 0x2
+// CHECK-NEXT:               DefaultValue: <nullptr>
+// CHECK-NEXT:             ID3D12ShaderReflectionType:
+// CHECK-NEXT:               D3D12_SHADER_TYPE_DESC: Name: float4
+// CHECK-NEXT:                 Class: D3D_SVC_VECTOR
+// CHECK-NEXT:                 Type: D3D_SVT_FLOAT
+// CHECK-NEXT:                 Elements: 3
+// CHECK-NEXT:                 Rows: 1
+// CHECK-NEXT:                 Columns: 4
+// CHECK-NEXT:                 Members: 0
+// CHECK-NEXT:                 Offset: 0
+// CHECK-NEXT:             CBuffer: SomeBuffer
+// CHECK-NEXT:           ID3D12ShaderReflectionVariable:
+// CHECK-NEXT:             D3D12_SHADER_VARIABLE_DESC: Name: FloatArray
+// CHECK-NEXT:               Size: 244
+// CHECK-NEXT:               StartOffset: 64
+// CHECK-NEXT:               uFlags: 0x2
+// CHECK-NEXT:               DefaultValue: <nullptr>
+// CHECK-NEXT:             ID3D12ShaderReflectionType:
+// CHECK-NEXT:               D3D12_SHADER_TYPE_DESC: Name: float
+// CHECK-NEXT:                 Class: D3D_SVC_SCALAR
+// CHECK-NEXT:                 Type: D3D_SVT_FLOAT
+// CHECK-NEXT:                 Elements: 16
+// CHECK-NEXT:                 Rows: 1
+// CHECK-NEXT:                 Columns: 1
+// CHECK-NEXT:                 Members: 0
+// CHECK-NEXT:                 Offset: 0
+// CHECK-NEXT:             CBuffer: SomeBuffer
+// CHECK-NEXT:           ID3D12ShaderReflectionVariable:
+// CHECK-NEXT:             D3D12_SHADER_VARIABLE_DESC: Name: MatrixArray
+// CHECK-NEXT:               Size: 128
+// CHECK-NEXT:               StartOffset: 320
+// CHECK-NEXT:               uFlags: 0x2
+// CHECK-NEXT:               DefaultValue: <nullptr>
+// CHECK-NEXT:             ID3D12ShaderReflectionType:
+// CHECK-NEXT:               D3D12_SHADER_TYPE_DESC: Name: float4x4
+// CHECK-NEXT:                 Class: D3D_SVC_MATRIX_COLUMNS
+// CHECK-NEXT:                 Type: D3D_SVT_FLOAT
+// CHECK-NEXT:                 Elements: 2
+// CHECK-NEXT:                 Rows: 4
+// CHECK-NEXT:                 Columns: 4
+// CHECK-NEXT:                 Members: 0
+// CHECK-NEXT:                 Offset: 0
+// CHECK-NEXT:             CBuffer: SomeBuffer