[spirv] Add support for casting from floatM to floatMx1 (#3905)
Fixes #3893
This commit is contained in:
Родитель
5d63d48f44
Коммит
5dc5e42c8d
|
@ -2567,9 +2567,9 @@ SpirvInstruction *SpirvEmitter::doCastExpr(const CastExpr *expr) {
|
|||
return doExpr(subExpr);
|
||||
}
|
||||
case CastKind::CK_HLSLVectorToMatrixCast: {
|
||||
// If target type is already an 1xN matrix type, we just return the
|
||||
// If target type is already an 1xN or Mx1 matrix type, we just return the
|
||||
// underlying vector.
|
||||
if (is1xNMatrix(toType))
|
||||
if (is1xNMatrix(toType) || isMx1Matrix(toType))
|
||||
return doExpr(subExpr);
|
||||
|
||||
// A vector can have no more than 4 elements. The only remaining case
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// Run: %dxc -T ps_6_0 -E main
|
||||
|
||||
float4 main(float4 input : A) : SV_Target {
|
||||
// CHECK: [[vec:%\d+]] = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
|
||||
// CHECK: OpStore %var1 [[vec]]
|
||||
float4 var1 = float4(1,2,3,4);
|
||||
|
||||
// CHECK-NEXT: [[vec1:%\d+]] = OpLoad %v4float %var1
|
||||
// CHECK-NEXT: OpStore %var2 [[vec1]]
|
||||
float4x1 var2 = var1;
|
||||
|
||||
// CHECK-NEXT: [[vec2:%\d+]] = OpLoad %v4float %input
|
||||
// CHECK-NEXT: OpStore %var3 [[vec2]]
|
||||
float1x4 var3 = input;
|
||||
|
||||
// CHECK-NEXT: [[vec3:%\d+]] = OpLoad %v4float %input
|
||||
// CHECK-NEXT: OpStore %var4 [[vec3]]
|
||||
float4x1 var4 = input;
|
||||
|
||||
return input;
|
||||
}
|
|
@ -478,6 +478,9 @@ TEST_F(FileTest, CastFlatConversionDecomposeVector) {
|
|||
TEST_F(FileTest, CastExplicitVecToMat) {
|
||||
runFileTest("cast.vec-to-mat.explicit.hlsl");
|
||||
}
|
||||
TEST_F(FileTest, CastImplicitVecToMat) {
|
||||
runFileTest("cast.vec-to-mat.implicit.hlsl");
|
||||
}
|
||||
TEST_F(FileTest, CastMatrixToVector) { runFileTest("cast.mat-to-vec.hlsl"); }
|
||||
TEST_F(FileTest, CastBitwidth) { runFileTest("cast.bitwidth.hlsl"); }
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче