Browse Source

Fix matrix HLInit for vector arg case from EmitHLSLFlatConversion

Tex Riddell 6 years ago
parent
commit
97dae4f708

+ 13 - 0
lib/HLSL/HLMatrixLowerPass.cpp

@@ -1463,6 +1463,19 @@ Value *HLMatrixLowerPass::lowerHLInit(CallInst *Call) {
   // Figure out the result type
   HLMatrixType MatTy = HLMatrixType::cast(Call->getType());
   VectorType *LoweredTy = MatTy.getLoweredVectorTypeForReg();
+
+  // Handle case where produced by EmitHLSLFlatConversion where there's one
+  // vector argument, instead of scalar arguments.
+  if (1 == Call->getNumArgOperands() - HLOperandIndex::kInitFirstArgOpIdx &&
+      Call->getArgOperand(HLOperandIndex::kInitFirstArgOpIdx)->
+              getType()->isVectorTy()) {
+    Value *LoweredVec = Call->getArgOperand(HLOperandIndex::kInitFirstArgOpIdx);
+    DXASSERT(LoweredTy->getNumElements() ==
+                LoweredVec->getType()->getVectorNumElements(),
+             "Invalid matrix init argument vector element count.");
+    return LoweredVec;
+  }
+
   DXASSERT(LoweredTy->getNumElements() == Call->getNumArgOperands() - HLOperandIndex::kInitFirstArgOpIdx,
     "Invalid matrix init argument count.");
 

+ 12 - 0
tools/clang/test/CodeGenHLSL/quick-test/mat_init_splat.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
+
+// CHECK: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float 1.000000e+00)
+
+struct MyStruct {
+  float3x3 mat;
+};
+
+float main() : OUT {
+  MyStruct st = (MyStruct)1;
+  return st.mat[0].x;
+}