Fix array-of-struct name mangling in Pipeline stage.

There aren't many cases where array-of-struct types are useful in
ES2, but it looks like function parameters are one such case:
http://screen/7Fnc7GhewAkUK3j

Change-Id: I23410a3824a3c202c12147d6939586cc0e55a9ce
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/402397
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:
John Stiles 2021-04-28 16:03:05 -04:00 committed by Skia Commit-Bot
parent b2a2e7c9e3
commit 958a9395e6
5 changed files with 148 additions and 64 deletions

View File

@ -1,3 +1,12 @@
struct S {
float2 v;
};
void initialize(out S[2] z) {
z[0].v = float2(0, 1);
z[1].v = float2(2, 1);
}
half4 main(float2 coords) {
float2 x[2];
x[0] = float2( 0, 0);
@ -5,9 +14,11 @@ half4 main(float2 coords) {
float2 y[2];
y[0] = float2( 0, 1);
y[1] = float2(-1, 2);
S z[2];
initialize(z);
return half4(x[0][0] * x[0][1], // R=0
x[1][0] - x[1][1], // G=1
y[0][0] / y[0][1], // B=0
y[1][0] + y[1][1]); // A=1
return half4(x[0][0] * x[0][1] + z[0].v[0], // R=0
x[1][0] - x[1][1] * z[0].v[1], // G=1
y[0][0] / y[0][1] / z[1].v[0], // B=0
y[1][0] + y[1][1] * z[1].v[1]); // A=1
}

View File

@ -364,6 +364,17 @@ void PipelineStageCodeGenerator::writeProgramElement(const ProgramElement& e) {
}
String PipelineStageCodeGenerator::typeName(const Type& type) {
if (type.isArray()) {
// This is necessary so that name mangling on arrays-of-structs works properly.
String arrayName = this->typeName(type.componentType());
arrayName.push_back('[');
if (type.columns() != Type::kUnsizedArray) {
arrayName += to_string(type.columns());
}
arrayName.push_back(']');
return arrayName;
}
auto it = fStructNames.find(&type);
return it != fStructNames.end() ? it->second : type.name();
}

View File

@ -6,15 +6,21 @@ OpExecutionMode %_entrypoint_v OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
OpName %_entrypoint_v "_entrypoint_v"
OpName %S "S"
OpMemberName %S 0 "v"
OpName %initialize_vS "initialize_vS"
OpName %main "main"
OpName %x "x"
OpName %y "y"
OpName %z "z"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpMemberDecorate %S 0 Offset 0
OpDecorate %_arr_S_int_2 ArrayStride 16
OpDecorate %_arr_v2float_int_2 ArrayStride 16
OpDecorate %69 RelaxedPrecision
OpDecorate %97 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -23,73 +29,105 @@ OpDecorate %69 RelaxedPrecision
%_ptr_Input_bool = OpTypePointer Input %bool
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%void = OpTypeVoid
%12 = OpTypeFunction %void
%13 = OpTypeFunction %void
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%16 = OpConstantComposite %v2float %float_0 %float_0
%17 = OpConstantComposite %v2float %float_0 %float_0
%_ptr_Function_v2float = OpTypePointer Function %v2float
%20 = OpTypeFunction %v4float %_ptr_Function_v2float
%S = OpTypeStruct %v2float
%int = OpTypeInt 32 1
%int_2 = OpConstant %int 2
%_arr_S_int_2 = OpTypeArray %S %int_2
%_ptr_Function__arr_S_int_2 = OpTypePointer Function %_arr_S_int_2
%25 = OpTypeFunction %void %_ptr_Function__arr_S_int_2
%float_1 = OpConstant %float 1
%30 = OpConstantComposite %v2float %float_0 %float_1
%int_0 = OpConstant %int 0
%float_2 = OpConstant %float 2
%34 = OpConstantComposite %v2float %float_2 %float_1
%int_1 = OpConstant %int 1
%37 = OpTypeFunction %v4float %_ptr_Function_v2float
%_arr_v2float_int_2 = OpTypeArray %v2float %int_2
%_ptr_Function__arr_v2float_int_2 = OpTypePointer Function %_arr_v2float_int_2
%int_0 = OpConstant %int 0
%float_1 = OpConstant %float 1
%31 = OpConstantComposite %v2float %float_1 %float_0
%int_1 = OpConstant %int 1
%35 = OpConstantComposite %v2float %float_0 %float_1
%44 = OpConstantComposite %v2float %float_1 %float_0
%float_n1 = OpConstant %float -1
%float_2 = OpConstant %float 2
%39 = OpConstantComposite %v2float %float_n1 %float_2
%_entrypoint_v = OpFunction %void None %12
%13 = OpLabel
%17 = OpVariable %_ptr_Function_v2float Function
OpStore %17 %16
%19 = OpFunctionCall %v4float %main %17
OpStore %sk_FragColor %19
%49 = OpConstantComposite %v2float %float_n1 %float_2
%_entrypoint_v = OpFunction %void None %13
%14 = OpLabel
%18 = OpVariable %_ptr_Function_v2float Function
OpStore %18 %17
%20 = OpFunctionCall %v4float %main %18
OpStore %sk_FragColor %20
OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %20
%21 = OpFunctionParameter %_ptr_Function_v2float
%22 = OpLabel
%initialize_vS = OpFunction %void None %25
%27 = OpFunctionParameter %_ptr_Function__arr_S_int_2
%28 = OpLabel
%32 = OpAccessChain %_ptr_Function_v2float %27 %int_0 %int_0
OpStore %32 %30
%36 = OpAccessChain %_ptr_Function_v2float %27 %int_1 %int_0
OpStore %36 %34
OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %37
%38 = OpFunctionParameter %_ptr_Function_v2float
%39 = OpLabel
%x = OpVariable %_ptr_Function__arr_v2float_int_2 Function
%y = OpVariable %_ptr_Function__arr_v2float_int_2 Function
%29 = OpAccessChain %_ptr_Function_v2float %x %int_0
OpStore %29 %16
%33 = OpAccessChain %_ptr_Function_v2float %x %int_1
OpStore %33 %31
%36 = OpAccessChain %_ptr_Function_v2float %y %int_0
OpStore %36 %35
%40 = OpAccessChain %_ptr_Function_v2float %y %int_1
OpStore %40 %39
%41 = OpAccessChain %_ptr_Function_v2float %x %int_0
%42 = OpLoad %v2float %41
%43 = OpCompositeExtract %float %42 0
%44 = OpAccessChain %_ptr_Function_v2float %x %int_0
%45 = OpLoad %v2float %44
%46 = OpCompositeExtract %float %45 1
%47 = OpFMul %float %43 %46
%48 = OpAccessChain %_ptr_Function_v2float %x %int_1
%49 = OpLoad %v2float %48
%50 = OpCompositeExtract %float %49 0
%51 = OpAccessChain %_ptr_Function_v2float %x %int_1
%52 = OpLoad %v2float %51
%53 = OpCompositeExtract %float %52 1
%54 = OpFSub %float %50 %53
%55 = OpAccessChain %_ptr_Function_v2float %y %int_0
%56 = OpLoad %v2float %55
%57 = OpCompositeExtract %float %56 0
%58 = OpAccessChain %_ptr_Function_v2float %y %int_0
%59 = OpLoad %v2float %58
%60 = OpCompositeExtract %float %59 1
%61 = OpFDiv %float %57 %60
%62 = OpAccessChain %_ptr_Function_v2float %y %int_1
%63 = OpLoad %v2float %62
%64 = OpCompositeExtract %float %63 0
%65 = OpAccessChain %_ptr_Function_v2float %y %int_1
%66 = OpLoad %v2float %65
%67 = OpCompositeExtract %float %66 1
%68 = OpFAdd %float %64 %67
%69 = OpCompositeConstruct %v4float %47 %54 %61 %68
OpReturnValue %69
%z = OpVariable %_ptr_Function__arr_S_int_2 Function
%43 = OpAccessChain %_ptr_Function_v2float %x %int_0
OpStore %43 %17
%45 = OpAccessChain %_ptr_Function_v2float %x %int_1
OpStore %45 %44
%47 = OpAccessChain %_ptr_Function_v2float %y %int_0
OpStore %47 %30
%50 = OpAccessChain %_ptr_Function_v2float %y %int_1
OpStore %50 %49
%52 = OpFunctionCall %void %initialize_vS %z
%53 = OpAccessChain %_ptr_Function_v2float %x %int_0
%54 = OpLoad %v2float %53
%55 = OpCompositeExtract %float %54 0
%56 = OpAccessChain %_ptr_Function_v2float %x %int_0
%57 = OpLoad %v2float %56
%58 = OpCompositeExtract %float %57 1
%59 = OpFMul %float %55 %58
%60 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
%61 = OpLoad %v2float %60
%62 = OpCompositeExtract %float %61 0
%63 = OpFAdd %float %59 %62
%64 = OpAccessChain %_ptr_Function_v2float %x %int_1
%65 = OpLoad %v2float %64
%66 = OpCompositeExtract %float %65 0
%67 = OpAccessChain %_ptr_Function_v2float %x %int_1
%68 = OpLoad %v2float %67
%69 = OpCompositeExtract %float %68 1
%70 = OpAccessChain %_ptr_Function_v2float %z %int_0 %int_0
%71 = OpLoad %v2float %70
%72 = OpCompositeExtract %float %71 1
%73 = OpFMul %float %69 %72
%74 = OpFSub %float %66 %73
%75 = OpAccessChain %_ptr_Function_v2float %y %int_0
%76 = OpLoad %v2float %75
%77 = OpCompositeExtract %float %76 0
%78 = OpAccessChain %_ptr_Function_v2float %y %int_0
%79 = OpLoad %v2float %78
%80 = OpCompositeExtract %float %79 1
%81 = OpFDiv %float %77 %80
%82 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
%83 = OpLoad %v2float %82
%84 = OpCompositeExtract %float %83 0
%85 = OpFDiv %float %81 %84
%86 = OpAccessChain %_ptr_Function_v2float %y %int_1
%87 = OpLoad %v2float %86
%88 = OpCompositeExtract %float %87 0
%89 = OpAccessChain %_ptr_Function_v2float %y %int_1
%90 = OpLoad %v2float %89
%91 = OpCompositeExtract %float %90 1
%92 = OpAccessChain %_ptr_Function_v2float %z %int_1 %int_0
%93 = OpLoad %v2float %92
%94 = OpCompositeExtract %float %93 1
%95 = OpFMul %float %91 %94
%96 = OpFAdd %float %88 %95
%97 = OpCompositeConstruct %v4float %63 %74 %85 %96
OpReturnValue %97
OpFunctionEnd

View File

@ -1,5 +1,12 @@
out vec4 sk_FragColor;
struct S {
vec2 v;
};
void initialize_vS(out S z[2]) {
z[0].v = vec2(0.0, 1.0);
z[1].v = vec2(2.0, 1.0);
}
vec4 main() {
vec2 x[2];
x[0] = vec2(0.0, 0.0);
@ -7,5 +14,7 @@ vec4 main() {
vec2 y[2];
y[0] = vec2(0.0, 1.0);
y[1] = vec2(-1.0, 2.0);
return vec4(x[0].x * x[0].y, x[1].x - x[1].y, y[0].x / y[0].y, y[1].x + y[1].y);
S z[2];
initialize_vS(z);
return vec4(x[0].x * x[0].y + z[0].v.x, x[1].x - x[1].y * z[0].v.y, (y[0].x / y[0].y) / z[1].v.x, y[1].x + y[1].y * z[1].v.y);
}

View File

@ -1,11 +1,24 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct S {
float2 v;
};
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
void initialize_vS(thread array<S, 2>& z);
void _skOutParamHelper0_initialize_vS(thread array<S, 2>& z) {
array<S, 2> _var0;
initialize_vS(_var0);
z = _var0;
}
void initialize_vS(thread array<S, 2>& z) {
z[0].v = float2(0.0, 1.0);
z[1].v = float2(2.0, 1.0);
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
@ -15,6 +28,8 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
array<float2, 2> y;
y[0] = float2(0.0, 1.0);
y[1] = float2(-1.0, 2.0);
_out.sk_FragColor = float4(x[0].x * x[0].y, x[1].x - x[1].y, y[0].x / y[0].y, y[1].x + y[1].y);
array<S, 2> z;
_skOutParamHelper0_initialize_vS(z);
_out.sk_FragColor = float4(x[0].x * x[0].y + z[0].v.x, x[1].x - x[1].y * z[0].v.y, (y[0].x / y[0].y) / z[1].v.x, y[1].x + y[1].y * z[1].v.y);
return _out;
}