Avoid creating temporary variables for nested trivial cases.
For instance, `foo[0].x` is now considered trivial to inline. It combines two trivial cases: array-indexing by an int literal, and a swizzle. Change-Id: Ibb3ca1f324bbee0e9b3556e66644923fc9e0cf45 Bug: skia:10786 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/320768 Commit-Queue: John Stiles <johnstiles@google.com> Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
dd33b3ea90
commit
44733aa1e2
@ -243,6 +243,15 @@ std::unique_ptr<Expression> clone_with_ref_kind(const Expression& expr,
|
|||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_trivial_argument(const Expression& argument) {
|
||||||
|
return argument.is<VariableReference>() ||
|
||||||
|
(argument.is<Swizzle>() && is_trivial_argument(*argument.as<Swizzle>().fBase)) ||
|
||||||
|
(argument.is<FieldAccess>() && is_trivial_argument(*argument.as<FieldAccess>().fBase)) ||
|
||||||
|
(argument.is<IndexExpression>() &&
|
||||||
|
argument.as<IndexExpression>().fIndex->is<IntLiteral>() &&
|
||||||
|
is_trivial_argument(*argument.as<IndexExpression>().fBase));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void Inliner::ensureScopedBlocks(Statement* inlinedBody, Statement* parentStmt) {
|
void Inliner::ensureScopedBlocks(Statement* inlinedBody, Statement* parentStmt) {
|
||||||
@ -661,15 +670,8 @@ Inliner::InlinedCall Inliner::inlineCall(FunctionCall* call,
|
|||||||
const Variable* param = function.fDeclaration.fParameters[i];
|
const Variable* param = function.fDeclaration.fParameters[i];
|
||||||
bool isOutParam = param->fModifiers.fFlags & Modifiers::kOut_Flag;
|
bool isOutParam = param->fModifiers.fFlags & Modifiers::kOut_Flag;
|
||||||
|
|
||||||
// If this is a variable, a swizzled variable, a struct member, or a simple array access...
|
// If this argument can be inlined trivially (e.g. a swizzle, or a constant array index)...
|
||||||
if (arguments[i]->is<VariableReference>() ||
|
if (is_trivial_argument(*arguments[i])) {
|
||||||
(arguments[i]->is<Swizzle>() &&
|
|
||||||
arguments[i]->as<Swizzle>().fBase->is<VariableReference>()) ||
|
|
||||||
(arguments[i]->is<FieldAccess>() &&
|
|
||||||
arguments[i]->as<FieldAccess>().fBase->is<VariableReference>()) ||
|
|
||||||
(arguments[i]->is<IndexExpression>() &&
|
|
||||||
arguments[i]->as<IndexExpression>().fBase->is<VariableReference>() &&
|
|
||||||
arguments[i]->as<IndexExpression>().fIndex->is<IntLiteral>())) {
|
|
||||||
// ... and it's an `out` param, or it isn't written to within the inline function...
|
// ... and it's an `out` param, or it isn't written to within the inline function...
|
||||||
if (isOutParam || !Analysis::StatementWritesToVariable(*function.fBody, *param)) {
|
if (isOutParam || !Analysis::StatementWritesToVariable(*function.fBody, *param)) {
|
||||||
// ... we don't need to copy it at all! We can just use the existing expression.
|
// ... we don't need to copy it at all! We can just use the existing expression.
|
||||||
|
@ -41,7 +41,9 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
h4x4[3].w = 1.0;
|
{
|
||||||
|
h4x4[3].w = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sk_FragColor = vec4(mat2(2.0)[0][0], h3x3[0][0], h4x4[0][0], 1.0);
|
sk_FragColor = vec4(mat2(2.0)[0][0], h3x3[0][0], h4x4[0][0], 1.0);
|
||||||
@ -75,7 +77,9 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
f2x2[0][0] = 1.0;
|
{
|
||||||
|
f2x2[0][0] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sk_FragColor = vec4(f2x2[0][0], mat3(3.0)[0][0], mat4(4.0)[0][0], 1.0);
|
sk_FragColor = vec4(f2x2[0][0], mat3(3.0)[0][0], mat4(4.0)[0][0], 1.0);
|
||||||
|
@ -49,7 +49,9 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
h4x4[3].w = 1.0;
|
{
|
||||||
|
h4x4[3].w = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_out->sk_FragColor = float4(float2x2(2.0)[0][0], h3x3[0][0], h4x4[0][0], 1.0);
|
_out->sk_FragColor = float4(float2x2(2.0)[0][0], h3x3[0][0], h4x4[0][0], 1.0);
|
||||||
@ -83,7 +85,9 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
f2x2[0][0] = 1.0;
|
{
|
||||||
|
f2x2[0][0] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_out->sk_FragColor = float4(f2x2[0][0], float3x3(3.0)[0][0], float4x4(4.0)[0][0], 1.0);
|
_out->sk_FragColor = float4(f2x2[0][0], float3x3(3.0)[0][0], float4x4(4.0)[0][0], 1.0);
|
||||||
|
Loading…
Reference in New Issue
Block a user