Fix function declaration for our invocation-ID workaround helper.
Previously, the declaration didn't link back to function definition. This makes the function appear to be undefined, which inhibits inlining and also makes it difficult for us to validate the presence of a definition for every called function. Change-Id: I220ab502634cb3e1d337c23bac150af9aa6370b1 Bug: skia:10902 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/349063 Commit-Queue: John Stiles <johnstiles@google.com> Commit-Queue: Brian Osman <brianosman@google.com> Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
89ac7c2dd9
commit
0d07e14f1e
@ -725,17 +725,18 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
|
||||
std::vector<const Variable*>(),
|
||||
fContext.fVoid_Type.get(),
|
||||
fIsBuiltinCode));
|
||||
fProgramElements->push_back(std::make_unique<FunctionDefinition>(/*offset=*/-1,
|
||||
invokeDecl, fIsBuiltinCode,
|
||||
std::move(main)));
|
||||
|
||||
auto invokeDef = std::make_unique<FunctionDefinition>(/*offset=*/-1, invokeDecl, fIsBuiltinCode,
|
||||
std::move(main));
|
||||
invokeDecl->setDefinition(invokeDef.get());
|
||||
fProgramElements->push_back(std::move(invokeDef));
|
||||
std::vector<std::unique_ptr<VarDeclaration>> variables;
|
||||
const Variable* loopIdx = &(*fSymbolTable)["sk_InvocationID"]->as<Variable>();
|
||||
auto test = std::make_unique<BinaryExpression>(/*offset=*/-1,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx),
|
||||
Token::Kind::TK_LT,
|
||||
std::make_unique<IntLiteral>(fContext, /*offset=*/-1, fInvocations),
|
||||
fContext.fBool_Type.get());
|
||||
auto test = std::make_unique<BinaryExpression>(
|
||||
/*offset=*/-1,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx),
|
||||
Token::Kind::TK_LT,
|
||||
std::make_unique<IntLiteral>(fContext, /*offset=*/-1, fInvocations),
|
||||
fContext.fBool_Type.get());
|
||||
auto next = std::make_unique<PostfixExpression>(
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx,
|
||||
VariableReference::RefKind::kReadWrite),
|
||||
@ -746,18 +747,19 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
|
||||
|
||||
StatementArray loopBody;
|
||||
loopBody.reserve_back(2);
|
||||
loopBody.push_back(std::make_unique<ExpressionStatement>(this->call(
|
||||
/*offset=*/-1, *invokeDecl,
|
||||
ExpressionArray{})));
|
||||
loopBody.push_back(std::make_unique<ExpressionStatement>(this->call(
|
||||
/*offset=*/-1, std::move(endPrimitive),
|
||||
ExpressionArray{})));
|
||||
auto assignment = std::make_unique<BinaryExpression>(/*offset=*/-1,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx,
|
||||
VariableReference::RefKind::kWrite),
|
||||
Token::Kind::TK_EQ,
|
||||
std::make_unique<IntLiteral>(fContext, /*offset=*/-1, /*value=*/0),
|
||||
fContext.fInt_Type.get());
|
||||
loopBody.push_back(std::make_unique<ExpressionStatement>(this->call(/*offset=*/-1,
|
||||
*invokeDecl,
|
||||
ExpressionArray{})));
|
||||
loopBody.push_back(std::make_unique<ExpressionStatement>(this->call(/*offset=*/-1,
|
||||
std::move(endPrimitive),
|
||||
ExpressionArray{})));
|
||||
auto assignment = std::make_unique<BinaryExpression>(
|
||||
/*offset=*/-1,
|
||||
std::make_unique<VariableReference>(/*offset=*/-1, loopIdx,
|
||||
VariableReference::RefKind::kWrite),
|
||||
Token::Kind::TK_EQ,
|
||||
std::make_unique<IntLiteral>(fContext, /*offset=*/-1, /*value=*/0),
|
||||
fContext.fInt_Type.get());
|
||||
auto initializer = std::make_unique<ExpressionStatement>(std::move(assignment));
|
||||
auto loop = std::make_unique<ForStatement>(/*offset=*/-1,
|
||||
std::move(initializer),
|
||||
@ -766,7 +768,7 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
|
||||
fSymbolTable);
|
||||
StatementArray children;
|
||||
children.push_back(std::move(loop));
|
||||
return std::make_unique<Block>(-1, std::move(children));
|
||||
return std::make_unique<Block>(/*offset=*/-1, std::move(children));
|
||||
}
|
||||
|
||||
std::unique_ptr<Statement> IRGenerator::getNormalizeSkPositionCode() {
|
||||
|
@ -1,7 +1,7 @@
|
||||
OpCapability Geometry
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Geometry %main "main" %4 %9
|
||||
OpEntryPoint Geometry %main "main" %3 %8
|
||||
OpExecutionMode %main InputPoints
|
||||
OpExecutionMode %main OutputLineStrip
|
||||
OpExecutionMode %main OutputVertices 4
|
||||
@ -10,7 +10,6 @@ OpName %sk_PerVertex "sk_PerVertex"
|
||||
OpMemberName %sk_PerVertex 0 "sk_Position"
|
||||
OpMemberName %sk_PerVertex 1 "sk_PointSize"
|
||||
OpName %sk_InvocationID "sk_InvocationID"
|
||||
OpName %_invoke "_invoke"
|
||||
OpName %main "main"
|
||||
OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
|
||||
OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
|
||||
@ -19,66 +18,61 @@ OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%sk_PerVertex = OpTypeStruct %v4float %float
|
||||
%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
|
||||
%4 = OpVariable %_ptr_Output_sk_PerVertex Output
|
||||
%3 = OpVariable %_ptr_Output_sk_PerVertex Output
|
||||
%int = OpTypeInt 32 1
|
||||
%int_1 = OpConstant %int 1
|
||||
%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
|
||||
%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
|
||||
%9 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
|
||||
%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
|
||||
%_ptr_Private_int = OpTypePointer Private %int
|
||||
%sk_InvocationID = OpVariable %_ptr_Private_int Private
|
||||
%void = OpTypeVoid
|
||||
%17 = OpTypeFunction %void
|
||||
%16 = OpTypeFunction %void
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_2 = OpConstant %int 2
|
||||
%bool = OpTypeBool
|
||||
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
||||
%float_0_5 = OpConstant %float 0.5
|
||||
%float_0 = OpConstant %float 0
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
%float_n0_5 = OpConstant %float -0.5
|
||||
%int_2 = OpConstant %int 2
|
||||
%bool = OpTypeBool
|
||||
%_invoke = OpFunction %void None %17
|
||||
%18 = OpLabel
|
||||
%20 = OpAccessChain %_ptr_Input_v4float %9 %int_0 %int_0
|
||||
%22 = OpLoad %v4float %20
|
||||
%26 = OpLoad %int %sk_InvocationID
|
||||
%25 = OpConvertSToF %float %26
|
||||
%27 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %25
|
||||
%28 = OpFAdd %v4float %22 %27
|
||||
%29 = OpAccessChain %_ptr_Output_v4float %4 %int_0
|
||||
OpStore %29 %28
|
||||
OpEmitVertex
|
||||
%32 = OpAccessChain %_ptr_Input_v4float %9 %int_0 %int_0
|
||||
%33 = OpLoad %v4float %32
|
||||
%36 = OpLoad %int %sk_InvocationID
|
||||
%35 = OpConvertSToF %float %36
|
||||
%37 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %35
|
||||
%38 = OpFAdd %v4float %33 %37
|
||||
%39 = OpAccessChain %_ptr_Output_v4float %4 %int_0
|
||||
OpStore %39 %38
|
||||
OpEmitVertex
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %void None %17
|
||||
%41 = OpLabel
|
||||
%main = OpFunction %void None %16
|
||||
%17 = OpLabel
|
||||
OpStore %sk_InvocationID %int_0
|
||||
OpBranch %42
|
||||
%42 = OpLabel
|
||||
OpLoopMerge %46 %45 None
|
||||
OpBranch %43
|
||||
%43 = OpLabel
|
||||
%47 = OpLoad %int %sk_InvocationID
|
||||
%49 = OpSLessThan %bool %47 %int_2
|
||||
OpBranchConditional %49 %44 %46
|
||||
%44 = OpLabel
|
||||
%51 = OpFunctionCall %void %_invoke
|
||||
OpBranch %19
|
||||
%19 = OpLabel
|
||||
OpLoopMerge %23 %22 None
|
||||
OpBranch %20
|
||||
%20 = OpLabel
|
||||
%24 = OpLoad %int %sk_InvocationID
|
||||
%26 = OpSLessThan %bool %24 %int_2
|
||||
OpBranchConditional %26 %21 %23
|
||||
%21 = OpLabel
|
||||
%28 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
|
||||
%30 = OpLoad %v4float %28
|
||||
%34 = OpLoad %int %sk_InvocationID
|
||||
%33 = OpConvertSToF %float %34
|
||||
%35 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %33
|
||||
%36 = OpFAdd %v4float %30 %35
|
||||
%37 = OpAccessChain %_ptr_Output_v4float %3 %int_0
|
||||
OpStore %37 %36
|
||||
OpEmitVertex
|
||||
%40 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
|
||||
%41 = OpLoad %v4float %40
|
||||
%44 = OpLoad %int %sk_InvocationID
|
||||
%43 = OpConvertSToF %float %44
|
||||
%45 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %43
|
||||
%46 = OpFAdd %v4float %41 %45
|
||||
%47 = OpAccessChain %_ptr_Output_v4float %3 %int_0
|
||||
OpStore %47 %46
|
||||
OpEmitVertex
|
||||
OpEndPrimitive
|
||||
OpBranch %45
|
||||
%45 = OpLabel
|
||||
%53 = OpLoad %int %sk_InvocationID
|
||||
%54 = OpIAdd %int %53 %int_1
|
||||
OpStore %sk_InvocationID %54
|
||||
OpBranch %42
|
||||
%46 = OpLabel
|
||||
OpBranch %22
|
||||
%22 = OpLabel
|
||||
%50 = OpLoad %int %sk_InvocationID
|
||||
%51 = OpIAdd %int %50 %int_1
|
||||
OpStore %sk_InvocationID %51
|
||||
OpBranch %19
|
||||
%23 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
@ -2,16 +2,14 @@
|
||||
int sk_InvocationID;
|
||||
layout (points) in ;
|
||||
layout (line_strip, max_vertices = 4) out ;
|
||||
void _invoke() {
|
||||
gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
}
|
||||
void main() {
|
||||
for (sk_InvocationID = 0;sk_InvocationID < 2; sk_InvocationID++) {
|
||||
_invoke();
|
||||
gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
OpCapability Geometry
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Geometry %main "main" %4 %9
|
||||
OpEntryPoint Geometry %main "main" %3 %8
|
||||
OpExecutionMode %main InputPoints
|
||||
OpExecutionMode %main OutputLineStrip
|
||||
OpExecutionMode %main OutputVertices 2
|
||||
@ -10,7 +10,6 @@ OpName %sk_PerVertex "sk_PerVertex"
|
||||
OpMemberName %sk_PerVertex 0 "sk_Position"
|
||||
OpMemberName %sk_PerVertex 1 "sk_PointSize"
|
||||
OpName %sk_InvocationID "sk_InvocationID"
|
||||
OpName %_invoke "_invoke"
|
||||
OpName %main "main"
|
||||
OpMemberDecorate %sk_PerVertex 0 BuiltIn Position
|
||||
OpMemberDecorate %sk_PerVertex 1 BuiltIn PointSize
|
||||
@ -19,66 +18,61 @@ OpDecorate %_arr_sk_PerVertex_int_1 ArrayStride 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%sk_PerVertex = OpTypeStruct %v4float %float
|
||||
%_ptr_Output_sk_PerVertex = OpTypePointer Output %sk_PerVertex
|
||||
%4 = OpVariable %_ptr_Output_sk_PerVertex Output
|
||||
%3 = OpVariable %_ptr_Output_sk_PerVertex Output
|
||||
%int = OpTypeInt 32 1
|
||||
%int_1 = OpConstant %int 1
|
||||
%_arr_sk_PerVertex_int_1 = OpTypeArray %sk_PerVertex %int_1
|
||||
%_ptr_Input__arr_sk_PerVertex_int_1 = OpTypePointer Input %_arr_sk_PerVertex_int_1
|
||||
%9 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
|
||||
%8 = OpVariable %_ptr_Input__arr_sk_PerVertex_int_1 Input
|
||||
%_ptr_Private_int = OpTypePointer Private %int
|
||||
%sk_InvocationID = OpVariable %_ptr_Private_int Private
|
||||
%void = OpTypeVoid
|
||||
%17 = OpTypeFunction %void
|
||||
%16 = OpTypeFunction %void
|
||||
%int_0 = OpConstant %int 0
|
||||
%int_2 = OpConstant %int 2
|
||||
%bool = OpTypeBool
|
||||
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
||||
%float_0_5 = OpConstant %float 0.5
|
||||
%float_0 = OpConstant %float 0
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
%float_n0_5 = OpConstant %float -0.5
|
||||
%int_2 = OpConstant %int 2
|
||||
%bool = OpTypeBool
|
||||
%_invoke = OpFunction %void None %17
|
||||
%18 = OpLabel
|
||||
%20 = OpAccessChain %_ptr_Input_v4float %9 %int_0 %int_0
|
||||
%22 = OpLoad %v4float %20
|
||||
%26 = OpLoad %int %sk_InvocationID
|
||||
%25 = OpConvertSToF %float %26
|
||||
%27 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %25
|
||||
%28 = OpFAdd %v4float %22 %27
|
||||
%29 = OpAccessChain %_ptr_Output_v4float %4 %int_0
|
||||
OpStore %29 %28
|
||||
OpEmitVertex
|
||||
%32 = OpAccessChain %_ptr_Input_v4float %9 %int_0 %int_0
|
||||
%33 = OpLoad %v4float %32
|
||||
%36 = OpLoad %int %sk_InvocationID
|
||||
%35 = OpConvertSToF %float %36
|
||||
%37 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %35
|
||||
%38 = OpFAdd %v4float %33 %37
|
||||
%39 = OpAccessChain %_ptr_Output_v4float %4 %int_0
|
||||
OpStore %39 %38
|
||||
OpEmitVertex
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %void None %17
|
||||
%41 = OpLabel
|
||||
%main = OpFunction %void None %16
|
||||
%17 = OpLabel
|
||||
OpStore %sk_InvocationID %int_0
|
||||
OpBranch %42
|
||||
%42 = OpLabel
|
||||
OpLoopMerge %46 %45 None
|
||||
OpBranch %43
|
||||
%43 = OpLabel
|
||||
%47 = OpLoad %int %sk_InvocationID
|
||||
%49 = OpSLessThan %bool %47 %int_2
|
||||
OpBranchConditional %49 %44 %46
|
||||
%44 = OpLabel
|
||||
%51 = OpFunctionCall %void %_invoke
|
||||
OpBranch %19
|
||||
%19 = OpLabel
|
||||
OpLoopMerge %23 %22 None
|
||||
OpBranch %20
|
||||
%20 = OpLabel
|
||||
%24 = OpLoad %int %sk_InvocationID
|
||||
%26 = OpSLessThan %bool %24 %int_2
|
||||
OpBranchConditional %26 %21 %23
|
||||
%21 = OpLabel
|
||||
%28 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
|
||||
%30 = OpLoad %v4float %28
|
||||
%34 = OpLoad %int %sk_InvocationID
|
||||
%33 = OpConvertSToF %float %34
|
||||
%35 = OpCompositeConstruct %v4float %float_0_5 %float_0 %float_0 %33
|
||||
%36 = OpFAdd %v4float %30 %35
|
||||
%37 = OpAccessChain %_ptr_Output_v4float %3 %int_0
|
||||
OpStore %37 %36
|
||||
OpEmitVertex
|
||||
%40 = OpAccessChain %_ptr_Input_v4float %8 %int_0 %int_0
|
||||
%41 = OpLoad %v4float %40
|
||||
%44 = OpLoad %int %sk_InvocationID
|
||||
%43 = OpConvertSToF %float %44
|
||||
%45 = OpCompositeConstruct %v4float %float_n0_5 %float_0 %float_0 %43
|
||||
%46 = OpFAdd %v4float %41 %45
|
||||
%47 = OpAccessChain %_ptr_Output_v4float %3 %int_0
|
||||
OpStore %47 %46
|
||||
OpEmitVertex
|
||||
OpEndPrimitive
|
||||
OpBranch %45
|
||||
%45 = OpLabel
|
||||
%53 = OpLoad %int %sk_InvocationID
|
||||
%54 = OpIAdd %int %53 %int_1
|
||||
OpStore %sk_InvocationID %54
|
||||
OpBranch %42
|
||||
%46 = OpLabel
|
||||
OpBranch %22
|
||||
%22 = OpLabel
|
||||
%50 = OpLoad %int %sk_InvocationID
|
||||
%51 = OpIAdd %int %50 %int_1
|
||||
OpStore %sk_InvocationID %51
|
||||
OpBranch %19
|
||||
%23 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
|
@ -2,16 +2,14 @@
|
||||
int sk_InvocationID;
|
||||
layout (points) in ;
|
||||
layout (line_strip, max_vertices = 2) out ;
|
||||
void _invoke() {
|
||||
gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
}
|
||||
void main() {
|
||||
for (sk_InvocationID = 0;sk_InvocationID < 2; sk_InvocationID++) {
|
||||
_invoke();
|
||||
gl_Position = gl_in[0].gl_Position + vec4(0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
gl_Position = gl_in[0].gl_Position + vec4(-0.5, 0.0, 0.0, float(sk_InvocationID));
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user