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:
parent
699dd5ae4a
commit
89bdf0f872
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user