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:
parent
b2a2e7c9e3
commit
958a9395e6
@ -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
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user