ソースを参照

Set correct index number for mat cast subscript. (#2362)

Xiang Li 6 年 前
コミット
a66d6958e8

+ 3 - 0
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -6619,8 +6619,11 @@ Value *CGMSHLSLRuntime::EmitHLSLMatrixSubscript(CodeGenFunction &CGF,
 
   unsigned row, col;
   hlsl::GetHLSLMatRowColCount(Ty, row, col);
+  unsigned resultCol = col;
   if (Value *OriginPtr = GetOriginMatrixOperandAndUpdateMatSize(Ptr, row, col)) {
     Ptr = OriginPtr;
+    // Update col to result col to get correct result size.
+    col = resultCol;
   }
 
   // Lower mat[Idx] into real idx.

+ 28 - 0
tools/clang/test/CodeGenHLSL/batch/expressions/operators/matrices/mat_cast_sub_on_param.hlsl

@@ -0,0 +1,28 @@
+// RUN: %dxc /T ps_6_0 /E main %s | FileCheck %s
+
+// Make sure cast then subscript on parameter works.
+
+float4x4 a;
+float4x4 b;
+
+float3 mat_cast(float4x4 m) {
+  return ((float3x3)m)[0];
+}
+
+
+float3 main() :SV_Target {
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 0)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 1)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 2)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 4)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 5)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+  // CHECK:call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, {{.*}}, i32 6)
+  // CHECK:extractvalue %dx.types.CBufRet.f32 {{.*}}, 0
+
+  return mat_cast(a+b);
+}