Use writeComposite to vectorize scalars.

`writeComposite` can write and deduplicate constants, so it's preferable
to manually emitting an OpCompositeConstruct opcode.

Change-Id: Ie5c23af76822da762eadac8ff0ab0c6cc0febd31
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/528637
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2022-04-07 22:25:04 -04:00 committed by SkCQ
parent 699dd5ae4a
commit 89bdf0f872
6 changed files with 557 additions and 591 deletions

View File

@ -2409,16 +2409,9 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs,
break; break;
} }
} }
// promote number to vector // Vectorize the right-hand side.
const Type& vecType = leftType; std::vector<SpvId> arguments(/*count*/ leftType.columns(), /*value*/ rhs);
SpvId vec = this->nextId(&vecType); rhs = this->writeComposite(arguments, leftType, out);
this->writeOpCode(SpvOpCompositeConstruct, 3 + vecType.columns(), out);
this->writeWord(this->getType(vecType), out);
this->writeWord(vec, out);
for (int i = 0; i < vecType.columns(); i++) {
this->writeWord(rhs, out);
}
rhs = vec;
operandType = &leftType; operandType = &leftType;
} else if (rightType.isVector() && leftType.isNumber()) { } else if (rightType.isVector() && leftType.isNumber()) {
if (resultType.componentType().isFloat()) { if (resultType.componentType().isFloat()) {
@ -2429,16 +2422,9 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs,
return result; return result;
} }
} }
// promote number to vector // Vectorize the left-hand side.
const Type& vecType = rightType; std::vector<SpvId> arguments(/*count*/ rightType.columns(), /*value*/ lhs);
SpvId vec = this->nextId(&vecType); lhs = this->writeComposite(arguments, rightType, out);
this->writeOpCode(SpvOpCompositeConstruct, 3 + vecType.columns(), out);
this->writeWord(this->getType(vecType), out);
this->writeWord(vec, out);
for (int i = 0; i < vecType.columns(); i++) {
this->writeWord(lhs, out);
}
lhs = vec;
operandType = &rightType; operandType = &rightType;
} else if (leftType.isMatrix()) { } else if (leftType.isMatrix()) {
if (op.kind() == Operator::Kind::STAR) { if (op.kind() == Operator::Kind::STAR) {

View File

@ -43,6 +43,7 @@ OpDecorate %30 RelaxedPrecision
%int = OpTypeInt 32 1 %int = OpTypeInt 32 1
%int_0 = OpConstant %int 0 %int_0 = OpConstant %int 0
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%24 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%int_1 = OpConstant %int 1 %int_1 = OpConstant %int 1
%main = OpFunction %void None %14 %main = OpFunction %void None %14
%15 = OpLabel %15 = OpLabel
@ -50,7 +51,6 @@ OpDecorate %30 RelaxedPrecision
%20 = OpLoad %v4float %16 %20 = OpLoad %v4float %16
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0 %22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%23 = OpLoad %v4float %22 %23 = OpLoad %v4float %22
%24 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%25 = OpFSub %v4float %24 %23 %25 = OpFSub %v4float %24 %23
%26 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1 %26 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%28 = OpLoad %v4float %26 %28 = OpLoad %v4float %26

View File

@ -65,6 +65,7 @@ OpDecorate %221 RelaxedPrecision
%int_0 = OpConstant %int 0 %int_0 = OpConstant %int 0
%float_100 = OpConstant %float 100 %float_100 = OpConstant %float 100
%float_200 = OpConstant %float 200 %float_200 = OpConstant %float 200
%38 = OpConstantComposite %v4float %float_200 %float_200 %float_200 %float_200
%uint_100 = OpConstant %uint 100 %uint_100 = OpConstant %uint 100
%uint_200 = OpConstant %uint 200 %uint_200 = OpConstant %uint 200
%uint_275 = OpConstant %uint 275 %uint_275 = OpConstant %uint 275
@ -120,7 +121,6 @@ OpFunctionEnd
%30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0 %30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %30 %34 = OpLoad %v4float %30
%36 = OpVectorTimesScalar %v4float %34 %float_100 %36 = OpVectorTimesScalar %v4float %34 %float_100
%38 = OpCompositeConstruct %v4float %float_200 %float_200 %float_200 %float_200
%39 = OpFAdd %v4float %36 %38 %39 = OpFAdd %v4float %36 %38
%40 = OpCompositeExtract %float %39 0 %40 = OpCompositeExtract %float %39 0
%41 = OpConvertFToU %uint %40 %41 = OpConvertFToU %uint %40

View File

@ -73,7 +73,9 @@ OpDecorate %110 RelaxedPrecision
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1 %int = OpTypeInt 32 1
%int_0 = OpConstant %int 0 %int_0 = OpConstant %int 0
%34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%40 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%false = OpConstantFalse %bool %false = OpConstantFalse %bool
%v2bool = OpTypeVector %bool 2 %v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3 %v3float = OpTypeVector %float 3
@ -98,12 +100,10 @@ OpFunctionEnd
%28 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0 %28 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%32 = OpLoad %v4float %28 %32 = OpLoad %v4float %28
%33 = OpVectorShuffle %v4float %32 %32 1 1 1 1 %33 = OpVectorShuffle %v4float %32 %32 1 1 1 1
%34 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_0
%35 = OpFDiv %v4float %34 %33 %35 = OpFDiv %v4float %34 %33
OpStore %valueIsNaN %35 OpStore %valueIsNaN %35
%38 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0 %38 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%39 = OpLoad %v4float %38 %39 = OpLoad %v4float %38
%40 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%41 = OpFDiv %v4float %40 %39 %41 = OpFDiv %v4float %40 %39
OpStore %valueIsNumber %41 OpStore %valueIsNumber %41
%44 = OpLoad %v4float %valueIsNaN %44 = OpLoad %v4float %valueIsNaN

View File

@ -49,6 +49,7 @@ OpDecorate %54 RelaxedPrecision
%float_0_5 = OpConstant %float 0.5 %float_0_5 = OpConstant %float 0.5
%int_1 = OpConstant %int 1 %int_1 = OpConstant %int 1
%float_0_25 = OpConstant %float 0.25 %float_0_25 = OpConstant %float 0.25
%51 = OpConstantComposite %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25
%int_2 = OpConstant %int 2 %int_2 = OpConstant %int 2
%int_100 = OpConstant %int 100 %int_100 = OpConstant %int 100
%main = OpFunction %void None %14 %main = OpFunction %void None %14
@ -92,7 +93,6 @@ OpLoopMerge %48 %47 None
OpBranch %45 OpBranch %45
%45 = OpLabel %45 = OpLabel
%49 = OpLoad %v4float %sk_FragColor %49 = OpLoad %v4float %sk_FragColor
%51 = OpCompositeConstruct %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25
%52 = OpFAdd %v4float %49 %51 %52 = OpFAdd %v4float %49 %51
OpStore %sk_FragColor %52 OpStore %sk_FragColor %52
OpBranch %46 OpBranch %46

File diff suppressed because it is too large Load Diff