Replace array indexing on vector types with swizzles.

Our optimizer ignores index expressions, but has a few simplifications
that it can perform on swizzles. (Added extra code to SwizzleByIndex
which demonstrates this.)

Change-Id: If3c85a0456d98749008d796e422944b602ee6933
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/341460
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2020-12-07 15:25:31 -05:00 committed by Skia Commit-Bot
parent e38a9e7f18
commit bf282c05e5
16 changed files with 335 additions and 214 deletions

View File

@ -2771,6 +2771,12 @@ std::unique_ptr<Expression> IRGenerator::convertIndex(std::unique_ptr<Expression
" out of range for '" + baseType.displayName() + "'");
return nullptr;
}
// Constant array indexes on vectors can be converted to swizzles: `myHalf4.z`.
// (Using a swizzle gives our optimizer a bit more to work with, compared to array indices.)
if (baseType.isVector()) {
return std::make_unique<Swizzle>(fContext, std::move(base),
ComponentArray{(int8_t)index});
}
}
return std::make_unique<IndexExpression>(fContext, std::move(base), std::move(converted));
}

View File

@ -9,5 +9,5 @@ mediump vec3 h3 = vec3(1.0, 2.0, 3.0);
highp mat2 f22 = mat2(1.0, 2.0, 3.0, 4.0);
mediump mat2x4 h24 = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
void main() {
sk_FragColor.x = ((((f + h) + f2.x) + h3.x) + f22[0][0]) + h24[0][0];
sk_FragColor.x = ((((f + h) + f2.x) + h3.x) + f22[0].x) + h24[0].x;
}

View File

@ -7,5 +7,5 @@ vec3 h3 = vec3(1.0, 2.0, 3.0);
mat2 f22 = mat2(1.0, 2.0, 3.0, 4.0);
mat2x4 h24 = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
void main() {
sk_FragColor.x = ((((f + h) + f2.x) + h3.x) + f22[0][0]) + h24[0][0];
sk_FragColor.x = ((((f + h) + f2.x) + h3.x) + f22[0].x) + h24[0].x;
}

View File

@ -83,7 +83,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
out_half3(h3);
float4 h4;
out_half4(h4);
/*needs swizzle fix*/ out_half(h3[1]);
/*needs swizzle fix*/ out_half(h3.y);
/*needs swizzle fix*/ out_half2(h3.xz);
/*needs swizzle fix*/ out_half4(h4.zwxy);
_out->sk_FragColor = float4(h, h2.x, h3.x, h4.x);
@ -96,7 +96,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
out_half3(h3x3[1]);
/*needs swizzle fix*/ out_half4(h4x4[3].zwxy);
out_half2(h2x2[0]);
_out->sk_FragColor = float4(h2x2[0][0], h3x3[0][0], h4x4[0][0], 1.0);
_out->sk_FragColor = float4(h2x2[0].x, h3x3[0].x, h4x4[0].x, 1.0);
int i;
out_int(i);
int2 i2;
@ -116,7 +116,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
float4 f4;
out_float4(f4);
/*needs swizzle fix*/ out_float2(f3.xy);
/*needs swizzle fix*/ out_float(f2[0]);
/*needs swizzle fix*/ out_float(f2.x);
_out->sk_FragColor = float4(f, f2.x, f3.x, f4.x);
float2x2 f2x2;
out_float2x2(f2x2);
@ -124,9 +124,9 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
out_float3x3(f3x3);
float4x4 f4x4;
out_float4x4(f4x4);
/*needs swizzle fix*/ out_float(f2x2[0][0]);
/*needs swizzle fix*/ out_float(f2x2[0].x);
out_float4(f4x4[1]);
_out->sk_FragColor = float4(f2x2[0][0], f3x3[0][0], f4x4[0][0], 1.0);
_out->sk_FragColor = float4(f2x2[0].x, f3x3[0].x, f4x4[0].x, 1.0);
bool b;
out_bool(b);
bool2 b2;
@ -136,7 +136,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
bool4 b4;
out_bool4(b4);
/*needs swizzle fix*/ out_bool2(b4.xw);
/*needs swizzle fix*/ out_bool(b3[2]);
/*needs swizzle fix*/ out_bool(b3.z);
_out->sk_FragColor = float4(b ? 1.0 : 0.0, b2.x ? 1.0 : 0.0, b3.x ? 1.0 : 0.0, b4.x ? 1.0 : 0.0);
return *_out;
}

View File

@ -1,8 +1,33 @@
void main() {
void non_constant_swizzle() {
int4 i = int4(int(sqrt(1)));
half4 v = half4(half(sqrt(1)));
half x = v[i[0]];
half y = v[i[1]];
half z = v[i[2]];
half w = v[i[3]];
sk_FragColor = half4(x, y, z, w);
}
void constant_swizzle() {
half4 v = half4(half(sqrt(1)));
half x = v[0];
half y = v[1];
half z = v[2];
half w = v[3];
sk_FragColor = half4(x,y,z,w);
sk_FragColor = half4(x, y, z, w);
}
void foldable() {
half4 v = half4(2);
half x = v[0];
half y = v[1];
half z = v[2];
half w = v[3];
sk_FragColor = half4(x, y, z, w);
}
void main() {
non_constant_swizzle();
constant_swizzle();
foldable();
}

View File

@ -4,5 +4,5 @@ float test1[] = float[](1.0, 2.0, 3.0, 4.0);
vec2 test2[] = vec2[](vec2(1.0, 2.0), vec2(3.0, 4.0));
mat4 test3[] = mat4[]();
void main() {
sk_FragColor.x = (test1[0] + test2[0].x) + test3[0][0][0];
sk_FragColor.x = (test1[0] + test2[0].x) + test3[0][0].x;
}

View File

@ -5,6 +5,6 @@ void main() {
vec3 v1 = mat3(1.0) * vec3(2.0);
vec3 v2 = vec3(2.0) * mat3(1.0);
sk_FragColor = vec4(z[0].x, v1 + v2);
mat2 m5 = mat2(mat2(1.0, 2.0, 3.0, 4.0)[0][0]);
sk_FragColor = vec4((((((((((mat2(1.0, 2.0, 3.0, 4.0)[0][0] + mat2(vec4(0.0))[0][0]) + mat2(1.0, 2.0, 3.0, 4.0)[0][0]) + mat2(1.0)[0][0]) + m5[0][0]) + mat2(1.0, 2.0, 3.0, 4.0)[0][0]) + mat2(5.0, 6.0, 7.0, 8.0)[0][0]) + mat3x2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)[0][0]) + mat3(1.0)[0][0]) + mat4(1.0)[0][0]) + mat4(2.0)[0][0]);
mat2 m5 = mat2(mat2(1.0, 2.0, 3.0, 4.0)[0].x);
sk_FragColor = vec4((((((((((mat2(1.0, 2.0, 3.0, 4.0)[0].x + mat2(vec4(0.0))[0].x) + mat2(1.0, 2.0, 3.0, 4.0)[0].x) + mat2(1.0)[0].x) + m5[0].x) + mat2(1.0, 2.0, 3.0, 4.0)[0].x) + mat2(5.0, 6.0, 7.0, 8.0)[0].x) + mat3x2(1.0, 2.0, 3.0, 4.0, 5.0, 6.0)[0].x) + mat3(1.0)[0].x) + mat4(1.0)[0].x) + mat4(2.0)[0].x);
}

View File

@ -16,7 +16,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
float3 v1 = float3x3(1.0) * float3(2.0);
float3 v2 = float3(2.0) * float3x3(1.0);
_out->sk_FragColor = float4(z[0].x, v1 + v2);
float2x2 m5 = float2x2(float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]);
_out->sk_FragColor = float4((((((((((float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0] + float2x2_from_float4(float4(0.0))[0][0]) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]) + float2x2(1.0)[0][0]) + m5[0][0]) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]) + float2x2(float2(5.0, 6.0), float2(7.0, 8.0))[0][0]) + float3x2(float2(1.0, 2.0), float2(3.0, 4.0), float2(5.0, 6.0))[0][0]) + float3x3(1.0)[0][0]) + float4x4(1.0)[0][0]) + float4x4(2.0)[0][0]);
float2x2 m5 = float2x2(float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0].x);
_out->sk_FragColor = float4((((((((((float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0].x + float2x2_from_float4(float4(0.0))[0].x) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0].x) + float2x2(1.0)[0].x) + m5[0].x) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0].x) + float2x2(float2(5.0, 6.0), float2(7.0, 8.0))[0].x) + float3x2(float2(1.0, 2.0), float2(3.0, 4.0), float2(5.0, 6.0))[0].x) + float3x3(1.0)[0].x) + float4x4(1.0)[0].x) + float4x4(2.0)[0].x);
return *_out;
}

View File

@ -42,12 +42,12 @@ OpDecorate %60 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %71 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %159 RelaxedPrecision
OpDecorate %164 RelaxedPrecision
OpDecorate %167 RelaxedPrecision
OpDecorate %72 RelaxedPrecision
OpDecorate %75 RelaxedPrecision
OpDecorate %78 RelaxedPrecision
OpDecorate %161 RelaxedPrecision
OpDecorate %166 RelaxedPrecision
OpDecorate %169 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -65,9 +65,9 @@ OpDecorate %167 RelaxedPrecision
%float_4 = OpConstant %float 4
%20 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_4
%float_1 = OpConstant %float 1
%_ptr_Function_float = OpTypePointer Function %float
%int = OpTypeInt 32 1
%int_1 = OpConstant %int 1
%_ptr_Function_float = OpTypePointer Function %float
%float_2 = OpConstant %float 2
%v2float = OpTypeVector %float 2
%27 = OpConstantComposite %v2float %float_2 %float_2
@ -86,31 +86,31 @@ OpDecorate %167 RelaxedPrecision
%v2int = OpTypeVector %int 2
%_ptr_Function_v2int = OpTypePointer Function %v2int
%int_2 = OpConstant %int 2
%83 = OpConstantComposite %v2int %int_2 %int_2
%84 = OpConstantComposite %v2int %int_2 %int_2
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%int_4 = OpConstant %int 4
%88 = OpConstantComposite %v4int %int_4 %int_4 %int_4 %int_4
%89 = OpConstantComposite %v4int %int_4 %int_4 %int_4 %int_4
%v3int = OpTypeVector %int 3
%90 = OpConstantComposite %v3int %int_3 %int_3 %int_3
%91 = OpConstantComposite %v3int %int_3 %int_3 %int_3
%_ptr_Function_int = OpTypePointer Function %int
%float_2_0 = OpConstant %float 2
%104 = OpConstantComposite %v2float %float_2_0 %float_2_0
%105 = OpConstantComposite %v2float %float_2_0 %float_2_0
%float_3_0 = OpConstant %float 3
%107 = OpConstantComposite %v3float %float_3_0 %float_3_0 %float_3_0
%109 = OpConstantComposite %v2float %float_2_0 %float_2_0
%108 = OpConstantComposite %v3float %float_3_0 %float_3_0 %float_3_0
%110 = OpConstantComposite %v2float %float_2_0 %float_2_0
%float_1_0 = OpConstant %float 1
%float_4_0 = OpConstant %float 4
%v3bool = OpTypeVector %bool 3
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
%true = OpConstantTrue %bool
%149 = OpConstantComposite %v3bool %true %true %true
%151 = OpConstantComposite %v3bool %true %true %true
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
%false = OpConstantFalse %bool
%154 = OpConstantComposite %v4bool %false %false %false %false
%156 = OpConstantComposite %v4bool %false %false %false %false
%v2bool = OpTypeVector %bool 2
%156 = OpConstantComposite %v2bool %false %false
%158 = OpConstantComposite %v2bool %false %false
%_ptr_Function_bool = OpTypePointer Function %bool
%float_0_0 = OpConstant %float 0
%main = OpFunction %void None %11
@ -125,14 +125,14 @@ OpDecorate %167 RelaxedPrecision
%f2 = OpVariable %_ptr_Function_v2float Function
%f3 = OpVariable %_ptr_Function_v3float Function
%f2x2 = OpVariable %_ptr_Function_mat2v2float Function
%128 = OpVariable %_ptr_Function_mat3v3float Function
%136 = OpVariable %_ptr_Function_mat4v4float Function
%130 = OpVariable %_ptr_Function_mat3v3float Function
%138 = OpVariable %_ptr_Function_mat4v4float Function
%b3 = OpVariable %_ptr_Function_v3bool Function
%b4 = OpVariable %_ptr_Function_v4bool Function
OpStore %h3 %16
OpStore %h4 %20
%25 = OpAccessChain %_ptr_Function_float %h3 %int_1
OpStore %25 %float_1
%23 = OpAccessChain %_ptr_Function_float %h3 %int_1
OpStore %23 %float_1
%30 = OpLoad %v3float %h3
%31 = OpVectorShuffle %v3float %30 %27 3 1 4
OpStore %h3 %31
@ -165,90 +165,92 @@ OpStore %63 %62
%65 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_3
%66 = OpAccessChain %_ptr_Function_float %65 %int_3
OpStore %66 %float_1
%68 = OpAccessChain %_ptr_Function_float %h2x2 %int_0 %int_0
OpStore %68 %float_1
%69 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
%71 = OpLoad %v2float %69
%72 = OpVectorExtractDynamic %float %71 %int_0
%73 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
%74 = OpLoad %v3float %73
%75 = OpVectorExtractDynamic %float %74 %int_0
%76 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
%77 = OpLoad %v4float %76
%78 = OpVectorExtractDynamic %float %77 %int_0
%79 = OpCompositeConstruct %v4float %72 %75 %78 %float_1
OpStore %sk_FragColor %79
OpStore %i2 %83
OpStore %i4 %88
%92 = OpLoad %v4int %i4
%93 = OpVectorShuffle %v4int %92 %90 4 5 6 3
OpStore %i4 %93
%94 = OpAccessChain %_ptr_Function_int %i2 %int_1
OpStore %94 %int_1
%97 = OpLoad %v2int %i2
%98 = OpCompositeExtract %int %97 0
%96 = OpConvertSToF %float %98
%100 = OpLoad %v4int %i4
%101 = OpCompositeExtract %int %100 0
%99 = OpConvertSToF %float %101
%102 = OpCompositeConstruct %v4float %float_1 %96 %float_3 %99
OpStore %sk_FragColor %102
OpStore %f2 %104
OpStore %f3 %107
%110 = OpLoad %v3float %f3
%111 = OpVectorShuffle %v3float %110 %109 3 4 2
OpStore %f3 %111
%113 = OpAccessChain %_ptr_Function_float %f2 %int_0
OpStore %113 %float_1_0
%114 = OpLoad %v2float %f2
%115 = OpCompositeExtract %float %114 0
%116 = OpLoad %v3float %f3
%117 = OpCompositeExtract %float %116 0
%119 = OpCompositeConstruct %v4float %float_1_0 %115 %117 %float_4_0
OpStore %sk_FragColor %119
%122 = OpCompositeConstruct %v2float %float_2_0 %float_0
%123 = OpCompositeConstruct %v2float %float_0 %float_2_0
%121 = OpCompositeConstruct %mat2v2float %122 %123
OpStore %f2x2 %121
%124 = OpAccessChain %_ptr_Function_float %f2x2 %int_0 %int_0
OpStore %124 %float_1_0
%68 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
%70 = OpAccessChain %_ptr_Function_float %68 %int_0
OpStore %70 %float_1
%71 = OpAccessChain %_ptr_Function_v2float %h2x2 %int_0
%72 = OpLoad %v2float %71
%73 = OpCompositeExtract %float %72 0
%74 = OpAccessChain %_ptr_Function_v3float %h3x3 %int_0
%75 = OpLoad %v3float %74
%76 = OpCompositeExtract %float %75 0
%77 = OpAccessChain %_ptr_Function_v4float %h4x4 %int_0
%78 = OpLoad %v4float %77
%79 = OpCompositeExtract %float %78 0
%80 = OpCompositeConstruct %v4float %73 %76 %79 %float_1
OpStore %sk_FragColor %80
OpStore %i2 %84
OpStore %i4 %89
%93 = OpLoad %v4int %i4
%94 = OpVectorShuffle %v4int %93 %91 4 5 6 3
OpStore %i4 %94
%95 = OpAccessChain %_ptr_Function_int %i2 %int_1
OpStore %95 %int_1
%98 = OpLoad %v2int %i2
%99 = OpCompositeExtract %int %98 0
%97 = OpConvertSToF %float %99
%101 = OpLoad %v4int %i4
%102 = OpCompositeExtract %int %101 0
%100 = OpConvertSToF %float %102
%103 = OpCompositeConstruct %v4float %float_1 %97 %float_3 %100
OpStore %sk_FragColor %103
OpStore %f2 %105
OpStore %f3 %108
%111 = OpLoad %v3float %f3
%112 = OpVectorShuffle %v3float %111 %110 3 4 2
OpStore %f3 %112
%114 = OpAccessChain %_ptr_Function_float %f2 %int_0
OpStore %114 %float_1_0
%115 = OpLoad %v2float %f2
%116 = OpCompositeExtract %float %115 0
%117 = OpLoad %v3float %f3
%118 = OpCompositeExtract %float %117 0
%120 = OpCompositeConstruct %v4float %float_1_0 %116 %118 %float_4_0
OpStore %sk_FragColor %120
%123 = OpCompositeConstruct %v2float %float_2_0 %float_0
%124 = OpCompositeConstruct %v2float %float_0 %float_2_0
%122 = OpCompositeConstruct %mat2v2float %123 %124
OpStore %f2x2 %122
%125 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
%126 = OpLoad %v2float %125
%127 = OpVectorExtractDynamic %float %126 %int_0
%130 = OpCompositeConstruct %v3float %float_3_0 %float_0 %float_0
%131 = OpCompositeConstruct %v3float %float_0 %float_3_0 %float_0
%132 = OpCompositeConstruct %v3float %float_0 %float_0 %float_3_0
%129 = OpCompositeConstruct %mat3v3float %130 %131 %132
OpStore %128 %129
%133 = OpAccessChain %_ptr_Function_v3float %128 %int_0
%134 = OpLoad %v3float %133
%135 = OpVectorExtractDynamic %float %134 %int_0
%138 = OpCompositeConstruct %v4float %float_4_0 %float_0 %float_0 %float_0
%139 = OpCompositeConstruct %v4float %float_0 %float_4_0 %float_0 %float_0
%140 = OpCompositeConstruct %v4float %float_0 %float_0 %float_4_0 %float_0
%141 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_4_0
%137 = OpCompositeConstruct %mat4v4float %138 %139 %140 %141
OpStore %136 %137
%142 = OpAccessChain %_ptr_Function_v4float %136 %int_0
%143 = OpLoad %v4float %142
%144 = OpVectorExtractDynamic %float %143 %int_0
%145 = OpCompositeConstruct %v4float %127 %135 %144 %float_1
OpStore %sk_FragColor %145
OpStore %b3 %149
OpStore %b4 %154
%158 = OpLoad %v4bool %b4
%159 = OpVectorShuffle %v4bool %158 %156 4 1 2 5
OpStore %b4 %159
%160 = OpAccessChain %_ptr_Function_bool %b3 %int_2
OpStore %160 %true
%162 = OpSelect %float %false %float_1 %float_0_0
%164 = OpLoad %v3bool %b3
%165 = OpCompositeExtract %bool %164 0
%166 = OpSelect %float %165 %float_1 %float_0_0
%167 = OpLoad %v4bool %b4
%168 = OpCompositeExtract %bool %167 0
%169 = OpSelect %float %168 %float_1 %float_0_0
%170 = OpCompositeConstruct %v4float %float_1 %162 %166 %169
OpStore %sk_FragColor %170
%126 = OpAccessChain %_ptr_Function_float %125 %int_0
OpStore %126 %float_1_0
%127 = OpAccessChain %_ptr_Function_v2float %f2x2 %int_0
%128 = OpLoad %v2float %127
%129 = OpCompositeExtract %float %128 0
%132 = OpCompositeConstruct %v3float %float_3_0 %float_0 %float_0
%133 = OpCompositeConstruct %v3float %float_0 %float_3_0 %float_0
%134 = OpCompositeConstruct %v3float %float_0 %float_0 %float_3_0
%131 = OpCompositeConstruct %mat3v3float %132 %133 %134
OpStore %130 %131
%135 = OpAccessChain %_ptr_Function_v3float %130 %int_0
%136 = OpLoad %v3float %135
%137 = OpCompositeExtract %float %136 0
%140 = OpCompositeConstruct %v4float %float_4_0 %float_0 %float_0 %float_0
%141 = OpCompositeConstruct %v4float %float_0 %float_4_0 %float_0 %float_0
%142 = OpCompositeConstruct %v4float %float_0 %float_0 %float_4_0 %float_0
%143 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_4_0
%139 = OpCompositeConstruct %mat4v4float %140 %141 %142 %143
OpStore %138 %139
%144 = OpAccessChain %_ptr_Function_v4float %138 %int_0
%145 = OpLoad %v4float %144
%146 = OpCompositeExtract %float %145 0
%147 = OpCompositeConstruct %v4float %129 %137 %146 %float_1
OpStore %sk_FragColor %147
OpStore %b3 %151
OpStore %b4 %156
%160 = OpLoad %v4bool %b4
%161 = OpVectorShuffle %v4bool %160 %158 4 1 2 5
OpStore %b4 %161
%162 = OpAccessChain %_ptr_Function_bool %b3 %int_2
OpStore %162 %true
%164 = OpSelect %float %false %float_1 %float_0_0
%166 = OpLoad %v3bool %b3
%167 = OpCompositeExtract %bool %166 0
%168 = OpSelect %float %167 %float_1 %float_0_0
%169 = OpLoad %v4bool %b4
%170 = OpCompositeExtract %bool %169 0
%171 = OpSelect %float %170 %float_1 %float_0_0
%172 = OpCompositeConstruct %v4float %float_1 %164 %168 %171
OpStore %sk_FragColor %172
OpReturn
OpFunctionEnd

View File

@ -12,7 +12,7 @@ void main() {
}
{
h3[1] = 1.0;
h3.y = 1.0;
}
{
@ -48,10 +48,10 @@ void main() {
}
{
h2x2[0][0] = 1.0;
h2x2[0].x = 1.0;
}
sk_FragColor = vec4(h2x2[0][0], h3x3[0][0], h4x4[0][0], 1.0);
sk_FragColor = vec4(h2x2[0].x, h3x3[0].x, h4x4[0].x, 1.0);
ivec2 i2;
{
i2 = ivec2(2);
@ -67,7 +67,7 @@ void main() {
}
{
i2[1] = 1;
i2.y = 1;
}
sk_FragColor = vec4(1.0, float(i2.x), 3.0, float(i4.x));
@ -86,7 +86,7 @@ void main() {
}
{
f2[0] = 1.0;
f2.x = 1.0;
}
sk_FragColor = vec4(1.0, f2.x, f3.x, 4.0);
@ -96,10 +96,10 @@ void main() {
}
{
f2x2[0][0] = 1.0;
f2x2[0].x = 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].x, mat3(3.0)[0].x, mat4(4.0)[0].x, 1.0);
bvec3 b3;
{
b3 = bvec3(true);
@ -115,7 +115,7 @@ void main() {
}
{
b3[2] = true;
b3.z = true;
}
sk_FragColor = vec4(1.0, false ? 1.0 : 0.0, b3.x ? 1.0 : 0.0, b4.x ? 1.0 : 0.0);

View File

@ -20,7 +20,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
h3[1] = 1.0;
h3.y = 1.0;
}
{
@ -56,10 +56,10 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
h2x2[0][0] = 1.0;
h2x2[0].x = 1.0;
}
_out->sk_FragColor = float4(h2x2[0][0], h3x3[0][0], h4x4[0][0], 1.0);
_out->sk_FragColor = float4(h2x2[0].x, h3x3[0].x, h4x4[0].x, 1.0);
int2 i2;
{
i2 = int2(2);
@ -75,7 +75,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
i2[1] = 1;
i2.y = 1;
}
_out->sk_FragColor = float4(1.0, float(i2.x), 3.0, float(i4.x));
@ -94,7 +94,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
f2[0] = 1.0;
f2.x = 1.0;
}
_out->sk_FragColor = float4(1.0, f2.x, f3.x, 4.0);
@ -104,10 +104,10 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
f2x2[0][0] = 1.0;
f2x2[0].x = 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].x, float3x3(3.0)[0].x, float4x4(4.0)[0].x, 1.0);
bool3 b3;
{
b3 = bool3(true);
@ -123,7 +123,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
}
{
b3[2] = true;
b3.z = true;
}
_out->sk_FragColor = float4(1.0, bool(false) ? 1.0 : 0.0, b3.x ? 1.0 : 0.0, b4.x ? 1.0 : 0.0);

View File

@ -1,15 +1,15 @@
out vec4 sk_FragColor;
void main() {
sk_FragColor.x = mat2(mat3(1.0))[0][0];
sk_FragColor.x = mat2(mat4(1.0))[0][0];
sk_FragColor.x = mat3(mat4(1.0))[0][0];
sk_FragColor.x = mat3(mat2(1.0))[0][0];
sk_FragColor.x = mat3(mat2x3(1.0))[0][0];
sk_FragColor.x = mat3(mat3x2(1.0))[0][0];
sk_FragColor.x = mat4(mat3(mat2(1.0)))[0][0];
sk_FragColor.x = mat4(mat4x3(mat4x2(1.0)))[0][0];
sk_FragColor.x = mat4(mat3x4(mat2x4(1.0)))[0][0];
sk_FragColor.x = mat2x4(mat4x2(1.0))[0][0];
sk_FragColor.x = mat4x2(mat2x4(1.0))[0][0];
sk_FragColor.x = mat2(mat3(1.0))[0].x;
sk_FragColor.x = mat2(mat4(1.0))[0].x;
sk_FragColor.x = mat3(mat4(1.0))[0].x;
sk_FragColor.x = mat3(mat2(1.0))[0].x;
sk_FragColor.x = mat3(mat2x3(1.0))[0].x;
sk_FragColor.x = mat3(mat3x2(1.0))[0].x;
sk_FragColor.x = mat4(mat3(mat2(1.0)))[0].x;
sk_FragColor.x = mat4(mat4x3(mat4x2(1.0)))[0].x;
sk_FragColor.x = mat4(mat3x4(mat2x4(1.0)))[0].x;
sk_FragColor.x = mat2x4(mat4x2(1.0))[0].x;
sk_FragColor.x = mat4x2(mat2x4(1.0))[0].x;
}

View File

@ -48,16 +48,16 @@ float4x2 float4x2_from_float2x4(float2x4 x0) {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float2x2_from_float3x3(float3x3(1.0))[0][0];
_out->sk_FragColor.x = float2x2_from_float4x4(float4x4(1.0))[0][0];
_out->sk_FragColor.x = float3x3_from_float4x4(float4x4(1.0))[0][0];
_out->sk_FragColor.x = float3x3_from_float2x2(float2x2(1.0))[0][0];
_out->sk_FragColor.x = float3x3_from_float2x3(float2x3(1.0))[0][0];
_out->sk_FragColor.x = float3x3_from_float3x2(float3x2(1.0))[0][0];
_out->sk_FragColor.x = float4x4_from_float3x3(float3x3_from_float2x2(float2x2(1.0)))[0][0];
_out->sk_FragColor.x = float4x4_from_float4x3(float4x3_from_float4x2(float4x2(1.0)))[0][0];
_out->sk_FragColor.x = float4x4_from_float3x4(float3x4_from_float2x4(float2x4(1.0)))[0][0];
_out->sk_FragColor.x = float2x4_from_float4x2(float4x2(1.0))[0][0];
_out->sk_FragColor.x = float4x2_from_float2x4(float2x4(1.0))[0][0];
_out->sk_FragColor.x = float2x2_from_float3x3(float3x3(1.0))[0].x;
_out->sk_FragColor.x = float2x2_from_float4x4(float4x4(1.0))[0].x;
_out->sk_FragColor.x = float3x3_from_float4x4(float4x4(1.0))[0].x;
_out->sk_FragColor.x = float3x3_from_float2x2(float2x2(1.0))[0].x;
_out->sk_FragColor.x = float3x3_from_float2x3(float2x3(1.0))[0].x;
_out->sk_FragColor.x = float3x3_from_float3x2(float3x2(1.0))[0].x;
_out->sk_FragColor.x = float4x4_from_float3x3(float3x3_from_float2x2(float2x2(1.0)))[0].x;
_out->sk_FragColor.x = float4x4_from_float4x3(float4x3_from_float4x2(float4x2(1.0)))[0].x;
_out->sk_FragColor.x = float4x4_from_float3x4(float3x4_from_float2x4(float2x4(1.0)))[0].x;
_out->sk_FragColor.x = float2x4_from_float4x2(float4x2(1.0))[0].x;
_out->sk_FragColor.x = float4x2_from_float2x4(float2x4(1.0))[0].x;
return *_out;
}

View File

@ -6,24 +6,38 @@ OpExecutionMode %main OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
OpName %main "main"
OpName %v "v"
OpName %x "x"
OpName %y "y"
OpName %z "z"
OpName %w "w"
OpName %_0_i "_0_i"
OpName %_1_v "_1_v"
OpName %_2_x "_2_x"
OpName %_3_y "_3_y"
OpName %_4_z "_4_z"
OpName %_5_w "_5_w"
OpName %_6_v "_6_v"
OpName %_7_x "_7_x"
OpName %_8_y "_8_y"
OpName %_9_z "_9_z"
OpName %_10_w "_10_w"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
OpDecorate %sk_Clockwise RelaxedPrecision
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpDecorate %20 RelaxedPrecision
OpDecorate %25 RelaxedPrecision
OpDecorate %29 RelaxedPrecision
OpDecorate %33 RelaxedPrecision
OpDecorate %36 RelaxedPrecision
OpDecorate %27 RelaxedPrecision
OpDecorate %32 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %46 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %49 RelaxedPrecision
OpDecorate %55 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %64 RelaxedPrecision
OpDecorate %66 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -33,41 +47,81 @@ OpDecorate %39 RelaxedPrecision
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%void = OpTypeVoid
%11 = OpTypeFunction %void
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_1 = OpConstant %float 1
%_ptr_Function_float = OpTypePointer Function %float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%float_1 = OpConstant %float 1
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Function_float = OpTypePointer Function %float
%float_2 = OpConstant %float 2
%71 = OpConstantComposite %v4float %float_2 %float_2 %float_2 %float_2
%main = OpFunction %void None %11
%12 = OpLabel
%v = OpVariable %_ptr_Function_v4float Function
%x = OpVariable %_ptr_Function_float Function
%y = OpVariable %_ptr_Function_float Function
%z = OpVariable %_ptr_Function_float Function
%w = OpVariable %_ptr_Function_float Function
%15 = OpExtInst %float %1 Sqrt %float_1
%17 = OpCompositeConstruct %v4float %15 %15 %15 %15
OpStore %v %17
%20 = OpLoad %v4float %v
%23 = OpVectorExtractDynamic %float %20 %int_0
OpStore %x %23
%25 = OpLoad %v4float %v
%27 = OpVectorExtractDynamic %float %25 %int_1
OpStore %y %27
%29 = OpLoad %v4float %v
%31 = OpVectorExtractDynamic %float %29 %int_2
OpStore %z %31
%33 = OpLoad %v4float %v
%35 = OpVectorExtractDynamic %float %33 %int_3
OpStore %w %35
%36 = OpLoad %float %x
%37 = OpLoad %float %y
%38 = OpLoad %float %z
%39 = OpLoad %float %w
%40 = OpCompositeConstruct %v4float %36 %37 %38 %39
OpStore %sk_FragColor %40
%_0_i = OpVariable %_ptr_Function_v4int Function
%_1_v = OpVariable %_ptr_Function_v4float Function
%_2_x = OpVariable %_ptr_Function_float Function
%_3_y = OpVariable %_ptr_Function_float Function
%_4_z = OpVariable %_ptr_Function_float Function
%_5_w = OpVariable %_ptr_Function_float Function
%_6_v = OpVariable %_ptr_Function_v4float Function
%_7_x = OpVariable %_ptr_Function_float Function
%_8_y = OpVariable %_ptr_Function_float Function
%_9_z = OpVariable %_ptr_Function_float Function
%_10_w = OpVariable %_ptr_Function_float Function
%18 = OpExtInst %float %1 Sqrt %float_1
%17 = OpConvertFToS %int %18
%20 = OpCompositeConstruct %v4int %17 %17 %17 %17
OpStore %_0_i %20
%23 = OpExtInst %float %1 Sqrt %float_1
%24 = OpCompositeConstruct %v4float %23 %23 %23 %23
OpStore %_1_v %24
%27 = OpLoad %v4float %_1_v
%28 = OpLoad %v4int %_0_i
%29 = OpCompositeExtract %int %28 0
%30 = OpVectorExtractDynamic %float %27 %29
OpStore %_2_x %30
%32 = OpLoad %v4float %_1_v
%33 = OpLoad %v4int %_0_i
%34 = OpCompositeExtract %int %33 1
%35 = OpVectorExtractDynamic %float %32 %34
OpStore %_3_y %35
%37 = OpLoad %v4float %_1_v
%38 = OpLoad %v4int %_0_i
%39 = OpCompositeExtract %int %38 2
%40 = OpVectorExtractDynamic %float %37 %39
OpStore %_4_z %40
%42 = OpLoad %v4float %_1_v
%43 = OpLoad %v4int %_0_i
%44 = OpCompositeExtract %int %43 3
%45 = OpVectorExtractDynamic %float %42 %44
OpStore %_5_w %45
%46 = OpLoad %float %_2_x
%47 = OpLoad %float %_3_y
%48 = OpLoad %float %_4_z
%49 = OpLoad %float %_5_w
%50 = OpCompositeConstruct %v4float %46 %47 %48 %49
OpStore %sk_FragColor %50
%52 = OpExtInst %float %1 Sqrt %float_1
%53 = OpCompositeConstruct %v4float %52 %52 %52 %52
OpStore %_6_v %53
%55 = OpLoad %v4float %_6_v
%56 = OpCompositeExtract %float %55 0
OpStore %_7_x %56
%58 = OpLoad %v4float %_6_v
%59 = OpCompositeExtract %float %58 1
OpStore %_8_y %59
%61 = OpLoad %v4float %_6_v
%62 = OpCompositeExtract %float %61 2
OpStore %_9_z %62
%64 = OpLoad %v4float %_6_v
%65 = OpCompositeExtract %float %64 3
OpStore %_10_w %65
%66 = OpLoad %float %_7_x
%67 = OpLoad %float %_8_y
%68 = OpLoad %float %_9_z
%69 = OpLoad %float %_10_w
%70 = OpCompositeConstruct %v4float %66 %67 %68 %69
OpStore %sk_FragColor %70
OpStore %sk_FragColor %71
OpReturn
OpFunctionEnd

View File

@ -1,10 +1,27 @@
out vec4 sk_FragColor;
void main() {
vec4 v = vec4(sqrt(1.0));
float x = v[0];
float y = v[1];
float z = v[2];
float w = v[3];
sk_FragColor = vec4(x, y, z, w);
{
ivec4 _0_i = ivec4(int(sqrt(1.0)));
vec4 _1_v = vec4(sqrt(1.0));
float _2_x = _1_v[_0_i.x];
float _3_y = _1_v[_0_i.y];
float _4_z = _1_v[_0_i.z];
float _5_w = _1_v[_0_i.w];
sk_FragColor = vec4(_2_x, _3_y, _4_z, _5_w);
}
{
vec4 _6_v = vec4(sqrt(1.0));
float _7_x = _6_v.x;
float _8_y = _6_v.y;
float _9_z = _6_v.z;
float _10_w = _6_v.w;
sk_FragColor = vec4(_7_x, _8_y, _9_z, _10_w);
}
{
sk_FragColor = vec4(2.0, 2.0, 2.0, 2.0);
}
}

View File

@ -9,11 +9,28 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
float4 v = float4(sqrt(1.0));
float x = v[0];
float y = v[1];
float z = v[2];
float w = v[3];
_out->sk_FragColor = float4(x, y, z, w);
{
int4 _0_i = int4(int(sqrt(1.0)));
float4 _1_v = float4(sqrt(1.0));
float _2_x = _1_v[_0_i.x];
float _3_y = _1_v[_0_i.y];
float _4_z = _1_v[_0_i.z];
float _5_w = _1_v[_0_i.w];
_out->sk_FragColor = float4(_2_x, _3_y, _4_z, _5_w);
}
{
float4 _6_v = float4(sqrt(1.0));
float _7_x = _6_v.x;
float _8_y = _6_v.y;
float _9_z = _6_v.z;
float _10_w = _6_v.w;
_out->sk_FragColor = float4(_7_x, _8_y, _9_z, _10_w);
}
{
_out->sk_FragColor = float4(2.0, 2.0, 2.0, 2.0);
}
return *_out;
}