Performance experiment: disable control-flow analysis.

This CL will be used to test for potential performance regressions (or
improvements) that we might cause by disabling this optimization pass.

It will be reverted in ~1 day.

Change-Id: I26b7687c341eb6d81231406381c39869cfccf6d6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/381259
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
John Stiles 2021-03-08 13:29:15 -05:00 committed by Skia Commit-Bot
parent c8e31ea399
commit 7a3f5506b6
223 changed files with 7670 additions and 4637 deletions

View File

@ -29,13 +29,13 @@ public:
R"SkSL(half4 c = %s;
half4 p = c.y < c.z ? half4(c.zy, -1.0, 0.66666668653488159) : half4(c.yz, 0.0, -0.3333333432674408);
half4 q = c.x < p.x ? half4(p.x, c.x, p.yw) : half4(c.x, p.x, p.yz);
;
half eps = 9.9999997473787516e-05;
half pmV = q.x;
half pmC = pmV - min(q.y, q.z);
half pmL = pmV - pmC * 0.5;
half H = abs(q.w + (q.y - q.z) / (pmC * 6.0 + 9.9999997473787516e-05));
half S = pmC / ((c.w + 9.9999997473787516e-05) - abs(pmL * 2.0 - c.w));
half L = pmL / (c.w + 9.9999997473787516e-05);
half H = abs(q.w + (q.y - q.z) / (pmC * 6.0 + eps));
half S = pmC / ((c.w + eps) - abs(pmL * 2.0 - c.w));
half L = pmL / (c.w + eps);
return half4(H, S, L, c.w);
)SkSL",
_sample0.c_str());

View File

@ -76,7 +76,7 @@ namespace SkSL {
// These flags allow tools like Viewer or Nanobench to override the compiler's ProgramSettings.
bool gSkSLOptimizer = true;
bool gSkSLInliner = true;
bool gSkSLControlFlowAnalysis = true;
bool gSkSLControlFlowAnalysis = false;
using RefKind = VariableReference::RefKind;

View File

@ -96,14 +96,6 @@ DEF_TEST(SkRuntimeEffectInvalid_SkCapsDisallowed, r) {
"unknown identifier 'sk_Caps'");
}
DEF_TEST(SkRuntimeEffectInvalid_LateErrors, r) {
// Errors that aren't caught until later in the compilation process (during optimize())
test_invalid_effect(r, "half4 main() { return half4(1); return half4(0); }", "unreachable");
test_invalid_effect(r, "half4 badFunc() {}"
"half4 main() { return badFunc(); }",
"without returning");
}
DEF_TEST(SkRuntimeEffectInvalidColorFilters, r) {
auto test = [r](const char* sksl) {
auto [effect, errorText] = SkRuntimeEffect::Make(SkString(sksl));

View File

@ -1,6 +1,10 @@
### Compilation failed:
error: 6: division by zero
error: 7: division by zero
error: 8: division by zero
3 errors
uniform float unknownInput;
void main() {
int inlineTest = 0 / 0;
inlineTest = (ivec4(0) / 0).x;
inlineTest = int(unknownInput) / 0;
}

View File

@ -1,4 +1,5 @@
### Compilation failed:
error: 1: 'i' has not been assigned
1 error
void main() {
int i;
ivec3(i--);
}

View File

@ -1,4 +1,2 @@
### Compilation failed:
error: 3: static switch contains non-static conditional exit
1 error
out vec4 sk_FragColor;

View File

@ -1,7 +1,5 @@
### Compilation failed:
error: 1: unreachable
error: 2: unreachable
error: 3: unreachable
error: 4: unreachable
4 errors
void call_after_return() {
return;
call_after_return();
}

View File

@ -1,4 +1 @@
### Compilation failed:
error: 1: 'i' has not been assigned
1 error

View File

@ -1,4 +1 @@
### Compilation failed:
error: 1: 'x' has not been assigned
1 error

View File

@ -1,4 +1 @@
### Compilation failed:
error: 1: 'x' has not been assigned
1 error

View File

@ -1,4 +1,2 @@
### Compilation failed:
error: 7: 'x' has not been assigned
1 error
out vec4 sk_FragColor;

View File

@ -1,4 +1 @@
### Compilation failed:
error: 1: 'r' has not been assigned
1 error

View File

@ -1,4 +1 @@
### Compilation failed:
error: 1: 'x' has not been assigned
1 error

View File

@ -5,26 +5,26 @@ uniform vec4 colorGreen;
vec4 main() {
bool ok = true;
int a = 1;
a = 2;
a = a + a;
a += a;
a = a + a;
a += a;
a = a + a;
ok = a == 32;
ok = ok && a == 32;
int b = 10;
b = 8;
b = b - 2;
b -= 2;
b = b - 1;
b -= 3;
ok = ok && b == 2;
int c = 2;
c = 4;
c = c * c;
c *= c;
c = c * 4;
c *= 2;
ok = ok && c == 128;
int d = 256;
d = 128;
d = d / 2;
d /= 2;
d = d / 4;
d /= 4;

View File

@ -3,6 +3,16 @@ out vec4 sk_FragColor;
uniform vec4 colorRed;
uniform vec4 colorGreen;
vec4 main() {
return colorGreen;
bool _0_a = true;
bool _1_b = false;
bool _2_c = true;
bool _3_d = false;
bool _4_e = true;
bool _5_f = false;
bool _6_g = true;
bool _7_h = false;
bool _8_i = true;
bool _9_j = false;
return ((((((((_0_a && !_1_b) && _2_c) && !_3_d) && _4_e) && !_5_f) && _6_g) && !_7_h) && _8_i) && !_9_j ? colorGreen : colorRed;
}

View File

@ -5,55 +5,58 @@ uniform vec4 colorGreen;
vec4 main() {
bool _0_ok = true;
float _1_x = 34.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 34.0;
_1_x = 30.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 30.0;
_1_x = 64.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 64.0;
_1_x = 16.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 16.0;
_1_x = 19.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 19.0;
_1_x = 1.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 1.0;
_1_x = -2.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -2.0;
_1_x = 3.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 3.0;
_1_x = -4.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -4.0;
_1_x = 5.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 5.0;
_1_x = -6.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -6.0;
_1_x = 7.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 7.0;
_1_x = -8.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -8.0;
_1_x = 9.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 9.0;
_1_x = -10.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -10.0;
_1_x = 11.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == 11.0;
_1_x = -12.0;
_0_ok = true;
_0_ok = _0_ok && _1_x == -12.0;
float _2_unknown = sqrt(4.0);
_1_x = _2_unknown;
_0_ok = _1_x == _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = 0.0;
_0_ok = _0_ok && _1_x == 0.0;
_1_x = _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = 0.0;
_0_ok = _0_ok && _1_x == 0.0;
_1_x = _2_unknown;
_0_ok = _0_ok && _1_x == _2_unknown;
_1_x = 0.0;
_0_ok = _0_ok && _1_x == 0.0;
_1_x += 1.0;
_0_ok = _0_ok && _1_x == 1.0;
_0_ok = _0_ok && _1_x == 1.0;

View File

@ -7,52 +7,55 @@ vec4 main() {
int _0_unknown = int(unknownInput);
bool _1_ok = true;
int _2_x = 34;
_1_ok = true;
_1_ok = _1_ok && _2_x == 34;
_2_x = 30;
_1_ok = true;
_1_ok = _1_ok && _2_x == 30;
_2_x = 64;
_1_ok = true;
_1_ok = _1_ok && _2_x == 64;
_2_x = 16;
_1_ok = true;
_1_ok = _1_ok && _2_x == 16;
_2_x = 1;
_1_ok = true;
_1_ok = _1_ok && _2_x == 1;
_2_x = -2;
_1_ok = true;
_1_ok = _1_ok && _2_x == -2;
_2_x = 3;
_1_ok = true;
_1_ok = _1_ok && _2_x == 3;
_2_x = -4;
_1_ok = true;
_1_ok = _1_ok && _2_x == -4;
_2_x = 5;
_1_ok = true;
_1_ok = _1_ok && _2_x == 5;
_2_x = -6;
_1_ok = true;
_1_ok = _1_ok && _2_x == -6;
_2_x = 7;
_1_ok = true;
_1_ok = _1_ok && _2_x == 7;
_2_x = -8;
_1_ok = true;
_1_ok = _1_ok && _2_x == -8;
_2_x = 9;
_1_ok = true;
_1_ok = _1_ok && _2_x == 9;
_2_x = -10;
_1_ok = true;
_1_ok = _1_ok && _2_x == -10;
_2_x = 11;
_1_ok = true;
_1_ok = _1_ok && _2_x == 11;
_2_x = -12;
_1_ok = true;
_1_ok = _1_ok && _2_x == -12;
_2_x = _0_unknown;
_1_ok = _2_x == _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = 0;
_1_ok = _1_ok && _2_x == 0;
_2_x = _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = 0;
_1_ok = _1_ok && _2_x == 0;
_2_x = _0_unknown;
_1_ok = _1_ok && _2_x == _0_unknown;
_2_x = 0;
_1_ok = _1_ok && _2_x == 0;
_2_x += 1;
_1_ok = _1_ok && _2_x == 1;
_1_ok = _1_ok && _2_x == 1;

View File

@ -3,6 +3,21 @@ out vec4 sk_FragColor;
uniform vec4 colorRed;
uniform vec4 colorGreen;
vec4 main() {
return colorGreen;
bool _0_ok = true;
int _1_x = 14;
_0_ok = _0_ok && _1_x == 14;
_1_x = 6;
_0_ok = _0_ok && _1_x == 6;
_1_x = 5;
_0_ok = _0_ok && _1_x == 5;
_1_x = 16;
_0_ok = _0_ok && _1_x == 16;
_1_x = -8;
_0_ok = _0_ok && _1_x == -8;
_1_x = 32;
_0_ok = _0_ok && _1_x == 32;
_1_x = 33;
_0_ok = _0_ok && _1_x == 33;
return _0_ok ? colorGreen : colorRed;
}

View File

@ -3,6 +3,7 @@ out vec4 sk_FragColor;
uniform vec4 colorRed;
uniform vec4 colorGreen;
vec4 main() {
return colorGreen;
bool _0_ok = true;
return _0_ok ? colorGreen : colorRed;
}

View File

@ -3,6 +3,7 @@ out vec4 sk_FragColor;
uniform vec4 colorRed;
uniform vec4 colorGreen;
vec4 main() {
return colorGreen;
bool _0_ok = true;
return _0_ok ? colorGreen : colorRed;
}

View File

@ -8,7 +8,7 @@ struct S {
};
vec4 main() {
vec4 x = vec4(3.0, 2.0, 1.0, 0.0);
x.xyz = vec3(1.0, 2.0, 3.0);
x.xyz = x.zyx;
S s;
s.i = 2.0;
s.j = 2.0;

View File

@ -6,30 +6,38 @@ uniform float unknownInput;
bool test_int() {
bool ok = true;
ivec4 x = ivec4(6, 6, 7, 8);
ok = true;
ok = ok && x == ivec4(6, 6, 7, 8);
x = ivec4(7, 9, 9, 9);
ok = true;
ok = ok && x == ivec4(7, 9, 9, 9);
x = ivec4(9, 9, 10, 10);
ok = true;
ok = ok && x == ivec4(9, 9, 10, 10);
x.xyz = ivec3(6, 6, 6);
ok = x == ivec4(6, 6, 6, 10);
ok = ok && x == ivec4(6, 6, 6, 10);
x.xy = ivec2(3, 3);
ok = ok && x == ivec4(3, 3, 6, 10);
x = ivec4(6, 6, 6, 6);
ok = ok && x == ivec4(6);
x = ivec4(6, 6, 7, 8);
ok = ok && x == ivec4(6, 6, 7, 8);
x = ivec4(-7, -9, -9, -9);
ok = ok && x == ivec4(-7, -9, -9, -9);
x = ivec4(9, 9, 10, 10);
ok = ok && x == ivec4(9, 9, 10, 10);
x.xyz = ivec3(6, 6, 6);
ok = ok && x == ivec4(6, 6, 6, 10);
x.xy = ivec2(8, 8);
ok = ok && x == ivec4(8, 8, 6, 10);
x = ivec4(200, 100, 50, 25);
ok = ok && x == ivec4(200, 100, 50, 25);
x = ivec4(6, 6, 6, 6);
ok = ok && x == ivec4(6);
int unknown = int(unknownInput);
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(0);
ok = ok && x == ivec4(0);
x = ivec4(0);
ok = ok && x == ivec4(0);
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(unknown);
@ -43,12 +51,15 @@ bool test_int() {
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(0);
ok = ok && x == ivec4(0);
x = ivec4(0);
ok = ok && x == ivec4(0);
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(0);
ok = ok && x == ivec4(0);
x = ivec4(unknown);
ok = ok && x == ivec4(unknown);
x = ivec4(unknown);
@ -66,30 +77,38 @@ bool test_int() {
vec4 main() {
bool _0_ok = true;
vec4 _1_x = vec4(6.0, 6.0, 7.0, 8.0);
_0_ok = true;
_0_ok = _0_ok && _1_x == vec4(6.0, 6.0, 7.0, 8.0);
_1_x = vec4(7.0, 9.0, 9.0, 9.0);
_0_ok = true;
_0_ok = _0_ok && _1_x == vec4(7.0, 9.0, 9.0, 9.0);
_1_x = vec4(9.0, 9.0, 10.0, 10.0);
_0_ok = true;
_0_ok = _0_ok && _1_x == vec4(9.0, 9.0, 10.0, 10.0);
_1_x.xyz = vec3(6.0, 6.0, 6.0);
_0_ok = _1_x == vec4(6.0, 6.0, 6.0, 10.0);
_0_ok = _0_ok && _1_x == vec4(6.0, 6.0, 6.0, 10.0);
_1_x.xy = vec2(3.0, 3.0);
_0_ok = _0_ok && _1_x == vec4(3.0, 3.0, 6.0, 10.0);
_1_x = vec4(6.0, 6.0, 6.0, 6.0);
_0_ok = _0_ok && _1_x == vec4(6.0);
_1_x = vec4(6.0, 6.0, 7.0, 8.0);
_0_ok = _0_ok && _1_x == vec4(6.0, 6.0, 7.0, 8.0);
_1_x = vec4(-7.0, -9.0, -9.0, -9.0);
_0_ok = _0_ok && _1_x == vec4(-7.0, -9.0, -9.0, -9.0);
_1_x = vec4(9.0, 9.0, 10.0, 10.0);
_0_ok = _0_ok && _1_x == vec4(9.0, 9.0, 10.0, 10.0);
_1_x.xyz = vec3(6.0, 6.0, 6.0);
_0_ok = _0_ok && _1_x == vec4(6.0, 6.0, 6.0, 10.0);
_1_x.xy = vec2(8.0, 8.0);
_0_ok = _0_ok && _1_x == vec4(8.0, 8.0, 6.0, 10.0);
_1_x = vec4(2.0, 1.0, 0.5, 0.25);
_0_ok = _0_ok && _1_x == vec4(2.0, 1.0, 0.5, 0.25);
_1_x = vec4(6.0, 6.0, 6.0, 6.0);
_0_ok = _0_ok && _1_x == vec4(6.0);
float _2_unknown = unknownInput;
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(0.0);
_0_ok = _0_ok && _1_x == vec4(0.0);
_1_x = vec4(0.0);
_0_ok = _0_ok && _1_x == vec4(0.0);
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(_2_unknown);
@ -103,12 +122,15 @@ vec4 main() {
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(0.0);
_0_ok = _0_ok && _1_x == vec4(0.0);
_1_x = vec4(0.0);
_0_ok = _0_ok && _1_x == vec4(0.0);
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(0.0);
_0_ok = _0_ok && _1_x == vec4(0.0);
_1_x = vec4(_2_unknown);
_0_ok = _0_ok && _1_x == vec4(_2_unknown);
_1_x = vec4(_2_unknown);

View File

@ -6,7 +6,7 @@ uniform vec4 colorGreen;
bool test_int() {
int unknown = int(unknownInput);
bool ok = true;
ok = ivec4(unknown) == ivec4(unknown);
ok = ok && ivec4(unknown) == ivec4(unknown);
ok = ok && ivec4(unknown) == ivec4(unknown);
ok = ok && ivec4(unknown) == ivec4(unknown);
ok = ok && ivec4(unknown) == ivec4(unknown);
@ -27,7 +27,7 @@ bool test_int() {
vec4 main() {
float _0_unknown = unknownInput;
bool _1_ok = true;
_1_ok = vec4(_0_unknown) == vec4(_0_unknown);
_1_ok = _1_ok && vec4(_0_unknown) == vec4(_0_unknown);
_1_ok = _1_ok && vec4(_0_unknown) == vec4(_0_unknown);
_1_ok = _1_ok && vec4(_0_unknown) == vec4(_0_unknown);
_1_ok = _1_ok && vec4(_0_unknown) == vec4(_0_unknown);

View File

@ -2,6 +2,32 @@
out vec4 sk_FragColor;
vec4 helper();
void main() {
sk_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
vec4 _0_helper;
for (int _1_loop = 0;_1_loop < 1; _1_loop++) {
int _2_temp = 1;
switch (_2_temp) {
case 0:
{
_0_helper = vec4(0.0, 0.0, 0.0, 1.0);
continue;
}
case 1:
{
_0_helper = vec4(0.5, 0.5, 0.5, 1.0);
continue;
}
case 2:
{
_0_helper = vec4(1.0);
continue;
}
default:
{
_0_helper = vec4(1.0, 0.0, 0.0, 1.0);
continue;
}
}
}
sk_FragColor = _0_helper;
}

View File

@ -202,6 +202,7 @@ void fn6() {
false;
sk_FragColor.x = 0.0;
@ -404,6 +405,7 @@ void fn6() {
false;
sk_FragColor.x = 0.0;
@ -606,6 +608,7 @@ void fn6() {
false;
}
void fn7() {
@ -1215,6 +1218,7 @@ void fn7() {
false;
fn6();
fn6();

View File

@ -202,6 +202,7 @@ void fn6() {
false;
sk_FragColor.x = 0.0;
@ -404,6 +405,7 @@ void fn6() {
false;
sk_FragColor.x = 0.0;
@ -606,6 +608,7 @@ void fn6() {
false;
}
void fn7() {
@ -1215,6 +1218,7 @@ void fn7() {
false;
fn6();
fn6();

View File

@ -35,6 +35,7 @@ void main() {
++y;
++y;
++y;
false;
++y;
++y;
@ -70,5 +71,6 @@ void main() {
++y;
++y;
++y;
false;
}

View File

@ -3,6 +3,7 @@ out vec4 sk_FragColor;
void main() {
float x = 1.0;
x *= 2.0;
false;
sk_FragColor.x = x;
}

View File

@ -38,7 +38,7 @@ void main() {
--_0_x;
--_0_x;
_0_x = 456.0;
float _1_x = 456.0;
float _1_x = _0_x;
++_1_x;
++_1_x;
++_1_x;
@ -74,7 +74,7 @@ void main() {
--_1_x;
--_1_x;
_1_x = 123.0;
sk_FragColor = vec4(123.0);
sk_FragColor = vec4(_1_x);
}

View File

@ -1,7 +1,9 @@
out vec4 sk_FragColor;
void main() {
float _0_y = 0.0;
float _1_y = 123.0;
float z = 0.0;
float _0_y = z;
++_0_y;
++_0_y;
++_0_y;
@ -38,6 +40,7 @@ void main() {
--_0_y;
_0_y = 42.0;
_0_y;
sk_FragColor.x = 0.0;
sk_FragColor.x = z;
}

View File

@ -3,6 +3,7 @@ out vec4 sk_FragColor;
void main() {
sk_FragColor.x = 2.0;
sk_FragColor.y = 4.0;
float y = 2.0;
sk_FragColor.y = y * 2.0;
}

View File

@ -3,6 +3,9 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return colorRed;
float x = 0.0;
x = 1.0;
x = 2.0;
return x == 1.0 && x == 2.0 ? colorGreen : colorRed;
}

View File

@ -7,6 +7,7 @@ void main() {
sk_FragColor = color.yzyx;
color = color.wzyx;
false;
sk_FragColor = color;
}

View File

@ -19,42 +19,59 @@ void main() {
S as[1];
as[0].ah4[0] = vec4(val);
sk_FragColor = sk_FragColor.xxxx;
false;
sk_FragColor = vec4(s.h);
false;
sk_FragColor = b ? sk_FragColor.xxxx : sk_FragColor.yyyy;
false;
sk_FragColor = s.ah4[0].ywyw;
false;
sk_FragColor = as[0].ah4[0].xyxy;
false;
sk_FragColor = s.h4.zzzz;
false;
sk_FragColor = uh4.xyzx;
false;
sk_FragColor = vec4(s.h);
false;
sk_FragColor = vec4(s.h);
false;
sk_FragColor = s.ah4[0].xxxy;
false;
sk_FragColor = uh4;
false;
sk_FragColor = sk_FragColor.yyyy;
false;
float _0_h = -s.h;
sk_FragColor = vec4(_0_h);
false;
bool _1_b = !b;
sk_FragColor = _1_b ? sk_FragColor.xxxx : sk_FragColor.yyyy;
false;
vec2 _2_h2 = s.ah4[ui].yw;
sk_FragColor = _2_h2.xyxy;
false;
vec3 _3_h3 = s.h4.yyy + s.h4.zzz;
sk_FragColor = _3_h3.xyzx;
false;
vec4 _4_h4 = vec4(s.h4.y, 0.0, 0.0, 1.0);
sk_FragColor = _4_h4;
false;
}

View File

@ -11,6 +11,7 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expected "expected"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,13 +26,17 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %60 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %78 RelaxedPrecision
OpDecorate %33 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %55 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
OpDecorate %80 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
OpDecorate %84 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -45,23 +50,21 @@ OpDecorate %78 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_1_25 = OpConstant %float 1.25
%float_0 = OpConstant %float 0
%float_0_75 = OpConstant %float 0.75
%float_2_25 = OpConstant %float 2.25
%26 = OpConstantComposite %v4float %float_1_25 %float_0 %float_0_75 %float_2_25
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_1_25 = OpConstant %float 1.25
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%38 = OpConstantComposite %v2float %float_1_25 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%float_0_75 = OpConstant %float 0.75
%51 = OpConstantComposite %v3float %float_1_25 %float_0 %float_0_75
%v3bool = OpTypeVector %bool 3
%float_2_25 = OpConstant %float 2.25
%62 = OpConstantComposite %v4float %float_1_25 %float_0 %float_0_75 %float_2_25
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -72,60 +75,69 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%67 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 FAbs %27
%29 = OpFOrdEqual %bool %21 %float_1_25
OpSelectionMerge %31 None
OpBranchConditional %29 %30 %31
%30 = OpLabel
%33 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %33
%35 = OpVectorShuffle %v2float %34 %34 0 1
%32 = OpExtInst %v2float %1 FAbs %35
%39 = OpFOrdEqual %v2bool %32 %38
%41 = OpAll %bool %39
OpBranch %31
%31 = OpLabel
%42 = OpPhi %bool %false %19 %41 %30
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%47 = OpLoad %v4float %46
%48 = OpVectorShuffle %v3float %47 %47 0 1 2
%45 = OpExtInst %v3float %1 FAbs %48
%52 = OpFOrdEqual %v3bool %45 %51
%54 = OpAll %bool %52
OpBranch %44
%44 = OpLabel
%55 = OpPhi %bool %false %31 %54 %43
OpSelectionMerge %57 None
OpBranchConditional %55 %56 %57
%56 = OpLabel
%59 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%60 = OpLoad %v4float %59
%58 = OpExtInst %v4float %1 FAbs %60
%63 = OpFOrdEqual %v4bool %58 %62
%65 = OpAll %bool %63
OpBranch %57
%57 = OpLabel
%66 = OpPhi %bool %false %44 %65 %56
OpSelectionMerge %71 None
OpBranchConditional %66 %69 %70
%69 = OpLabel
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%74 = OpLoad %v4float %72
OpStore %67 %74
OpBranch %71
%70 = OpLabel
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%77 = OpLoad %v4float %75
OpStore %67 %77
OpBranch %71
%71 = OpLabel
%78 = OpLoad %v4float %67
OpReturnValue %78
%expected = OpVariable %_ptr_Function_v4float Function
%74 = OpVariable %_ptr_Function_v4float Function
OpStore %expected %26
%29 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%33 = OpLoad %v4float %29
%34 = OpCompositeExtract %float %33 0
%28 = OpExtInst %float %1 FAbs %34
%35 = OpLoad %v4float %expected
%36 = OpCompositeExtract %float %35 0
%37 = OpFOrdEqual %bool %28 %36
OpSelectionMerge %39 None
OpBranchConditional %37 %38 %39
%38 = OpLabel
%41 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%42 = OpLoad %v4float %41
%43 = OpVectorShuffle %v2float %42 %42 0 1
%40 = OpExtInst %v2float %1 FAbs %43
%45 = OpLoad %v4float %expected
%46 = OpVectorShuffle %v2float %45 %45 0 1
%47 = OpFOrdEqual %v2bool %40 %46
%49 = OpAll %bool %47
OpBranch %39
%39 = OpLabel
%50 = OpPhi %bool %false %19 %49 %38
OpSelectionMerge %52 None
OpBranchConditional %50 %51 %52
%51 = OpLabel
%54 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%55 = OpLoad %v4float %54
%56 = OpVectorShuffle %v3float %55 %55 0 1 2
%53 = OpExtInst %v3float %1 FAbs %56
%58 = OpLoad %v4float %expected
%59 = OpVectorShuffle %v3float %58 %58 0 1 2
%60 = OpFOrdEqual %v3bool %53 %59
%62 = OpAll %bool %60
OpBranch %52
%52 = OpLabel
%63 = OpPhi %bool %false %39 %62 %51
OpSelectionMerge %65 None
OpBranchConditional %63 %64 %65
%64 = OpLabel
%67 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%68 = OpLoad %v4float %67
%66 = OpExtInst %v4float %1 FAbs %68
%69 = OpLoad %v4float %expected
%70 = OpFOrdEqual %v4bool %66 %69
%72 = OpAll %bool %70
OpBranch %65
%65 = OpLabel
%73 = OpPhi %bool %false %52 %72 %64
OpSelectionMerge %77 None
OpBranchConditional %73 %75 %76
%75 = OpLabel
%78 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%80 = OpLoad %v4float %78
OpStore %74 %80
OpBranch %77
%76 = OpLabel
%81 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%83 = OpLoad %v4float %81
OpStore %74 %83
OpBranch %77
%77 = OpLabel
%84 = OpLoad %v4float %74
OpReturnValue %84
OpFunctionEnd

View File

@ -4,5 +4,6 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((abs(testInputs.x) == 1.25 && abs(testInputs.xy) == vec2(1.25, 0.0)) && abs(testInputs.xyz) == vec3(1.25, 0.0, 0.75)) && abs(testInputs) == vec4(1.25, 0.0, 0.75, 2.25) ? colorGreen : colorRed;
vec4 expected = vec4(1.25, 0.0, 0.75, 2.25);
return ((abs(testInputs.x) == expected.x && abs(testInputs.xy) == expected.xy) && abs(testInputs.xyz) == expected.xyz) && abs(testInputs) == expected ? colorGreen : colorRed;
}

View File

@ -17,6 +17,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((abs(_uniforms.testInputs.x) == 1.25 && all(abs(_uniforms.testInputs.xy) == float2(1.25, 0.0))) && all(abs(_uniforms.testInputs.xyz) == float3(1.25, 0.0, 0.75))) && all(abs(_uniforms.testInputs) == float4(1.25, 0.0, 0.75, 2.25)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expected = float4(1.25, 0.0, 0.75, 2.25);
_out.sk_FragColor = ((abs(_uniforms.testInputs.x) == expected.x && all(abs(_uniforms.testInputs.xy) == expected.xy)) && all(abs(_uniforms.testInputs.xyz) == expected.xyz)) && all(abs(_uniforms.testInputs) == expected) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,7 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expected "expected"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,13 +26,13 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %53 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %96 RelaxedPrecision
OpDecorate %98 RelaxedPrecision
OpDecorate %99 RelaxedPrecision
OpDecorate %32 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %82 RelaxedPrecision
OpDecorate %103 RelaxedPrecision
OpDecorate %105 RelaxedPrecision
OpDecorate %106 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -45,22 +46,21 @@ OpDecorate %99 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%int = OpTypeInt 32 1
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%int_1 = OpConstant %int 1
%int_0 = OpConstant %int 0
%int_2 = OpConstant %int 2
%27 = OpConstantComposite %v4int %int_1 %int_0 %int_0 %int_2
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%v2float = OpTypeVector %float 2
%v2int = OpTypeVector %int 2
%44 = OpConstantComposite %v2int %int_1 %int_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%v3int = OpTypeVector %int 3
%64 = OpConstantComposite %v3int %int_1 %int_0 %int_0
%v3bool = OpTypeVector %bool 3
%v4int = OpTypeVector %int 4
%int_2 = OpConstant %int 2
%85 = OpConstantComposite %v4int %int_1 %int_0 %int_0 %int_2
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_entrypoint = OpFunction %void None %15
@ -71,82 +71,91 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%90 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%28 = OpConvertFToS %int %27
%21 = OpExtInst %int %1 SAbs %28
%30 = OpIEqual %bool %21 %int_1
OpSelectionMerge %32 None
OpBranchConditional %30 %31 %32
%31 = OpLabel
%34 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%35 = OpLoad %v4float %34
%36 = OpVectorShuffle %v2float %35 %35 0 1
%38 = OpCompositeExtract %float %36 0
%39 = OpConvertFToS %int %38
%40 = OpCompositeExtract %float %36 1
%41 = OpConvertFToS %int %40
%42 = OpCompositeConstruct %v2int %39 %41
%33 = OpExtInst %v2int %1 SAbs %42
%45 = OpIEqual %v2bool %33 %44
%47 = OpAll %bool %45
OpBranch %32
%32 = OpLabel
%48 = OpPhi %bool %false %19 %47 %31
OpSelectionMerge %50 None
OpBranchConditional %48 %49 %50
%49 = OpLabel
%52 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%53 = OpLoad %v4float %52
%54 = OpVectorShuffle %v3float %53 %53 0 1 2
%56 = OpCompositeExtract %float %54 0
%57 = OpConvertFToS %int %56
%58 = OpCompositeExtract %float %54 1
%59 = OpConvertFToS %int %58
%60 = OpCompositeExtract %float %54 2
%61 = OpConvertFToS %int %60
%62 = OpCompositeConstruct %v3int %57 %59 %61
%51 = OpExtInst %v3int %1 SAbs %62
%65 = OpIEqual %v3bool %51 %64
%67 = OpAll %bool %65
OpBranch %50
%50 = OpLabel
%68 = OpPhi %bool %false %32 %67 %49
OpSelectionMerge %70 None
OpBranchConditional %68 %69 %70
%69 = OpLabel
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%73 = OpLoad %v4float %72
%74 = OpCompositeExtract %float %73 0
%75 = OpConvertFToS %int %74
%76 = OpCompositeExtract %float %73 1
%77 = OpConvertFToS %int %76
%78 = OpCompositeExtract %float %73 2
%79 = OpConvertFToS %int %78
%80 = OpCompositeExtract %float %73 3
%81 = OpConvertFToS %int %80
%82 = OpCompositeConstruct %v4int %75 %77 %79 %81
%71 = OpExtInst %v4int %1 SAbs %82
%86 = OpIEqual %v4bool %71 %85
%88 = OpAll %bool %86
OpBranch %70
%70 = OpLabel
%89 = OpPhi %bool %false %50 %88 %69
OpSelectionMerge %94 None
OpBranchConditional %89 %92 %93
%92 = OpLabel
%95 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%96 = OpLoad %v4float %95
OpStore %90 %96
OpBranch %94
%93 = OpLabel
%97 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%98 = OpLoad %v4float %97
OpStore %90 %98
OpBranch %94
%94 = OpLabel
%99 = OpLoad %v4float %90
OpReturnValue %99
%expected = OpVariable %_ptr_Function_v4int Function
%97 = OpVariable %_ptr_Function_v4float Function
OpStore %expected %27
%30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%32 = OpLoad %v4float %30
%33 = OpCompositeExtract %float %32 0
%34 = OpConvertFToS %int %33
%29 = OpExtInst %int %1 SAbs %34
%35 = OpLoad %v4int %expected
%36 = OpCompositeExtract %int %35 0
%37 = OpIEqual %bool %29 %36
OpSelectionMerge %39 None
OpBranchConditional %37 %38 %39
%38 = OpLabel
%41 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%42 = OpLoad %v4float %41
%43 = OpVectorShuffle %v2float %42 %42 0 1
%45 = OpCompositeExtract %float %43 0
%46 = OpConvertFToS %int %45
%47 = OpCompositeExtract %float %43 1
%48 = OpConvertFToS %int %47
%49 = OpCompositeConstruct %v2int %46 %48
%40 = OpExtInst %v2int %1 SAbs %49
%51 = OpLoad %v4int %expected
%52 = OpVectorShuffle %v2int %51 %51 0 1
%53 = OpIEqual %v2bool %40 %52
%55 = OpAll %bool %53
OpBranch %39
%39 = OpLabel
%56 = OpPhi %bool %false %19 %55 %38
OpSelectionMerge %58 None
OpBranchConditional %56 %57 %58
%57 = OpLabel
%60 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%61 = OpLoad %v4float %60
%62 = OpVectorShuffle %v3float %61 %61 0 1 2
%64 = OpCompositeExtract %float %62 0
%65 = OpConvertFToS %int %64
%66 = OpCompositeExtract %float %62 1
%67 = OpConvertFToS %int %66
%68 = OpCompositeExtract %float %62 2
%69 = OpConvertFToS %int %68
%70 = OpCompositeConstruct %v3int %65 %67 %69
%59 = OpExtInst %v3int %1 SAbs %70
%72 = OpLoad %v4int %expected
%73 = OpVectorShuffle %v3int %72 %72 0 1 2
%74 = OpIEqual %v3bool %59 %73
%76 = OpAll %bool %74
OpBranch %58
%58 = OpLabel
%77 = OpPhi %bool %false %39 %76 %57
OpSelectionMerge %79 None
OpBranchConditional %77 %78 %79
%78 = OpLabel
%81 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%82 = OpLoad %v4float %81
%83 = OpCompositeExtract %float %82 0
%84 = OpConvertFToS %int %83
%85 = OpCompositeExtract %float %82 1
%86 = OpConvertFToS %int %85
%87 = OpCompositeExtract %float %82 2
%88 = OpConvertFToS %int %87
%89 = OpCompositeExtract %float %82 3
%90 = OpConvertFToS %int %89
%91 = OpCompositeConstruct %v4int %84 %86 %88 %90
%80 = OpExtInst %v4int %1 SAbs %91
%92 = OpLoad %v4int %expected
%93 = OpIEqual %v4bool %80 %92
%95 = OpAll %bool %93
OpBranch %79
%79 = OpLabel
%96 = OpPhi %bool %false %58 %95 %78
OpSelectionMerge %101 None
OpBranchConditional %96 %99 %100
%99 = OpLabel
%102 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%103 = OpLoad %v4float %102
OpStore %97 %103
OpBranch %101
%100 = OpLabel
%104 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%105 = OpLoad %v4float %104
OpStore %97 %105
OpBranch %101
%101 = OpLabel
%106 = OpLoad %v4float %97
OpReturnValue %106
OpFunctionEnd

View File

@ -4,5 +4,6 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((abs(int(testInputs.x)) == 1 && abs(ivec2(testInputs.xy)) == ivec2(1, 0)) && abs(ivec3(testInputs.xyz)) == ivec3(1, 0, 0)) && abs(ivec4(testInputs)) == ivec4(1, 0, 0, 2) ? colorGreen : colorRed;
ivec4 expected = ivec4(1, 0, 0, 2);
return ((abs(int(testInputs.x)) == expected.x && abs(ivec2(testInputs.xy)) == expected.xy) && abs(ivec3(testInputs.xyz)) == expected.xyz) && abs(ivec4(testInputs)) == expected ? colorGreen : colorRed;
}

View File

@ -17,6 +17,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((abs(int(_uniforms.testInputs.x)) == 1 && all(abs(int2(_uniforms.testInputs.xy)) == int2(1, 0))) && all(abs(int3(_uniforms.testInputs.xyz)) == int3(1, 0, 0))) && all(abs(int4(_uniforms.testInputs)) == int4(1, 0, 0, 2)) ? _uniforms.colorGreen : _uniforms.colorRed;
int4 expected = int4(1, 0, 0, 2);
_out.sk_FragColor = ((abs(int(_uniforms.testInputs.x)) == expected.x && all(abs(int2(_uniforms.testInputs.xy)) == expected.xy)) && all(abs(int3(_uniforms.testInputs.xyz)) == expected.xyz)) && all(abs(int4(_uniforms.testInputs)) == expected) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,7 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expected "expected"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,13 +26,17 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %60 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %78 RelaxedPrecision
OpDecorate %33 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %55 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
OpDecorate %80 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
OpDecorate %84 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -45,23 +50,21 @@ OpDecorate %78 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_n1 = OpConstant %float -1
%float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%float_3 = OpConstant %float 3
%26 = OpConstantComposite %v4float %float_n1 %float_0 %float_1 %float_3
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_n1 = OpConstant %float -1
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%38 = OpConstantComposite %v2float %float_n1 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%float_1 = OpConstant %float 1
%51 = OpConstantComposite %v3float %float_n1 %float_0 %float_1
%v3bool = OpTypeVector %bool 3
%float_3 = OpConstant %float 3
%62 = OpConstantComposite %v4float %float_n1 %float_0 %float_1 %float_3
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -72,60 +75,69 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%67 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 Ceil %27
%29 = OpFOrdEqual %bool %21 %float_n1
OpSelectionMerge %31 None
OpBranchConditional %29 %30 %31
%30 = OpLabel
%33 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %33
%35 = OpVectorShuffle %v2float %34 %34 0 1
%32 = OpExtInst %v2float %1 Ceil %35
%39 = OpFOrdEqual %v2bool %32 %38
%41 = OpAll %bool %39
OpBranch %31
%31 = OpLabel
%42 = OpPhi %bool %false %19 %41 %30
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%47 = OpLoad %v4float %46
%48 = OpVectorShuffle %v3float %47 %47 0 1 2
%45 = OpExtInst %v3float %1 Ceil %48
%52 = OpFOrdEqual %v3bool %45 %51
%54 = OpAll %bool %52
OpBranch %44
%44 = OpLabel
%55 = OpPhi %bool %false %31 %54 %43
OpSelectionMerge %57 None
OpBranchConditional %55 %56 %57
%56 = OpLabel
%59 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%60 = OpLoad %v4float %59
%58 = OpExtInst %v4float %1 Ceil %60
%63 = OpFOrdEqual %v4bool %58 %62
%65 = OpAll %bool %63
OpBranch %57
%57 = OpLabel
%66 = OpPhi %bool %false %44 %65 %56
OpSelectionMerge %71 None
OpBranchConditional %66 %69 %70
%69 = OpLabel
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%74 = OpLoad %v4float %72
OpStore %67 %74
OpBranch %71
%70 = OpLabel
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%77 = OpLoad %v4float %75
OpStore %67 %77
OpBranch %71
%71 = OpLabel
%78 = OpLoad %v4float %67
OpReturnValue %78
%expected = OpVariable %_ptr_Function_v4float Function
%74 = OpVariable %_ptr_Function_v4float Function
OpStore %expected %26
%29 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%33 = OpLoad %v4float %29
%34 = OpCompositeExtract %float %33 0
%28 = OpExtInst %float %1 Ceil %34
%35 = OpLoad %v4float %expected
%36 = OpCompositeExtract %float %35 0
%37 = OpFOrdEqual %bool %28 %36
OpSelectionMerge %39 None
OpBranchConditional %37 %38 %39
%38 = OpLabel
%41 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%42 = OpLoad %v4float %41
%43 = OpVectorShuffle %v2float %42 %42 0 1
%40 = OpExtInst %v2float %1 Ceil %43
%45 = OpLoad %v4float %expected
%46 = OpVectorShuffle %v2float %45 %45 0 1
%47 = OpFOrdEqual %v2bool %40 %46
%49 = OpAll %bool %47
OpBranch %39
%39 = OpLabel
%50 = OpPhi %bool %false %19 %49 %38
OpSelectionMerge %52 None
OpBranchConditional %50 %51 %52
%51 = OpLabel
%54 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%55 = OpLoad %v4float %54
%56 = OpVectorShuffle %v3float %55 %55 0 1 2
%53 = OpExtInst %v3float %1 Ceil %56
%58 = OpLoad %v4float %expected
%59 = OpVectorShuffle %v3float %58 %58 0 1 2
%60 = OpFOrdEqual %v3bool %53 %59
%62 = OpAll %bool %60
OpBranch %52
%52 = OpLabel
%63 = OpPhi %bool %false %39 %62 %51
OpSelectionMerge %65 None
OpBranchConditional %63 %64 %65
%64 = OpLabel
%67 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%68 = OpLoad %v4float %67
%66 = OpExtInst %v4float %1 Ceil %68
%69 = OpLoad %v4float %expected
%70 = OpFOrdEqual %v4bool %66 %69
%72 = OpAll %bool %70
OpBranch %65
%65 = OpLabel
%73 = OpPhi %bool %false %52 %72 %64
OpSelectionMerge %77 None
OpBranchConditional %73 %75 %76
%75 = OpLabel
%78 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%80 = OpLoad %v4float %78
OpStore %74 %80
OpBranch %77
%76 = OpLabel
%81 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%83 = OpLoad %v4float %81
OpStore %74 %83
OpBranch %77
%77 = OpLabel
%84 = OpLoad %v4float %74
OpReturnValue %84
OpFunctionEnd

View File

@ -4,5 +4,6 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((ceil(testInputs.x) == -1.0 && ceil(testInputs.xy) == vec2(-1.0, 0.0)) && ceil(testInputs.xyz) == vec3(-1.0, 0.0, 1.0)) && ceil(testInputs) == vec4(-1.0, 0.0, 1.0, 3.0) ? colorGreen : colorRed;
vec4 expected = vec4(-1.0, 0.0, 1.0, 3.0);
return ((ceil(testInputs.x) == expected.x && ceil(testInputs.xy) == expected.xy) && ceil(testInputs.xyz) == expected.xyz) && ceil(testInputs) == expected ? colorGreen : colorRed;
}

View File

@ -17,6 +17,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((ceil(_uniforms.testInputs.x) == -1.0 && all(ceil(_uniforms.testInputs.xy) == float2(-1.0, 0.0))) && all(ceil(_uniforms.testInputs.xyz) == float3(-1.0, 0.0, 1.0))) && all(ceil(_uniforms.testInputs) == float4(-1.0, 0.0, 1.0, 3.0)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expected = float4(-1.0, 0.0, 1.0, 3.0);
_out.sk_FragColor = ((ceil(_uniforms.testInputs.x) == expected.x && all(ceil(_uniforms.testInputs.xy) == expected.xy)) && all(ceil(_uniforms.testInputs.xyz) == expected.xyz)) && all(ceil(_uniforms.testInputs) == expected) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,10 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expectedA "expectedA"
OpName %clampLow "clampLow"
OpName %expectedB "expectedB"
OpName %clampHigh "clampHigh"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,23 +29,39 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %50 RelaxedPrecision
OpDecorate %44 RelaxedPrecision
OpDecorate %46 RelaxedPrecision
OpDecorate %53 RelaxedPrecision
OpDecorate %54 RelaxedPrecision
OpDecorate %65 RelaxedPrecision
OpDecorate %66 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %56 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %71 RelaxedPrecision
OpDecorate %72 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
OpDecorate %84 RelaxedPrecision
OpDecorate %85 RelaxedPrecision
OpDecorate %98 RelaxedPrecision
OpDecorate %86 RelaxedPrecision
OpDecorate %95 RelaxedPrecision
OpDecorate %97 RelaxedPrecision
OpDecorate %99 RelaxedPrecision
OpDecorate %101 RelaxedPrecision
OpDecorate %109 RelaxedPrecision
OpDecorate %111 RelaxedPrecision
OpDecorate %127 RelaxedPrecision
OpDecorate %113 RelaxedPrecision
OpDecorate %115 RelaxedPrecision
OpDecorate %124 RelaxedPrecision
OpDecorate %126 RelaxedPrecision
OpDecorate %128 RelaxedPrecision
OpDecorate %130 RelaxedPrecision
OpDecorate %131 RelaxedPrecision
OpDecorate %139 RelaxedPrecision
OpDecorate %140 RelaxedPrecision
OpDecorate %141 RelaxedPrecision
OpDecorate %142 RelaxedPrecision
OpDecorate %152 RelaxedPrecision
OpDecorate %155 RelaxedPrecision
OpDecorate %156 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -55,36 +75,29 @@ OpDecorate %131 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_n1 = OpConstant %float -1
%float_0 = OpConstant %float 0
%float_0_75 = OpConstant %float 0.75
%float_1 = OpConstant %float 1
%26 = OpConstantComposite %v4float %float_n1 %float_0 %float_0_75 %float_1
%float_n2 = OpConstant %float -2
%29 = OpConstantComposite %v4float %float_n1 %float_n2 %float_n2 %float_1
%float_0_5 = OpConstant %float 0.5
%float_2_25 = OpConstant %float 2.25
%33 = OpConstantComposite %v4float %float_n1 %float_0 %float_0_5 %float_2_25
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%37 = OpConstantComposite %v4float %float_1 %float_2 %float_0_5 %float_3
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_n1 = OpConstant %float -1
%float_1 = OpConstant %float 1
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%41 = OpConstantComposite %v2float %float_n1 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%float_0_75 = OpConstant %float 0.75
%56 = OpConstantComposite %v3float %float_n1 %float_0 %float_0_75
%v3bool = OpTypeVector %bool 3
%68 = OpConstantComposite %v4float %float_n1 %float_0 %float_0_75 %float_1
%v4bool = OpTypeVector %bool 4
%float_n2 = OpConstant %float -2
%88 = OpConstantComposite %v2float %float_n1 %float_n2
%float_2 = OpConstant %float 2
%90 = OpConstantComposite %v2float %float_1 %float_2
%100 = OpConstantComposite %v3float %float_n1 %float_n2 %float_n2
%float_0_5 = OpConstant %float 0.5
%102 = OpConstantComposite %v3float %float_1 %float_2 %float_0_5
%103 = OpConstantComposite %v3float %float_n1 %float_0 %float_0_5
%112 = OpConstantComposite %v4float %float_n1 %float_n2 %float_n2 %float_1
%float_3 = OpConstant %float 3
%114 = OpConstantComposite %v4float %float_1 %float_2 %float_0_5 %float_3
%float_2_25 = OpConstant %float 2.25
%116 = OpConstantComposite %v4float %float_n1 %float_0 %float_0_5 %float_2_25
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -95,112 +108,148 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%120 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 FClamp %27 %float_n1 %float_1
%30 = OpFOrdEqual %bool %21 %float_n1
OpSelectionMerge %32 None
OpBranchConditional %30 %31 %32
%31 = OpLabel
%34 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%35 = OpLoad %v4float %34
%36 = OpVectorShuffle %v2float %35 %35 0 1
%38 = OpCompositeConstruct %v2float %float_n1 %float_n1
%39 = OpCompositeConstruct %v2float %float_1 %float_1
%33 = OpExtInst %v2float %1 FClamp %36 %38 %39
%42 = OpFOrdEqual %v2bool %33 %41
%44 = OpAll %bool %42
OpBranch %32
%32 = OpLabel
%45 = OpPhi %bool %false %19 %44 %31
OpSelectionMerge %47 None
OpBranchConditional %45 %46 %47
%46 = OpLabel
%49 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%50 = OpLoad %v4float %49
%51 = OpVectorShuffle %v3float %50 %50 0 1 2
%53 = OpCompositeConstruct %v3float %float_n1 %float_n1 %float_n1
%54 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%48 = OpExtInst %v3float %1 FClamp %51 %53 %54
%57 = OpFOrdEqual %v3bool %48 %56
%59 = OpAll %bool %57
OpBranch %47
%47 = OpLabel
%60 = OpPhi %bool %false %32 %59 %46
OpSelectionMerge %62 None
OpBranchConditional %60 %61 %62
%61 = OpLabel
%64 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%65 = OpLoad %v4float %64
%66 = OpCompositeConstruct %v4float %float_n1 %float_n1 %float_n1 %float_n1
%67 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%63 = OpExtInst %v4float %1 FClamp %65 %66 %67
%69 = OpFOrdEqual %v4bool %63 %68
%71 = OpAll %bool %69
OpBranch %62
%62 = OpLabel
%72 = OpPhi %bool %false %47 %71 %61
OpSelectionMerge %74 None
OpBranchConditional %72 %73 %74
%73 = OpLabel
%76 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%77 = OpLoad %v4float %76
%78 = OpCompositeExtract %float %77 0
%75 = OpExtInst %float %1 FClamp %78 %float_n1 %float_1
%79 = OpFOrdEqual %bool %75 %float_n1
OpBranch %74
%74 = OpLabel
%80 = OpPhi %bool %false %62 %79 %73
OpSelectionMerge %82 None
OpBranchConditional %80 %81 %82
%81 = OpLabel
%84 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%85 = OpLoad %v4float %84
%86 = OpVectorShuffle %v2float %85 %85 0 1
%83 = OpExtInst %v2float %1 FClamp %86 %88 %90
%91 = OpFOrdEqual %v2bool %83 %41
%92 = OpAll %bool %91
OpBranch %82
%82 = OpLabel
%93 = OpPhi %bool %false %74 %92 %81
OpSelectionMerge %95 None
OpBranchConditional %93 %94 %95
%94 = OpLabel
%97 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%98 = OpLoad %v4float %97
%99 = OpVectorShuffle %v3float %98 %98 0 1 2
%96 = OpExtInst %v3float %1 FClamp %99 %100 %102
%104 = OpFOrdEqual %v3bool %96 %103
%105 = OpAll %bool %104
OpBranch %95
%95 = OpLabel
%106 = OpPhi %bool %false %82 %105 %94
OpSelectionMerge %108 None
OpBranchConditional %106 %107 %108
%107 = OpLabel
%110 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%111 = OpLoad %v4float %110
%109 = OpExtInst %v4float %1 FClamp %111 %112 %114
%117 = OpFOrdEqual %v4bool %109 %116
%expectedA = OpVariable %_ptr_Function_v4float Function
%clampLow = OpVariable %_ptr_Function_v4float Function
%expectedB = OpVariable %_ptr_Function_v4float Function
%clampHigh = OpVariable %_ptr_Function_v4float Function
%146 = OpVariable %_ptr_Function_v4float Function
OpStore %expectedA %26
OpStore %clampLow %29
OpStore %expectedB %33
OpStore %clampHigh %37
%40 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%44 = OpLoad %v4float %40
%45 = OpCompositeExtract %float %44 0
%39 = OpExtInst %float %1 FClamp %45 %float_n1 %float_1
%46 = OpLoad %v4float %expectedA
%47 = OpCompositeExtract %float %46 0
%48 = OpFOrdEqual %bool %39 %47
OpSelectionMerge %50 None
OpBranchConditional %48 %49 %50
%49 = OpLabel
%52 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%53 = OpLoad %v4float %52
%54 = OpVectorShuffle %v2float %53 %53 0 1
%56 = OpCompositeConstruct %v2float %float_n1 %float_n1
%57 = OpCompositeConstruct %v2float %float_1 %float_1
%51 = OpExtInst %v2float %1 FClamp %54 %56 %57
%58 = OpLoad %v4float %expectedA
%59 = OpVectorShuffle %v2float %58 %58 0 1
%60 = OpFOrdEqual %v2bool %51 %59
%62 = OpAll %bool %60
OpBranch %50
%50 = OpLabel
%63 = OpPhi %bool %false %19 %62 %49
OpSelectionMerge %65 None
OpBranchConditional %63 %64 %65
%64 = OpLabel
%67 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%68 = OpLoad %v4float %67
%69 = OpVectorShuffle %v3float %68 %68 0 1 2
%71 = OpCompositeConstruct %v3float %float_n1 %float_n1 %float_n1
%72 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%66 = OpExtInst %v3float %1 FClamp %69 %71 %72
%73 = OpLoad %v4float %expectedA
%74 = OpVectorShuffle %v3float %73 %73 0 1 2
%75 = OpFOrdEqual %v3bool %66 %74
%77 = OpAll %bool %75
OpBranch %65
%65 = OpLabel
%78 = OpPhi %bool %false %50 %77 %64
OpSelectionMerge %80 None
OpBranchConditional %78 %79 %80
%79 = OpLabel
%82 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%83 = OpLoad %v4float %82
%84 = OpCompositeConstruct %v4float %float_n1 %float_n1 %float_n1 %float_n1
%85 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%81 = OpExtInst %v4float %1 FClamp %83 %84 %85
%86 = OpLoad %v4float %expectedA
%87 = OpFOrdEqual %v4bool %81 %86
%89 = OpAll %bool %87
OpBranch %80
%80 = OpLabel
%90 = OpPhi %bool %false %65 %89 %79
OpSelectionMerge %92 None
OpBranchConditional %90 %91 %92
%91 = OpLabel
%94 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%95 = OpLoad %v4float %94
%96 = OpCompositeExtract %float %95 0
%97 = OpLoad %v4float %clampLow
%98 = OpCompositeExtract %float %97 0
%99 = OpLoad %v4float %clampHigh
%100 = OpCompositeExtract %float %99 0
%93 = OpExtInst %float %1 FClamp %96 %98 %100
%101 = OpLoad %v4float %expectedB
%102 = OpCompositeExtract %float %101 0
%103 = OpFOrdEqual %bool %93 %102
OpBranch %92
%92 = OpLabel
%104 = OpPhi %bool %false %80 %103 %91
OpSelectionMerge %106 None
OpBranchConditional %104 %105 %106
%105 = OpLabel
%108 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%109 = OpLoad %v4float %108
%110 = OpVectorShuffle %v2float %109 %109 0 1
%111 = OpLoad %v4float %clampLow
%112 = OpVectorShuffle %v2float %111 %111 0 1
%113 = OpLoad %v4float %clampHigh
%114 = OpVectorShuffle %v2float %113 %113 0 1
%107 = OpExtInst %v2float %1 FClamp %110 %112 %114
%115 = OpLoad %v4float %expectedB
%116 = OpVectorShuffle %v2float %115 %115 0 1
%117 = OpFOrdEqual %v2bool %107 %116
%118 = OpAll %bool %117
OpBranch %108
%108 = OpLabel
%119 = OpPhi %bool %false %95 %118 %107
OpSelectionMerge %124 None
OpBranchConditional %119 %122 %123
%122 = OpLabel
%125 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%127 = OpLoad %v4float %125
OpStore %120 %127
OpBranch %124
%123 = OpLabel
%128 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%130 = OpLoad %v4float %128
OpStore %120 %130
OpBranch %124
%124 = OpLabel
%131 = OpLoad %v4float %120
OpReturnValue %131
OpBranch %106
%106 = OpLabel
%119 = OpPhi %bool %false %92 %118 %105
OpSelectionMerge %121 None
OpBranchConditional %119 %120 %121
%120 = OpLabel
%123 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%124 = OpLoad %v4float %123
%125 = OpVectorShuffle %v3float %124 %124 0 1 2
%126 = OpLoad %v4float %clampLow
%127 = OpVectorShuffle %v3float %126 %126 0 1 2
%128 = OpLoad %v4float %clampHigh
%129 = OpVectorShuffle %v3float %128 %128 0 1 2
%122 = OpExtInst %v3float %1 FClamp %125 %127 %129
%130 = OpLoad %v4float %expectedB
%131 = OpVectorShuffle %v3float %130 %130 0 1 2
%132 = OpFOrdEqual %v3bool %122 %131
%133 = OpAll %bool %132
OpBranch %121
%121 = OpLabel
%134 = OpPhi %bool %false %106 %133 %120
OpSelectionMerge %136 None
OpBranchConditional %134 %135 %136
%135 = OpLabel
%138 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%139 = OpLoad %v4float %138
%140 = OpLoad %v4float %clampLow
%141 = OpLoad %v4float %clampHigh
%137 = OpExtInst %v4float %1 FClamp %139 %140 %141
%142 = OpLoad %v4float %expectedB
%143 = OpFOrdEqual %v4bool %137 %142
%144 = OpAll %bool %143
OpBranch %136
%136 = OpLabel
%145 = OpPhi %bool %false %121 %144 %135
OpSelectionMerge %149 None
OpBranchConditional %145 %147 %148
%147 = OpLabel
%150 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%152 = OpLoad %v4float %150
OpStore %146 %152
OpBranch %149
%148 = OpLabel
%153 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%155 = OpLoad %v4float %153
OpStore %146 %155
OpBranch %149
%149 = OpLabel
%156 = OpLoad %v4float %146
OpReturnValue %156
OpFunctionEnd

View File

@ -4,5 +4,9 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((((((clamp(testInputs.x, -1.0, 1.0) == -1.0 && clamp(testInputs.xy, -1.0, 1.0) == vec2(-1.0, 0.0)) && clamp(testInputs.xyz, -1.0, 1.0) == vec3(-1.0, 0.0, 0.75)) && clamp(testInputs, -1.0, 1.0) == vec4(-1.0, 0.0, 0.75, 1.0)) && clamp(testInputs.x, -1.0, 1.0) == -1.0) && clamp(testInputs.xy, vec2(-1.0, -2.0), vec2(1.0, 2.0)) == vec2(-1.0, 0.0)) && clamp(testInputs.xyz, vec3(-1.0, -2.0, -2.0), vec3(1.0, 2.0, 0.5)) == vec3(-1.0, 0.0, 0.5)) && clamp(testInputs, vec4(-1.0, -2.0, -2.0, 1.0), vec4(1.0, 2.0, 0.5, 3.0)) == vec4(-1.0, 0.0, 0.5, 2.25) ? colorGreen : colorRed;
vec4 expectedA = vec4(-1.0, 0.0, 0.75, 1.0);
vec4 clampLow = vec4(-1.0, -2.0, -2.0, 1.0);
vec4 expectedB = vec4(-1.0, 0.0, 0.5, 2.25);
vec4 clampHigh = vec4(1.0, 2.0, 0.5, 3.0);
return ((((((clamp(testInputs.x, -1.0, 1.0) == expectedA.x && clamp(testInputs.xy, -1.0, 1.0) == expectedA.xy) && clamp(testInputs.xyz, -1.0, 1.0) == expectedA.xyz) && clamp(testInputs, -1.0, 1.0) == expectedA) && clamp(testInputs.x, clampLow.x, clampHigh.x) == expectedB.x) && clamp(testInputs.xy, clampLow.xy, clampHigh.xy) == expectedB.xy) && clamp(testInputs.xyz, clampLow.xyz, clampHigh.xyz) == expectedB.xyz) && clamp(testInputs, clampLow, clampHigh) == expectedB ? colorGreen : colorRed;
}

View File

@ -17,6 +17,10 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((((((clamp(_uniforms.testInputs.x, -1.0, 1.0) == -1.0 && all(clamp(_uniforms.testInputs.xy, -1.0, 1.0) == float2(-1.0, 0.0))) && all(clamp(_uniforms.testInputs.xyz, -1.0, 1.0) == float3(-1.0, 0.0, 0.75))) && all(clamp(_uniforms.testInputs, -1.0, 1.0) == float4(-1.0, 0.0, 0.75, 1.0))) && clamp(_uniforms.testInputs.x, -1.0, 1.0) == -1.0) && all(clamp(_uniforms.testInputs.xy, float2(-1.0, -2.0), float2(1.0, 2.0)) == float2(-1.0, 0.0))) && all(clamp(_uniforms.testInputs.xyz, float3(-1.0, -2.0, -2.0), float3(1.0, 2.0, 0.5)) == float3(-1.0, 0.0, 0.5))) && all(clamp(_uniforms.testInputs, float4(-1.0, -2.0, -2.0, 1.0), float4(1.0, 2.0, 0.5, 3.0)) == float4(-1.0, 0.0, 0.5, 2.25)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expectedA = float4(-1.0, 0.0, 0.75, 1.0);
float4 clampLow = float4(-1.0, -2.0, -2.0, 1.0);
float4 expectedB = float4(-1.0, 0.0, 0.5, 2.25);
float4 clampHigh = float4(1.0, 2.0, 0.5, 3.0);
_out.sk_FragColor = ((((((clamp(_uniforms.testInputs.x, -1.0, 1.0) == expectedA.x && all(clamp(_uniforms.testInputs.xy, -1.0, 1.0) == expectedA.xy)) && all(clamp(_uniforms.testInputs.xyz, -1.0, 1.0) == expectedA.xyz)) && all(clamp(_uniforms.testInputs, -1.0, 1.0) == expectedA)) && clamp(_uniforms.testInputs.x, clampLow.x, clampHigh.x) == expectedB.x) && all(clamp(_uniforms.testInputs.xy, clampLow.xy, clampHigh.xy) == expectedB.xy)) && all(clamp(_uniforms.testInputs.xyz, clampLow.xyz, clampHigh.xyz) == expectedB.xyz)) && all(clamp(_uniforms.testInputs, clampLow, clampHigh) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,7 +11,11 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expectedA "expectedA"
OpName %intValues "intValues"
OpName %clampLow "clampLow"
OpName %expectedB "expectedB"
OpName %clampHigh "clampHigh"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -26,10 +30,10 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %27 RelaxedPrecision
OpDecorate %134 RelaxedPrecision
OpDecorate %137 RelaxedPrecision
OpDecorate %138 RelaxedPrecision
OpDecorate %32 RelaxedPrecision
OpDecorate %159 RelaxedPrecision
OpDecorate %162 RelaxedPrecision
OpDecorate %163 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -46,34 +50,27 @@ OpDecorate %138 RelaxedPrecision
%int = OpTypeInt 32 1
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int_0 = OpConstant %int 0
%float_100 = OpConstant %float 100
%false = OpConstantFalse %bool
%int_n100 = OpConstant %int -100
%int_0 = OpConstant %int 0
%int_75 = OpConstant %int 75
%int_100 = OpConstant %int 100
%28 = OpConstantComposite %v4int %int_n100 %int_0 %int_75 %int_100
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%float_100 = OpConstant %float 100
%int_n200 = OpConstant %int -200
%46 = OpConstantComposite %v4int %int_n100 %int_n200 %int_n200 %int_100
%int_50 = OpConstant %int 50
%int_225 = OpConstant %int 225
%50 = OpConstantComposite %v4int %int_n100 %int_0 %int_50 %int_225
%int_200 = OpConstant %int 200
%int_300 = OpConstant %int 300
%54 = OpConstantComposite %v4int %int_100 %int_200 %int_50 %int_300
%false = OpConstantFalse %bool
%v2int = OpTypeVector %int 2
%54 = OpConstantComposite %v2int %int_n100 %int_0
%v2bool = OpTypeVector %bool 2
%v3int = OpTypeVector %int 3
%int_75 = OpConstant %int 75
%68 = OpConstantComposite %v3int %int_n100 %int_0 %int_75
%v3bool = OpTypeVector %bool 3
%79 = OpConstantComposite %v4int %int_n100 %int_0 %int_75 %int_100
%v4bool = OpTypeVector %bool 4
%int_n200 = OpConstant %int -200
%97 = OpConstantComposite %v2int %int_n100 %int_n200
%int_200 = OpConstant %int 200
%99 = OpConstantComposite %v2int %int_100 %int_200
%108 = OpConstantComposite %v3int %int_n100 %int_n200 %int_n200
%int_50 = OpConstant %int 50
%110 = OpConstantComposite %v3int %int_100 %int_200 %int_50
%111 = OpConstantComposite %v3int %int_n100 %int_0 %int_50
%119 = OpConstantComposite %v4int %int_n100 %int_n200 %int_n200 %int_100
%int_300 = OpConstant %int 300
%121 = OpConstantComposite %v4int %int_100 %int_200 %int_50 %int_300
%int_225 = OpConstant %int 225
%123 = OpConstantComposite %v4int %int_n100 %int_0 %int_50 %int_225
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
@ -85,118 +82,154 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%expectedA = OpVariable %_ptr_Function_v4int Function
%intValues = OpVariable %_ptr_Function_v4int Function
%127 = OpVariable %_ptr_Function_v4float Function
%24 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%27 = OpLoad %v4float %24
%29 = OpVectorTimesScalar %v4float %27 %float_100
%30 = OpCompositeExtract %float %29 0
%31 = OpConvertFToS %int %30
%32 = OpCompositeExtract %float %29 1
%33 = OpConvertFToS %int %32
%34 = OpCompositeExtract %float %29 2
%35 = OpConvertFToS %int %34
%36 = OpCompositeExtract %float %29 3
%37 = OpConvertFToS %int %36
%38 = OpCompositeConstruct %v4int %31 %33 %35 %37
OpStore %intValues %38
%41 = OpLoad %v4int %intValues
%42 = OpCompositeExtract %int %41 0
%40 = OpExtInst %int %1 SClamp %42 %int_n100 %int_100
%45 = OpIEqual %bool %40 %int_n100
OpSelectionMerge %47 None
OpBranchConditional %45 %46 %47
%46 = OpLabel
%49 = OpLoad %v4int %intValues
%50 = OpVectorShuffle %v2int %49 %49 0 1
%52 = OpCompositeConstruct %v2int %int_n100 %int_n100
%53 = OpCompositeConstruct %v2int %int_100 %int_100
%48 = OpExtInst %v2int %1 SClamp %50 %52 %53
%55 = OpIEqual %v2bool %48 %54
%57 = OpAll %bool %55
OpBranch %47
%47 = OpLabel
%58 = OpPhi %bool %false %19 %57 %46
OpSelectionMerge %60 None
OpBranchConditional %58 %59 %60
%59 = OpLabel
%62 = OpLoad %v4int %intValues
%63 = OpVectorShuffle %v3int %62 %62 0 1 2
%65 = OpCompositeConstruct %v3int %int_n100 %int_n100 %int_n100
%66 = OpCompositeConstruct %v3int %int_100 %int_100 %int_100
%61 = OpExtInst %v3int %1 SClamp %63 %65 %66
%69 = OpIEqual %v3bool %61 %68
%71 = OpAll %bool %69
OpBranch %60
%60 = OpLabel
%72 = OpPhi %bool %false %47 %71 %59
OpSelectionMerge %74 None
OpBranchConditional %72 %73 %74
%73 = OpLabel
%76 = OpLoad %v4int %intValues
%77 = OpCompositeConstruct %v4int %int_n100 %int_n100 %int_n100 %int_n100
%78 = OpCompositeConstruct %v4int %int_100 %int_100 %int_100 %int_100
%75 = OpExtInst %v4int %1 SClamp %76 %77 %78
%80 = OpIEqual %v4bool %75 %79
%82 = OpAll %bool %80
OpBranch %74
%74 = OpLabel
%83 = OpPhi %bool %false %60 %82 %73
OpSelectionMerge %85 None
OpBranchConditional %83 %84 %85
%84 = OpLabel
%87 = OpLoad %v4int %intValues
%88 = OpCompositeExtract %int %87 0
%86 = OpExtInst %int %1 SClamp %88 %int_n100 %int_100
%89 = OpIEqual %bool %86 %int_n100
OpBranch %85
%85 = OpLabel
%90 = OpPhi %bool %false %74 %89 %84
OpSelectionMerge %92 None
OpBranchConditional %90 %91 %92
%clampLow = OpVariable %_ptr_Function_v4int Function
%expectedB = OpVariable %_ptr_Function_v4int Function
%clampHigh = OpVariable %_ptr_Function_v4int Function
%152 = OpVariable %_ptr_Function_v4float Function
OpStore %expectedA %28
%30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%32 = OpLoad %v4float %30
%34 = OpVectorTimesScalar %v4float %32 %float_100
%35 = OpCompositeExtract %float %34 0
%36 = OpConvertFToS %int %35
%37 = OpCompositeExtract %float %34 1
%38 = OpConvertFToS %int %37
%39 = OpCompositeExtract %float %34 2
%40 = OpConvertFToS %int %39
%41 = OpCompositeExtract %float %34 3
%42 = OpConvertFToS %int %41
%43 = OpCompositeConstruct %v4int %36 %38 %40 %42
OpStore %intValues %43
OpStore %clampLow %46
OpStore %expectedB %50
OpStore %clampHigh %54
%57 = OpLoad %v4int %intValues
%58 = OpCompositeExtract %int %57 0
%56 = OpExtInst %int %1 SClamp %58 %int_n100 %int_100
%59 = OpLoad %v4int %expectedA
%60 = OpCompositeExtract %int %59 0
%61 = OpIEqual %bool %56 %60
OpSelectionMerge %63 None
OpBranchConditional %61 %62 %63
%62 = OpLabel
%65 = OpLoad %v4int %intValues
%66 = OpVectorShuffle %v2int %65 %65 0 1
%68 = OpCompositeConstruct %v2int %int_n100 %int_n100
%69 = OpCompositeConstruct %v2int %int_100 %int_100
%64 = OpExtInst %v2int %1 SClamp %66 %68 %69
%70 = OpLoad %v4int %expectedA
%71 = OpVectorShuffle %v2int %70 %70 0 1
%72 = OpIEqual %v2bool %64 %71
%74 = OpAll %bool %72
OpBranch %63
%63 = OpLabel
%75 = OpPhi %bool %false %19 %74 %62
OpSelectionMerge %77 None
OpBranchConditional %75 %76 %77
%76 = OpLabel
%79 = OpLoad %v4int %intValues
%80 = OpVectorShuffle %v3int %79 %79 0 1 2
%82 = OpCompositeConstruct %v3int %int_n100 %int_n100 %int_n100
%83 = OpCompositeConstruct %v3int %int_100 %int_100 %int_100
%78 = OpExtInst %v3int %1 SClamp %80 %82 %83
%84 = OpLoad %v4int %expectedA
%85 = OpVectorShuffle %v3int %84 %84 0 1 2
%86 = OpIEqual %v3bool %78 %85
%88 = OpAll %bool %86
OpBranch %77
%77 = OpLabel
%89 = OpPhi %bool %false %63 %88 %76
OpSelectionMerge %91 None
OpBranchConditional %89 %90 %91
%90 = OpLabel
%93 = OpLoad %v4int %intValues
%94 = OpCompositeConstruct %v4int %int_n100 %int_n100 %int_n100 %int_n100
%95 = OpCompositeConstruct %v4int %int_100 %int_100 %int_100 %int_100
%92 = OpExtInst %v4int %1 SClamp %93 %94 %95
%96 = OpLoad %v4int %expectedA
%97 = OpIEqual %v4bool %92 %96
%99 = OpAll %bool %97
OpBranch %91
%91 = OpLabel
%94 = OpLoad %v4int %intValues
%95 = OpVectorShuffle %v2int %94 %94 0 1
%93 = OpExtInst %v2int %1 SClamp %95 %97 %99
%100 = OpIEqual %v2bool %93 %54
%101 = OpAll %bool %100
OpBranch %92
%92 = OpLabel
%102 = OpPhi %bool %false %85 %101 %91
OpSelectionMerge %104 None
OpBranchConditional %102 %103 %104
%103 = OpLabel
%106 = OpLoad %v4int %intValues
%107 = OpVectorShuffle %v3int %106 %106 0 1 2
%105 = OpExtInst %v3int %1 SClamp %107 %108 %110
%112 = OpIEqual %v3bool %105 %111
%113 = OpAll %bool %112
OpBranch %104
%104 = OpLabel
%114 = OpPhi %bool %false %92 %113 %103
OpSelectionMerge %116 None
OpBranchConditional %114 %115 %116
%100 = OpPhi %bool %false %77 %99 %90
OpSelectionMerge %102 None
OpBranchConditional %100 %101 %102
%101 = OpLabel
%104 = OpLoad %v4int %intValues
%105 = OpCompositeExtract %int %104 0
%106 = OpLoad %v4int %clampLow
%107 = OpCompositeExtract %int %106 0
%108 = OpLoad %v4int %clampHigh
%109 = OpCompositeExtract %int %108 0
%103 = OpExtInst %int %1 SClamp %105 %107 %109
%110 = OpLoad %v4int %expectedB
%111 = OpCompositeExtract %int %110 0
%112 = OpIEqual %bool %103 %111
OpBranch %102
%102 = OpLabel
%113 = OpPhi %bool %false %91 %112 %101
OpSelectionMerge %115 None
OpBranchConditional %113 %114 %115
%114 = OpLabel
%117 = OpLoad %v4int %intValues
%118 = OpVectorShuffle %v2int %117 %117 0 1
%119 = OpLoad %v4int %clampLow
%120 = OpVectorShuffle %v2int %119 %119 0 1
%121 = OpLoad %v4int %clampHigh
%122 = OpVectorShuffle %v2int %121 %121 0 1
%116 = OpExtInst %v2int %1 SClamp %118 %120 %122
%123 = OpLoad %v4int %expectedB
%124 = OpVectorShuffle %v2int %123 %123 0 1
%125 = OpIEqual %v2bool %116 %124
%126 = OpAll %bool %125
OpBranch %115
%115 = OpLabel
%118 = OpLoad %v4int %intValues
%117 = OpExtInst %v4int %1 SClamp %118 %119 %121
%124 = OpIEqual %v4bool %117 %123
%125 = OpAll %bool %124
OpBranch %116
%116 = OpLabel
%126 = OpPhi %bool %false %104 %125 %115
OpSelectionMerge %131 None
OpBranchConditional %126 %129 %130
%127 = OpPhi %bool %false %102 %126 %114
OpSelectionMerge %129 None
OpBranchConditional %127 %128 %129
%128 = OpLabel
%131 = OpLoad %v4int %intValues
%132 = OpVectorShuffle %v3int %131 %131 0 1 2
%133 = OpLoad %v4int %clampLow
%134 = OpVectorShuffle %v3int %133 %133 0 1 2
%135 = OpLoad %v4int %clampHigh
%136 = OpVectorShuffle %v3int %135 %135 0 1 2
%130 = OpExtInst %v3int %1 SClamp %132 %134 %136
%137 = OpLoad %v4int %expectedB
%138 = OpVectorShuffle %v3int %137 %137 0 1 2
%139 = OpIEqual %v3bool %130 %138
%140 = OpAll %bool %139
OpBranch %129
%129 = OpLabel
%132 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%134 = OpLoad %v4float %132
OpStore %127 %134
OpBranch %131
%130 = OpLabel
%135 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%137 = OpLoad %v4float %135
OpStore %127 %137
OpBranch %131
%131 = OpLabel
%138 = OpLoad %v4float %127
OpReturnValue %138
%141 = OpPhi %bool %false %115 %140 %128
OpSelectionMerge %143 None
OpBranchConditional %141 %142 %143
%142 = OpLabel
%145 = OpLoad %v4int %intValues
%146 = OpLoad %v4int %clampLow
%147 = OpLoad %v4int %clampHigh
%144 = OpExtInst %v4int %1 SClamp %145 %146 %147
%148 = OpLoad %v4int %expectedB
%149 = OpIEqual %v4bool %144 %148
%150 = OpAll %bool %149
OpBranch %143
%143 = OpLabel
%151 = OpPhi %bool %false %129 %150 %142
OpSelectionMerge %156 None
OpBranchConditional %151 %154 %155
%154 = OpLabel
%157 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%159 = OpLoad %v4float %157
OpStore %152 %159
OpBranch %156
%155 = OpLabel
%160 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%162 = OpLoad %v4float %160
OpStore %152 %162
OpBranch %156
%156 = OpLabel
%163 = OpLoad %v4float %152
OpReturnValue %163
OpFunctionEnd

View File

@ -4,6 +4,10 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
ivec4 expectedA = ivec4(-100, 0, 75, 100);
ivec4 intValues = ivec4(testInputs * 100.0);
return ((((((clamp(intValues.x, -100, 100) == -100 && clamp(intValues.xy, -100, 100) == ivec2(-100, 0)) && clamp(intValues.xyz, -100, 100) == ivec3(-100, 0, 75)) && clamp(intValues, -100, 100) == ivec4(-100, 0, 75, 100)) && clamp(intValues.x, -100, 100) == -100) && clamp(intValues.xy, ivec2(-100, -200), ivec2(100, 200)) == ivec2(-100, 0)) && clamp(intValues.xyz, ivec3(-100, -200, -200), ivec3(100, 200, 50)) == ivec3(-100, 0, 50)) && clamp(intValues, ivec4(-100, -200, -200, 100), ivec4(100, 200, 50, 300)) == ivec4(-100, 0, 50, 225) ? colorGreen : colorRed;
ivec4 clampLow = ivec4(-100, -200, -200, 100);
ivec4 expectedB = ivec4(-100, 0, 50, 225);
ivec4 clampHigh = ivec4(100, 200, 50, 300);
return ((((((clamp(intValues.x, -100, 100) == expectedA.x && clamp(intValues.xy, -100, 100) == expectedA.xy) && clamp(intValues.xyz, -100, 100) == expectedA.xyz) && clamp(intValues, -100, 100) == expectedA) && clamp(intValues.x, clampLow.x, clampHigh.x) == expectedB.x) && clamp(intValues.xy, clampLow.xy, clampHigh.xy) == expectedB.xy) && clamp(intValues.xyz, clampLow.xyz, clampHigh.xyz) == expectedB.xyz) && clamp(intValues, clampLow, clampHigh) == expectedB ? colorGreen : colorRed;
}

View File

@ -17,7 +17,11 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
int4 expectedA = int4(-100, 0, 75, 100);
int4 intValues = int4(_uniforms.testInputs * 100.0);
_out.sk_FragColor = ((((((clamp(intValues.x, -100, 100) == -100 && all(clamp(intValues.xy, -100, 100) == int2(-100, 0))) && all(clamp(intValues.xyz, -100, 100) == int3(-100, 0, 75))) && all(clamp(intValues, -100, 100) == int4(-100, 0, 75, 100))) && clamp(intValues.x, -100, 100) == -100) && all(clamp(intValues.xy, int2(-100, -200), int2(100, 200)) == int2(-100, 0))) && all(clamp(intValues.xyz, int3(-100, -200, -200), int3(100, 200, 50)) == int3(-100, 0, 50))) && all(clamp(intValues, int4(-100, -200, -200, 100), int4(100, 200, 50, 300)) == int4(-100, 0, 50, 225)) ? _uniforms.colorGreen : _uniforms.colorRed;
int4 clampLow = int4(-100, -200, -200, 100);
int4 expectedB = int4(-100, 0, 50, 225);
int4 clampHigh = int4(100, 200, 50, 300);
_out.sk_FragColor = ((((((clamp(intValues.x, -100, 100) == expectedA.x && all(clamp(intValues.xy, -100, 100) == expectedA.xy)) && all(clamp(intValues.xyz, -100, 100) == expectedA.xyz)) && all(clamp(intValues, -100, 100) == expectedA)) && clamp(intValues.x, clampLow.x, clampHigh.x) == expectedB.x) && all(clamp(intValues.xy, clampLow.xy, clampHigh.xy) == expectedB.xy)) && all(clamp(intValues.xyz, clampLow.xyz, clampHigh.xyz) == expectedB.xyz)) && all(clamp(intValues, clampLow, clampHigh) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,7 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expected "expected"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,13 +26,17 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %32 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %59 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %76 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %41 RelaxedPrecision
OpDecorate %44 RelaxedPrecision
OpDecorate %54 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %79 RelaxedPrecision
OpDecorate %82 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -45,22 +50,20 @@ OpDecorate %77 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_n2 = OpConstant %float -2
%float_0 = OpConstant %float 0
%float_2 = OpConstant %float 2
%25 = OpConstantComposite %v4float %float_n2 %float_0 %float_0 %float_2
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_n2 = OpConstant %float -2
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%38 = OpConstantComposite %v2float %float_n2 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%50 = OpConstantComposite %v3float %float_n2 %float_0 %float_0
%v3bool = OpTypeVector %bool 3
%float_2 = OpConstant %float 2
%61 = OpConstantComposite %v4float %float_n2 %float_0 %float_0 %float_2
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -71,60 +74,69 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%66 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 Floor %27
%29 = OpFOrdEqual %bool %21 %float_n2
OpSelectionMerge %31 None
OpBranchConditional %29 %30 %31
%30 = OpLabel
%33 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %33
%35 = OpVectorShuffle %v2float %34 %34 0 1
%32 = OpExtInst %v2float %1 Floor %35
%39 = OpFOrdEqual %v2bool %32 %38
%41 = OpAll %bool %39
OpBranch %31
%31 = OpLabel
%42 = OpPhi %bool %false %19 %41 %30
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%47 = OpLoad %v4float %46
%48 = OpVectorShuffle %v3float %47 %47 0 1 2
%45 = OpExtInst %v3float %1 Floor %48
%51 = OpFOrdEqual %v3bool %45 %50
%53 = OpAll %bool %51
OpBranch %44
%44 = OpLabel
%54 = OpPhi %bool %false %31 %53 %43
OpSelectionMerge %56 None
OpBranchConditional %54 %55 %56
%55 = OpLabel
%58 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%59 = OpLoad %v4float %58
%57 = OpExtInst %v4float %1 Floor %59
%62 = OpFOrdEqual %v4bool %57 %61
%64 = OpAll %bool %62
OpBranch %56
%56 = OpLabel
%65 = OpPhi %bool %false %44 %64 %55
OpSelectionMerge %70 None
OpBranchConditional %65 %68 %69
%68 = OpLabel
%71 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%73 = OpLoad %v4float %71
OpStore %66 %73
OpBranch %70
%69 = OpLabel
%74 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%76 = OpLoad %v4float %74
OpStore %66 %76
OpBranch %70
%70 = OpLabel
%77 = OpLoad %v4float %66
OpReturnValue %77
%expected = OpVariable %_ptr_Function_v4float Function
%73 = OpVariable %_ptr_Function_v4float Function
OpStore %expected %25
%28 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%32 = OpLoad %v4float %28
%33 = OpCompositeExtract %float %32 0
%27 = OpExtInst %float %1 Floor %33
%34 = OpLoad %v4float %expected
%35 = OpCompositeExtract %float %34 0
%36 = OpFOrdEqual %bool %27 %35
OpSelectionMerge %38 None
OpBranchConditional %36 %37 %38
%37 = OpLabel
%40 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%41 = OpLoad %v4float %40
%42 = OpVectorShuffle %v2float %41 %41 0 1
%39 = OpExtInst %v2float %1 Floor %42
%44 = OpLoad %v4float %expected
%45 = OpVectorShuffle %v2float %44 %44 0 1
%46 = OpFOrdEqual %v2bool %39 %45
%48 = OpAll %bool %46
OpBranch %38
%38 = OpLabel
%49 = OpPhi %bool %false %19 %48 %37
OpSelectionMerge %51 None
OpBranchConditional %49 %50 %51
%50 = OpLabel
%53 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%54 = OpLoad %v4float %53
%55 = OpVectorShuffle %v3float %54 %54 0 1 2
%52 = OpExtInst %v3float %1 Floor %55
%57 = OpLoad %v4float %expected
%58 = OpVectorShuffle %v3float %57 %57 0 1 2
%59 = OpFOrdEqual %v3bool %52 %58
%61 = OpAll %bool %59
OpBranch %51
%51 = OpLabel
%62 = OpPhi %bool %false %38 %61 %50
OpSelectionMerge %64 None
OpBranchConditional %62 %63 %64
%63 = OpLabel
%66 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%67 = OpLoad %v4float %66
%65 = OpExtInst %v4float %1 Floor %67
%68 = OpLoad %v4float %expected
%69 = OpFOrdEqual %v4bool %65 %68
%71 = OpAll %bool %69
OpBranch %64
%64 = OpLabel
%72 = OpPhi %bool %false %51 %71 %63
OpSelectionMerge %76 None
OpBranchConditional %72 %74 %75
%74 = OpLabel
%77 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%79 = OpLoad %v4float %77
OpStore %73 %79
OpBranch %76
%75 = OpLabel
%80 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%82 = OpLoad %v4float %80
OpStore %73 %82
OpBranch %76
%76 = OpLabel
%83 = OpLoad %v4float %73
OpReturnValue %83
OpFunctionEnd

View File

@ -4,5 +4,6 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((floor(testInputs.x) == -2.0 && floor(testInputs.xy) == vec2(-2.0, 0.0)) && floor(testInputs.xyz) == vec3(-2.0, 0.0, 0.0)) && floor(testInputs) == vec4(-2.0, 0.0, 0.0, 2.0) ? colorGreen : colorRed;
vec4 expected = vec4(-2.0, 0.0, 0.0, 2.0);
return ((floor(testInputs.x) == expected.x && floor(testInputs.xy) == expected.xy) && floor(testInputs.xyz) == expected.xyz) && floor(testInputs) == expected ? colorGreen : colorRed;
}

View File

@ -17,6 +17,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((floor(_uniforms.testInputs.x) == -2.0 && all(floor(_uniforms.testInputs.xy) == float2(-2.0, 0.0))) && all(floor(_uniforms.testInputs.xyz) == float3(-2.0, 0.0, 0.0))) && all(floor(_uniforms.testInputs) == float4(-2.0, 0.0, 0.0, 2.0)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expected = float4(-2.0, 0.0, 0.0, 2.0);
_out.sk_FragColor = ((floor(_uniforms.testInputs.x) == expected.x && all(floor(_uniforms.testInputs.xy) == expected.xy)) && all(floor(_uniforms.testInputs.xyz) == expected.xyz)) && all(floor(_uniforms.testInputs) == expected) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,8 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expectedA "expectedA"
OpName %expectedB "expectedB"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,24 +27,32 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %50 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %36 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %49 RelaxedPrecision
OpDecorate %59 RelaxedPrecision
OpDecorate %62 RelaxedPrecision
OpDecorate %63 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %86 RelaxedPrecision
OpDecorate %89 RelaxedPrecision
OpDecorate %100 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %75 RelaxedPrecision
OpDecorate %84 RelaxedPrecision
OpDecorate %88 RelaxedPrecision
OpDecorate %90 RelaxedPrecision
OpDecorate %98 RelaxedPrecision
OpDecorate %101 RelaxedPrecision
OpDecorate %103 RelaxedPrecision
OpDecorate %113 RelaxedPrecision
OpDecorate %112 RelaxedPrecision
OpDecorate %115 RelaxedPrecision
OpDecorate %117 RelaxedPrecision
OpDecorate %126 RelaxedPrecision
OpDecorate %128 RelaxedPrecision
OpDecorate %129 RelaxedPrecision
OpDecorate %130 RelaxedPrecision
OpDecorate %138 RelaxedPrecision
OpDecorate %141 RelaxedPrecision
OpDecorate %142 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -56,28 +66,24 @@ OpDecorate %130 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_0_5 = OpConstant %float 0.5
%float_0_75 = OpConstant %float 0.75
%float_2_25 = OpConstant %float 2.25
%25 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_75 %float_2_25
%float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%29 = OpConstantComposite %v4float %float_0 %float_1 %float_0_75 %float_2_25
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_0_5 = OpConstant %float 0.5
%v2float = OpTypeVector %float 2
%38 = OpConstantComposite %v2float %float_0_5 %float_0_5
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%float_0_75 = OpConstant %float 0.75
%52 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_75
%v3bool = OpTypeVector %bool 3
%float_2_25 = OpConstant %float 2.25
%64 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_75 %float_2_25
%v4bool = OpTypeVector %bool 4
%int_1 = OpConstant %int 1
%float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%92 = OpConstantComposite %v2float %float_0 %float_1
%105 = OpConstantComposite %v3float %float_0 %float_1 %float_0_75
%116 = OpConstantComposite %v4float %float_0 %float_1 %float_0_75 %float_2_25
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
%16 = OpLabel
@ -87,120 +93,138 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%120 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 FMax %27 %float_0_5
%29 = OpFOrdEqual %bool %21 %float_0_5
OpSelectionMerge %31 None
OpBranchConditional %29 %30 %31
%30 = OpLabel
%33 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %33
%35 = OpVectorShuffle %v2float %34 %34 0 1
%37 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%32 = OpExtInst %v2float %1 FMax %35 %37
%39 = OpFOrdEqual %v2bool %32 %38
%41 = OpAll %bool %39
OpBranch %31
%31 = OpLabel
%42 = OpPhi %bool %false %19 %41 %30
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%47 = OpLoad %v4float %46
%48 = OpVectorShuffle %v3float %47 %47 0 1 2
%50 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%45 = OpExtInst %v3float %1 FMax %48 %50
%53 = OpFOrdEqual %v3bool %45 %52
%55 = OpAll %bool %53
OpBranch %44
%44 = OpLabel
%56 = OpPhi %bool %false %31 %55 %43
OpSelectionMerge %58 None
OpBranchConditional %56 %57 %58
%57 = OpLabel
%60 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%61 = OpLoad %v4float %60
%62 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%59 = OpExtInst %v4float %1 FMax %61 %62
%65 = OpFOrdEqual %v4bool %59 %64
%expectedA = OpVariable %_ptr_Function_v4float Function
%expectedB = OpVariable %_ptr_Function_v4float Function
%133 = OpVariable %_ptr_Function_v4float Function
OpStore %expectedA %25
OpStore %expectedB %29
%32 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%36 = OpLoad %v4float %32
%37 = OpCompositeExtract %float %36 0
%31 = OpExtInst %float %1 FMax %37 %float_0_5
%38 = OpLoad %v4float %expectedA
%39 = OpCompositeExtract %float %38 0
%40 = OpFOrdEqual %bool %31 %39
OpSelectionMerge %42 None
OpBranchConditional %40 %41 %42
%41 = OpLabel
%44 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%45 = OpLoad %v4float %44
%46 = OpVectorShuffle %v2float %45 %45 0 1
%48 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%43 = OpExtInst %v2float %1 FMax %46 %48
%49 = OpLoad %v4float %expectedA
%50 = OpVectorShuffle %v2float %49 %49 0 1
%51 = OpFOrdEqual %v2bool %43 %50
%53 = OpAll %bool %51
OpBranch %42
%42 = OpLabel
%54 = OpPhi %bool %false %19 %53 %41
OpSelectionMerge %56 None
OpBranchConditional %54 %55 %56
%55 = OpLabel
%58 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%59 = OpLoad %v4float %58
%60 = OpVectorShuffle %v3float %59 %59 0 1 2
%62 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%57 = OpExtInst %v3float %1 FMax %60 %62
%63 = OpLoad %v4float %expectedA
%64 = OpVectorShuffle %v3float %63 %63 0 1 2
%65 = OpFOrdEqual %v3bool %57 %64
%67 = OpAll %bool %65
OpBranch %58
%58 = OpLabel
%68 = OpPhi %bool %false %44 %67 %57
OpBranch %56
%56 = OpLabel
%68 = OpPhi %bool %false %42 %67 %55
OpSelectionMerge %70 None
OpBranchConditional %68 %69 %70
%69 = OpLabel
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%73 = OpLoad %v4float %72
%74 = OpCompositeExtract %float %73 0
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%77 = OpLoad %v4float %75
%78 = OpCompositeExtract %float %77 0
%71 = OpExtInst %float %1 FMax %74 %78
%80 = OpFOrdEqual %bool %71 %float_0
%74 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%71 = OpExtInst %v4float %1 FMax %73 %74
%75 = OpLoad %v4float %expectedA
%76 = OpFOrdEqual %v4bool %71 %75
%78 = OpAll %bool %76
OpBranch %70
%70 = OpLabel
%81 = OpPhi %bool %false %58 %80 %69
OpSelectionMerge %83 None
OpBranchConditional %81 %82 %83
%82 = OpLabel
%85 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%86 = OpLoad %v4float %85
%87 = OpVectorShuffle %v2float %86 %86 0 1
%88 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%89 = OpLoad %v4float %88
%90 = OpVectorShuffle %v2float %89 %89 0 1
%84 = OpExtInst %v2float %1 FMax %87 %90
%93 = OpFOrdEqual %v2bool %84 %92
%94 = OpAll %bool %93
OpBranch %83
%83 = OpLabel
%95 = OpPhi %bool %false %70 %94 %82
OpSelectionMerge %97 None
OpBranchConditional %95 %96 %97
%96 = OpLabel
%99 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%100 = OpLoad %v4float %99
%101 = OpVectorShuffle %v3float %100 %100 0 1 2
%102 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%103 = OpLoad %v4float %102
%104 = OpVectorShuffle %v3float %103 %103 0 1 2
%98 = OpExtInst %v3float %1 FMax %101 %104
%106 = OpFOrdEqual %v3bool %98 %105
%107 = OpAll %bool %106
OpBranch %97
%97 = OpLabel
%108 = OpPhi %bool %false %83 %107 %96
OpSelectionMerge %110 None
OpBranchConditional %108 %109 %110
%109 = OpLabel
%112 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%113 = OpLoad %v4float %112
%79 = OpPhi %bool %false %56 %78 %69
OpSelectionMerge %81 None
OpBranchConditional %79 %80 %81
%80 = OpLabel
%83 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%84 = OpLoad %v4float %83
%85 = OpCompositeExtract %float %84 0
%86 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%88 = OpLoad %v4float %86
%89 = OpCompositeExtract %float %88 0
%82 = OpExtInst %float %1 FMax %85 %89
%90 = OpLoad %v4float %expectedB
%91 = OpCompositeExtract %float %90 0
%92 = OpFOrdEqual %bool %82 %91
OpBranch %81
%81 = OpLabel
%93 = OpPhi %bool %false %70 %92 %80
OpSelectionMerge %95 None
OpBranchConditional %93 %94 %95
%94 = OpLabel
%97 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%98 = OpLoad %v4float %97
%99 = OpVectorShuffle %v2float %98 %98 0 1
%100 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%101 = OpLoad %v4float %100
%102 = OpVectorShuffle %v2float %101 %101 0 1
%96 = OpExtInst %v2float %1 FMax %99 %102
%103 = OpLoad %v4float %expectedB
%104 = OpVectorShuffle %v2float %103 %103 0 1
%105 = OpFOrdEqual %v2bool %96 %104
%106 = OpAll %bool %105
OpBranch %95
%95 = OpLabel
%107 = OpPhi %bool %false %81 %106 %94
OpSelectionMerge %109 None
OpBranchConditional %107 %108 %109
%108 = OpLabel
%111 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%112 = OpLoad %v4float %111
%113 = OpVectorShuffle %v3float %112 %112 0 1 2
%114 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%115 = OpLoad %v4float %114
%111 = OpExtInst %v4float %1 FMax %113 %115
%117 = OpFOrdEqual %v4bool %111 %116
%118 = OpAll %bool %117
OpBranch %110
%110 = OpLabel
%119 = OpPhi %bool %false %97 %118 %109
OpSelectionMerge %124 None
OpBranchConditional %119 %122 %123
%116 = OpVectorShuffle %v3float %115 %115 0 1 2
%110 = OpExtInst %v3float %1 FMax %113 %116
%117 = OpLoad %v4float %expectedB
%118 = OpVectorShuffle %v3float %117 %117 0 1 2
%119 = OpFOrdEqual %v3bool %110 %118
%120 = OpAll %bool %119
OpBranch %109
%109 = OpLabel
%121 = OpPhi %bool %false %95 %120 %108
OpSelectionMerge %123 None
OpBranchConditional %121 %122 %123
%122 = OpLabel
%125 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%125 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%126 = OpLoad %v4float %125
OpStore %120 %126
OpBranch %124
%127 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%128 = OpLoad %v4float %127
%124 = OpExtInst %v4float %1 FMax %126 %128
%129 = OpLoad %v4float %expectedB
%130 = OpFOrdEqual %v4bool %124 %129
%131 = OpAll %bool %130
OpBranch %123
%123 = OpLabel
%127 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%129 = OpLoad %v4float %127
OpStore %120 %129
OpBranch %124
%124 = OpLabel
%130 = OpLoad %v4float %120
OpReturnValue %130
%132 = OpPhi %bool %false %109 %131 %122
OpSelectionMerge %136 None
OpBranchConditional %132 %134 %135
%134 = OpLabel
%137 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%138 = OpLoad %v4float %137
OpStore %133 %138
OpBranch %136
%135 = OpLabel
%139 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%141 = OpLoad %v4float %139
OpStore %133 %141
OpBranch %136
%136 = OpLabel
%142 = OpLoad %v4float %133
OpReturnValue %142
OpFunctionEnd

View File

@ -4,5 +4,7 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((((((max(testInputs.x, 0.5) == 0.5 && max(testInputs.xy, 0.5) == vec2(0.5, 0.5)) && max(testInputs.xyz, 0.5) == vec3(0.5, 0.5, 0.75)) && max(testInputs, 0.5) == vec4(0.5, 0.5, 0.75, 2.25)) && max(testInputs.x, colorGreen.x) == 0.0) && max(testInputs.xy, colorGreen.xy) == vec2(0.0, 1.0)) && max(testInputs.xyz, colorGreen.xyz) == vec3(0.0, 1.0, 0.75)) && max(testInputs, colorGreen) == vec4(0.0, 1.0, 0.75, 2.25) ? colorGreen : colorRed;
vec4 expectedA = vec4(0.5, 0.5, 0.75, 2.25);
vec4 expectedB = vec4(0.0, 1.0, 0.75, 2.25);
return ((((((max(testInputs.x, 0.5) == expectedA.x && max(testInputs.xy, 0.5) == expectedA.xy) && max(testInputs.xyz, 0.5) == expectedA.xyz) && max(testInputs, 0.5) == expectedA) && max(testInputs.x, colorGreen.x) == expectedB.x) && max(testInputs.xy, colorGreen.xy) == expectedB.xy) && max(testInputs.xyz, colorGreen.xyz) == expectedB.xyz) && max(testInputs, colorGreen) == expectedB ? colorGreen : colorRed;
}

View File

@ -17,6 +17,8 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((((((max(_uniforms.testInputs.x, 0.5) == 0.5 && all(max(_uniforms.testInputs.xy, 0.5) == float2(0.5, 0.5))) && all(max(_uniforms.testInputs.xyz, 0.5) == float3(0.5, 0.5, 0.75))) && all(max(_uniforms.testInputs, 0.5) == float4(0.5, 0.5, 0.75, 2.25))) && max(_uniforms.testInputs.x, _uniforms.colorGreen.x) == 0.0) && all(max(_uniforms.testInputs.xy, _uniforms.colorGreen.xy) == float2(0.0, 1.0))) && all(max(_uniforms.testInputs.xyz, _uniforms.colorGreen.xyz) == float3(0.0, 1.0, 0.75))) && all(max(_uniforms.testInputs, _uniforms.colorGreen) == float4(0.0, 1.0, 0.75, 2.25)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expectedA = float4(0.5, 0.5, 0.75, 2.25);
float4 expectedB = float4(0.0, 1.0, 0.75, 2.25);
_out.sk_FragColor = ((((((max(_uniforms.testInputs.x, 0.5) == expectedA.x && all(max(_uniforms.testInputs.xy, 0.5) == expectedA.xy)) && all(max(_uniforms.testInputs.xyz, 0.5) == expectedA.xyz)) && all(max(_uniforms.testInputs, 0.5) == expectedA)) && max(_uniforms.testInputs.x, _uniforms.colorGreen.x) == expectedB.x) && all(max(_uniforms.testInputs.xy, _uniforms.colorGreen.xy) == expectedB.xy)) && all(max(_uniforms.testInputs.xyz, _uniforms.colorGreen.xyz) == expectedB.xyz)) && all(max(_uniforms.testInputs, _uniforms.colorGreen) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -13,6 +13,8 @@ OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %intValues "intValues"
OpName %intGreen "intGreen"
OpName %expectedA "expectedA"
OpName %expectedB "expectedB"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -29,9 +31,9 @@ OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %27 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %142 RelaxedPrecision
OpDecorate %145 RelaxedPrecision
OpDecorate %146 RelaxedPrecision
OpDecorate %154 RelaxedPrecision
OpDecorate %157 RelaxedPrecision
OpDecorate %158 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -52,22 +54,18 @@ OpDecorate %146 RelaxedPrecision
%int_0 = OpConstant %int 0
%float_100 = OpConstant %float 100
%int_1 = OpConstant %int 1
%false = OpConstantFalse %bool
%int_50 = OpConstant %int 50
%int_75 = OpConstant %int 75
%int_225 = OpConstant %int 225
%57 = OpConstantComposite %v4int %int_50 %int_50 %int_75 %int_225
%int_100 = OpConstant %int 100
%60 = OpConstantComposite %v4int %int_0 %int_100 %int_75 %int_225
%false = OpConstantFalse %bool
%v2int = OpTypeVector %int 2
%66 = OpConstantComposite %v2int %int_50 %int_50
%v2bool = OpTypeVector %bool 2
%v3int = OpTypeVector %int 3
%int_75 = OpConstant %int 75
%79 = OpConstantComposite %v3int %int_50 %int_50 %int_75
%v3bool = OpTypeVector %bool 3
%int_225 = OpConstant %int 225
%90 = OpConstantComposite %v4int %int_50 %int_50 %int_75 %int_225
%v4bool = OpTypeVector %bool 4
%int_100 = OpConstant %int 100
%112 = OpConstantComposite %v2int %int_0 %int_100
%123 = OpConstantComposite %v3int %int_0 %int_100 %int_75
%132 = OpConstantComposite %v4int %int_0 %int_100 %int_75 %int_225
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -80,7 +78,9 @@ OpFunctionEnd
%19 = OpLabel
%intValues = OpVariable %_ptr_Function_v4int Function
%intGreen = OpVariable %_ptr_Function_v4int Function
%136 = OpVariable %_ptr_Function_v4float Function
%expectedA = OpVariable %_ptr_Function_v4int Function
%expectedB = OpVariable %_ptr_Function_v4int Function
%148 = OpVariable %_ptr_Function_v4float Function
%24 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%27 = OpLoad %v4float %24
%29 = OpVectorTimesScalar %v4float %27 %float_100
@ -107,107 +107,123 @@ OpStore %intValues %38
%51 = OpConvertFToS %int %50
%52 = OpCompositeConstruct %v4int %45 %47 %49 %51
OpStore %intGreen %52
%55 = OpLoad %v4int %intValues
%56 = OpCompositeExtract %int %55 0
%54 = OpExtInst %int %1 SMax %56 %int_50
%58 = OpIEqual %bool %54 %int_50
OpSelectionMerge %60 None
OpBranchConditional %58 %59 %60
%59 = OpLabel
%62 = OpLoad %v4int %intValues
%63 = OpVectorShuffle %v2int %62 %62 0 1
%65 = OpCompositeConstruct %v2int %int_50 %int_50
%61 = OpExtInst %v2int %1 SMax %63 %65
%67 = OpIEqual %v2bool %61 %66
%69 = OpAll %bool %67
OpBranch %60
%60 = OpLabel
%70 = OpPhi %bool %false %19 %69 %59
OpSelectionMerge %72 None
OpBranchConditional %70 %71 %72
%71 = OpLabel
%74 = OpLoad %v4int %intValues
%75 = OpVectorShuffle %v3int %74 %74 0 1 2
%77 = OpCompositeConstruct %v3int %int_50 %int_50 %int_50
%73 = OpExtInst %v3int %1 SMax %75 %77
%80 = OpIEqual %v3bool %73 %79
%82 = OpAll %bool %80
OpBranch %72
%72 = OpLabel
%83 = OpPhi %bool %false %60 %82 %71
OpSelectionMerge %85 None
OpBranchConditional %83 %84 %85
%84 = OpLabel
%87 = OpLoad %v4int %intValues
%88 = OpCompositeConstruct %v4int %int_50 %int_50 %int_50 %int_50
%86 = OpExtInst %v4int %1 SMax %87 %88
%91 = OpIEqual %v4bool %86 %90
%93 = OpAll %bool %91
OpBranch %85
%85 = OpLabel
%94 = OpPhi %bool %false %72 %93 %84
OpSelectionMerge %96 None
OpBranchConditional %94 %95 %96
OpStore %expectedA %57
OpStore %expectedB %60
%63 = OpLoad %v4int %intValues
%64 = OpCompositeExtract %int %63 0
%62 = OpExtInst %int %1 SMax %64 %int_50
%65 = OpLoad %v4int %expectedA
%66 = OpCompositeExtract %int %65 0
%67 = OpIEqual %bool %62 %66
OpSelectionMerge %69 None
OpBranchConditional %67 %68 %69
%68 = OpLabel
%71 = OpLoad %v4int %intValues
%72 = OpVectorShuffle %v2int %71 %71 0 1
%74 = OpCompositeConstruct %v2int %int_50 %int_50
%70 = OpExtInst %v2int %1 SMax %72 %74
%75 = OpLoad %v4int %expectedA
%76 = OpVectorShuffle %v2int %75 %75 0 1
%77 = OpIEqual %v2bool %70 %76
%79 = OpAll %bool %77
OpBranch %69
%69 = OpLabel
%80 = OpPhi %bool %false %19 %79 %68
OpSelectionMerge %82 None
OpBranchConditional %80 %81 %82
%81 = OpLabel
%84 = OpLoad %v4int %intValues
%85 = OpVectorShuffle %v3int %84 %84 0 1 2
%87 = OpCompositeConstruct %v3int %int_50 %int_50 %int_50
%83 = OpExtInst %v3int %1 SMax %85 %87
%88 = OpLoad %v4int %expectedA
%89 = OpVectorShuffle %v3int %88 %88 0 1 2
%90 = OpIEqual %v3bool %83 %89
%92 = OpAll %bool %90
OpBranch %82
%82 = OpLabel
%93 = OpPhi %bool %false %69 %92 %81
OpSelectionMerge %95 None
OpBranchConditional %93 %94 %95
%94 = OpLabel
%97 = OpLoad %v4int %intValues
%98 = OpCompositeConstruct %v4int %int_50 %int_50 %int_50 %int_50
%96 = OpExtInst %v4int %1 SMax %97 %98
%99 = OpLoad %v4int %expectedA
%100 = OpIEqual %v4bool %96 %99
%102 = OpAll %bool %100
OpBranch %95
%95 = OpLabel
%98 = OpLoad %v4int %intValues
%99 = OpCompositeExtract %int %98 0
%100 = OpLoad %v4int %intGreen
%101 = OpCompositeExtract %int %100 0
%97 = OpExtInst %int %1 SMax %99 %101
%102 = OpIEqual %bool %97 %int_0
OpBranch %96
%96 = OpLabel
%103 = OpPhi %bool %false %85 %102 %95
%103 = OpPhi %bool %false %82 %102 %94
OpSelectionMerge %105 None
OpBranchConditional %103 %104 %105
%104 = OpLabel
%107 = OpLoad %v4int %intValues
%108 = OpVectorShuffle %v2int %107 %107 0 1
%108 = OpCompositeExtract %int %107 0
%109 = OpLoad %v4int %intGreen
%110 = OpVectorShuffle %v2int %109 %109 0 1
%106 = OpExtInst %v2int %1 SMax %108 %110
%113 = OpIEqual %v2bool %106 %112
%114 = OpAll %bool %113
%110 = OpCompositeExtract %int %109 0
%106 = OpExtInst %int %1 SMax %108 %110
%111 = OpLoad %v4int %expectedB
%112 = OpCompositeExtract %int %111 0
%113 = OpIEqual %bool %106 %112
OpBranch %105
%105 = OpLabel
%115 = OpPhi %bool %false %96 %114 %104
OpSelectionMerge %117 None
OpBranchConditional %115 %116 %117
%116 = OpLabel
%119 = OpLoad %v4int %intValues
%120 = OpVectorShuffle %v3int %119 %119 0 1 2
%121 = OpLoad %v4int %intGreen
%122 = OpVectorShuffle %v3int %121 %121 0 1 2
%118 = OpExtInst %v3int %1 SMax %120 %122
%124 = OpIEqual %v3bool %118 %123
%114 = OpPhi %bool %false %95 %113 %104
OpSelectionMerge %116 None
OpBranchConditional %114 %115 %116
%115 = OpLabel
%118 = OpLoad %v4int %intValues
%119 = OpVectorShuffle %v2int %118 %118 0 1
%120 = OpLoad %v4int %intGreen
%121 = OpVectorShuffle %v2int %120 %120 0 1
%117 = OpExtInst %v2int %1 SMax %119 %121
%122 = OpLoad %v4int %expectedB
%123 = OpVectorShuffle %v2int %122 %122 0 1
%124 = OpIEqual %v2bool %117 %123
%125 = OpAll %bool %124
OpBranch %117
%117 = OpLabel
%126 = OpPhi %bool %false %105 %125 %116
OpBranch %116
%116 = OpLabel
%126 = OpPhi %bool %false %105 %125 %115
OpSelectionMerge %128 None
OpBranchConditional %126 %127 %128
%127 = OpLabel
%130 = OpLoad %v4int %intValues
%131 = OpLoad %v4int %intGreen
%129 = OpExtInst %v4int %1 SMax %130 %131
%133 = OpIEqual %v4bool %129 %132
%134 = OpAll %bool %133
%131 = OpVectorShuffle %v3int %130 %130 0 1 2
%132 = OpLoad %v4int %intGreen
%133 = OpVectorShuffle %v3int %132 %132 0 1 2
%129 = OpExtInst %v3int %1 SMax %131 %133
%134 = OpLoad %v4int %expectedB
%135 = OpVectorShuffle %v3int %134 %134 0 1 2
%136 = OpIEqual %v3bool %129 %135
%137 = OpAll %bool %136
OpBranch %128
%128 = OpLabel
%135 = OpPhi %bool %false %117 %134 %127
%138 = OpPhi %bool %false %116 %137 %127
OpSelectionMerge %140 None
OpBranchConditional %135 %138 %139
%138 = OpLabel
%141 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%142 = OpLoad %v4float %141
OpStore %136 %142
OpBranch %140
OpBranchConditional %138 %139 %140
%139 = OpLabel
%143 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%145 = OpLoad %v4float %143
OpStore %136 %145
%142 = OpLoad %v4int %intValues
%143 = OpLoad %v4int %intGreen
%141 = OpExtInst %v4int %1 SMax %142 %143
%144 = OpLoad %v4int %expectedB
%145 = OpIEqual %v4bool %141 %144
%146 = OpAll %bool %145
OpBranch %140
%140 = OpLabel
%146 = OpLoad %v4float %136
OpReturnValue %146
%147 = OpPhi %bool %false %128 %146 %139
OpSelectionMerge %152 None
OpBranchConditional %147 %150 %151
%150 = OpLabel
%153 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%154 = OpLoad %v4float %153
OpStore %148 %154
OpBranch %152
%151 = OpLabel
%155 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%157 = OpLoad %v4float %155
OpStore %148 %157
OpBranch %152
%152 = OpLabel
%158 = OpLoad %v4float %148
OpReturnValue %158
OpFunctionEnd

View File

@ -6,5 +6,7 @@ uniform vec4 colorRed;
vec4 main() {
ivec4 intValues = ivec4(testInputs * 100.0);
ivec4 intGreen = ivec4(colorGreen * 100.0);
return ((((((max(intValues.x, 50) == 50 && max(intValues.xy, 50) == ivec2(50, 50)) && max(intValues.xyz, 50) == ivec3(50, 50, 75)) && max(intValues, 50) == ivec4(50, 50, 75, 225)) && max(intValues.x, intGreen.x) == 0) && max(intValues.xy, intGreen.xy) == ivec2(0, 100)) && max(intValues.xyz, intGreen.xyz) == ivec3(0, 100, 75)) && max(intValues, intGreen) == ivec4(0, 100, 75, 225) ? colorGreen : colorRed;
ivec4 expectedA = ivec4(50, 50, 75, 225);
ivec4 expectedB = ivec4(0, 100, 75, 225);
return ((((((max(intValues.x, 50) == expectedA.x && max(intValues.xy, 50) == expectedA.xy) && max(intValues.xyz, 50) == expectedA.xyz) && max(intValues, 50) == expectedA) && max(intValues.x, intGreen.x) == expectedB.x) && max(intValues.xy, intGreen.xy) == expectedB.xy) && max(intValues.xyz, intGreen.xyz) == expectedB.xyz) && max(intValues, intGreen) == expectedB ? colorGreen : colorRed;
}

View File

@ -19,6 +19,8 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
(void)_out;
int4 intValues = int4(_uniforms.testInputs * 100.0);
int4 intGreen = int4(_uniforms.colorGreen * 100.0);
_out.sk_FragColor = ((((((max(intValues.x, 50) == 50 && all(max(intValues.xy, 50) == int2(50, 50))) && all(max(intValues.xyz, 50) == int3(50, 50, 75))) && all(max(intValues, 50) == int4(50, 50, 75, 225))) && max(intValues.x, intGreen.x) == 0) && all(max(intValues.xy, intGreen.xy) == int2(0, 100))) && all(max(intValues.xyz, intGreen.xyz) == int3(0, 100, 75))) && all(max(intValues, intGreen) == int4(0, 100, 75, 225)) ? _uniforms.colorGreen : _uniforms.colorRed;
int4 expectedA = int4(50, 50, 75, 225);
int4 expectedB = int4(0, 100, 75, 225);
_out.sk_FragColor = ((((((max(intValues.x, 50) == expectedA.x && all(max(intValues.xy, 50) == expectedA.xy)) && all(max(intValues.xyz, 50) == expectedA.xyz)) && all(max(intValues, 50) == expectedA)) && max(intValues.x, intGreen.x) == expectedB.x) && all(max(intValues.xy, intGreen.xy) == expectedB.xy)) && all(max(intValues.xyz, intGreen.xyz) == expectedB.xyz)) && all(max(intValues, intGreen) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,8 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expectedA "expectedA"
OpName %expectedB "expectedB"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,24 +27,32 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %49 RelaxedPrecision
OpDecorate %52 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
OpDecorate %44 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %61 RelaxedPrecision
OpDecorate %62 RelaxedPrecision
OpDecorate %63 RelaxedPrecision
OpDecorate %72 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %85 RelaxedPrecision
OpDecorate %88 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
OpDecorate %87 RelaxedPrecision
OpDecorate %89 RelaxedPrecision
OpDecorate %97 RelaxedPrecision
OpDecorate %100 RelaxedPrecision
OpDecorate %110 RelaxedPrecision
OpDecorate %112 RelaxedPrecision
OpDecorate %124 RelaxedPrecision
OpDecorate %102 RelaxedPrecision
OpDecorate %111 RelaxedPrecision
OpDecorate %114 RelaxedPrecision
OpDecorate %116 RelaxedPrecision
OpDecorate %125 RelaxedPrecision
OpDecorate %127 RelaxedPrecision
OpDecorate %128 RelaxedPrecision
OpDecorate %137 RelaxedPrecision
OpDecorate %140 RelaxedPrecision
OpDecorate %141 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -56,26 +66,23 @@ OpDecorate %128 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_n1_25 = OpConstant %float -1.25
%float_0 = OpConstant %float 0
%float_0_5 = OpConstant %float 0.5
%25 = OpConstantComposite %v4float %float_n1_25 %float_0 %float_0_5 %float_0_5
%float_1 = OpConstant %float 1
%28 = OpConstantComposite %v4float %float_n1_25 %float_0 %float_0 %float_1
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_0_5 = OpConstant %float 0.5
%float_n1_25 = OpConstant %float -1.25
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%40 = OpConstantComposite %v2float %float_n1_25 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%53 = OpConstantComposite %v3float %float_n1_25 %float_0 %float_0_5
%v3bool = OpTypeVector %bool 3
%64 = OpConstantComposite %v4float %float_n1_25 %float_0 %float_0_5 %float_0_5
%v4bool = OpTypeVector %bool 4
%int_1 = OpConstant %int 1
%102 = OpConstantComposite %v3float %float_n1_25 %float_0 %float_0
%float_1 = OpConstant %float 1
%114 = OpConstantComposite %v4float %float_n1_25 %float_0 %float_0 %float_1
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
%16 = OpLabel
@ -85,120 +92,138 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%118 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 FMin %27 %float_0_5
%30 = OpFOrdEqual %bool %21 %float_n1_25
OpSelectionMerge %32 None
OpBranchConditional %30 %31 %32
%31 = OpLabel
%34 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%35 = OpLoad %v4float %34
%36 = OpVectorShuffle %v2float %35 %35 0 1
%38 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%33 = OpExtInst %v2float %1 FMin %36 %38
%41 = OpFOrdEqual %v2bool %33 %40
%43 = OpAll %bool %41
OpBranch %32
%32 = OpLabel
%44 = OpPhi %bool %false %19 %43 %31
OpSelectionMerge %46 None
OpBranchConditional %44 %45 %46
%45 = OpLabel
%48 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%49 = OpLoad %v4float %48
%50 = OpVectorShuffle %v3float %49 %49 0 1 2
%52 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%47 = OpExtInst %v3float %1 FMin %50 %52
%54 = OpFOrdEqual %v3bool %47 %53
%56 = OpAll %bool %54
OpBranch %46
%46 = OpLabel
%57 = OpPhi %bool %false %32 %56 %45
OpSelectionMerge %59 None
OpBranchConditional %57 %58 %59
%58 = OpLabel
%61 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%62 = OpLoad %v4float %61
%63 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%60 = OpExtInst %v4float %1 FMin %62 %63
%65 = OpFOrdEqual %v4bool %60 %64
%67 = OpAll %bool %65
OpBranch %59
%59 = OpLabel
%68 = OpPhi %bool %false %46 %67 %58
OpSelectionMerge %70 None
OpBranchConditional %68 %69 %70
%expectedA = OpVariable %_ptr_Function_v4float Function
%expectedB = OpVariable %_ptr_Function_v4float Function
%132 = OpVariable %_ptr_Function_v4float Function
OpStore %expectedA %25
OpStore %expectedB %28
%31 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%35 = OpLoad %v4float %31
%36 = OpCompositeExtract %float %35 0
%30 = OpExtInst %float %1 FMin %36 %float_0_5
%37 = OpLoad %v4float %expectedA
%38 = OpCompositeExtract %float %37 0
%39 = OpFOrdEqual %bool %30 %38
OpSelectionMerge %41 None
OpBranchConditional %39 %40 %41
%40 = OpLabel
%43 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%44 = OpLoad %v4float %43
%45 = OpVectorShuffle %v2float %44 %44 0 1
%47 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%42 = OpExtInst %v2float %1 FMin %45 %47
%48 = OpLoad %v4float %expectedA
%49 = OpVectorShuffle %v2float %48 %48 0 1
%50 = OpFOrdEqual %v2bool %42 %49
%52 = OpAll %bool %50
OpBranch %41
%41 = OpLabel
%53 = OpPhi %bool %false %19 %52 %40
OpSelectionMerge %55 None
OpBranchConditional %53 %54 %55
%54 = OpLabel
%57 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%58 = OpLoad %v4float %57
%59 = OpVectorShuffle %v3float %58 %58 0 1 2
%61 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%56 = OpExtInst %v3float %1 FMin %59 %61
%62 = OpLoad %v4float %expectedA
%63 = OpVectorShuffle %v3float %62 %62 0 1 2
%64 = OpFOrdEqual %v3bool %56 %63
%66 = OpAll %bool %64
OpBranch %55
%55 = OpLabel
%67 = OpPhi %bool %false %41 %66 %54
OpSelectionMerge %69 None
OpBranchConditional %67 %68 %69
%68 = OpLabel
%71 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%72 = OpLoad %v4float %71
%73 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%70 = OpExtInst %v4float %1 FMin %72 %73
%74 = OpLoad %v4float %expectedA
%75 = OpFOrdEqual %v4bool %70 %74
%77 = OpAll %bool %75
OpBranch %69
%69 = OpLabel
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%73 = OpLoad %v4float %72
%74 = OpCompositeExtract %float %73 0
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%77 = OpLoad %v4float %75
%78 = OpCompositeExtract %float %77 0
%71 = OpExtInst %float %1 FMin %74 %78
%79 = OpFOrdEqual %bool %71 %float_n1_25
OpBranch %70
%70 = OpLabel
%80 = OpPhi %bool %false %59 %79 %69
OpSelectionMerge %82 None
OpBranchConditional %80 %81 %82
%81 = OpLabel
%84 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%85 = OpLoad %v4float %84
%86 = OpVectorShuffle %v2float %85 %85 0 1
%87 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%88 = OpLoad %v4float %87
%89 = OpVectorShuffle %v2float %88 %88 0 1
%83 = OpExtInst %v2float %1 FMin %86 %89
%90 = OpFOrdEqual %v2bool %83 %40
%91 = OpAll %bool %90
OpBranch %82
%82 = OpLabel
%92 = OpPhi %bool %false %70 %91 %81
%78 = OpPhi %bool %false %55 %77 %68
OpSelectionMerge %80 None
OpBranchConditional %78 %79 %80
%79 = OpLabel
%82 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%83 = OpLoad %v4float %82
%84 = OpCompositeExtract %float %83 0
%85 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%87 = OpLoad %v4float %85
%88 = OpCompositeExtract %float %87 0
%81 = OpExtInst %float %1 FMin %84 %88
%89 = OpLoad %v4float %expectedB
%90 = OpCompositeExtract %float %89 0
%91 = OpFOrdEqual %bool %81 %90
OpBranch %80
%80 = OpLabel
%92 = OpPhi %bool %false %69 %91 %79
OpSelectionMerge %94 None
OpBranchConditional %92 %93 %94
%93 = OpLabel
%96 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%97 = OpLoad %v4float %96
%98 = OpVectorShuffle %v3float %97 %97 0 1 2
%98 = OpVectorShuffle %v2float %97 %97 0 1
%99 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%100 = OpLoad %v4float %99
%101 = OpVectorShuffle %v3float %100 %100 0 1 2
%95 = OpExtInst %v3float %1 FMin %98 %101
%103 = OpFOrdEqual %v3bool %95 %102
%104 = OpAll %bool %103
%101 = OpVectorShuffle %v2float %100 %100 0 1
%95 = OpExtInst %v2float %1 FMin %98 %101
%102 = OpLoad %v4float %expectedB
%103 = OpVectorShuffle %v2float %102 %102 0 1
%104 = OpFOrdEqual %v2bool %95 %103
%105 = OpAll %bool %104
OpBranch %94
%94 = OpLabel
%105 = OpPhi %bool %false %82 %104 %93
OpSelectionMerge %107 None
OpBranchConditional %105 %106 %107
%106 = OpLabel
%109 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%110 = OpLoad %v4float %109
%111 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%112 = OpLoad %v4float %111
%108 = OpExtInst %v4float %1 FMin %110 %112
%115 = OpFOrdEqual %v4bool %108 %114
%116 = OpAll %bool %115
OpBranch %107
%106 = OpPhi %bool %false %80 %105 %93
OpSelectionMerge %108 None
OpBranchConditional %106 %107 %108
%107 = OpLabel
%117 = OpPhi %bool %false %94 %116 %106
%110 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%111 = OpLoad %v4float %110
%112 = OpVectorShuffle %v3float %111 %111 0 1 2
%113 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%114 = OpLoad %v4float %113
%115 = OpVectorShuffle %v3float %114 %114 0 1 2
%109 = OpExtInst %v3float %1 FMin %112 %115
%116 = OpLoad %v4float %expectedB
%117 = OpVectorShuffle %v3float %116 %116 0 1 2
%118 = OpFOrdEqual %v3bool %109 %117
%119 = OpAll %bool %118
OpBranch %108
%108 = OpLabel
%120 = OpPhi %bool %false %94 %119 %107
OpSelectionMerge %122 None
OpBranchConditional %117 %120 %121
%120 = OpLabel
%123 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%124 = OpLoad %v4float %123
OpStore %118 %124
OpBranch %122
OpBranchConditional %120 %121 %122
%121 = OpLabel
%125 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%127 = OpLoad %v4float %125
OpStore %118 %127
%124 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%125 = OpLoad %v4float %124
%126 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%127 = OpLoad %v4float %126
%123 = OpExtInst %v4float %1 FMin %125 %127
%128 = OpLoad %v4float %expectedB
%129 = OpFOrdEqual %v4bool %123 %128
%130 = OpAll %bool %129
OpBranch %122
%122 = OpLabel
%128 = OpLoad %v4float %118
OpReturnValue %128
%131 = OpPhi %bool %false %108 %130 %121
OpSelectionMerge %135 None
OpBranchConditional %131 %133 %134
%133 = OpLabel
%136 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%137 = OpLoad %v4float %136
OpStore %132 %137
OpBranch %135
%134 = OpLabel
%138 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%140 = OpLoad %v4float %138
OpStore %132 %140
OpBranch %135
%135 = OpLabel
%141 = OpLoad %v4float %132
OpReturnValue %141
OpFunctionEnd

View File

@ -4,5 +4,7 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((((((min(testInputs.x, 0.5) == -1.25 && min(testInputs.xy, 0.5) == vec2(-1.25, 0.0)) && min(testInputs.xyz, 0.5) == vec3(-1.25, 0.0, 0.5)) && min(testInputs, 0.5) == vec4(-1.25, 0.0, 0.5, 0.5)) && min(testInputs.x, colorGreen.x) == -1.25) && min(testInputs.xy, colorGreen.xy) == vec2(-1.25, 0.0)) && min(testInputs.xyz, colorGreen.xyz) == vec3(-1.25, 0.0, 0.0)) && min(testInputs, colorGreen) == vec4(-1.25, 0.0, 0.0, 1.0) ? colorGreen : colorRed;
vec4 expectedA = vec4(-1.25, 0.0, 0.5, 0.5);
vec4 expectedB = vec4(-1.25, 0.0, 0.0, 1.0);
return ((((((min(testInputs.x, 0.5) == expectedA.x && min(testInputs.xy, 0.5) == expectedA.xy) && min(testInputs.xyz, 0.5) == expectedA.xyz) && min(testInputs, 0.5) == expectedA) && min(testInputs.x, colorGreen.x) == expectedB.x) && min(testInputs.xy, colorGreen.xy) == expectedB.xy) && min(testInputs.xyz, colorGreen.xyz) == expectedB.xyz) && min(testInputs, colorGreen) == expectedB ? colorGreen : colorRed;
}

View File

@ -17,6 +17,8 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((((((min(_uniforms.testInputs.x, 0.5) == -1.25 && all(min(_uniforms.testInputs.xy, 0.5) == float2(-1.25, 0.0))) && all(min(_uniforms.testInputs.xyz, 0.5) == float3(-1.25, 0.0, 0.5))) && all(min(_uniforms.testInputs, 0.5) == float4(-1.25, 0.0, 0.5, 0.5))) && min(_uniforms.testInputs.x, _uniforms.colorGreen.x) == -1.25) && all(min(_uniforms.testInputs.xy, _uniforms.colorGreen.xy) == float2(-1.25, 0.0))) && all(min(_uniforms.testInputs.xyz, _uniforms.colorGreen.xyz) == float3(-1.25, 0.0, 0.0))) && all(min(_uniforms.testInputs, _uniforms.colorGreen) == float4(-1.25, 0.0, 0.0, 1.0)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expectedA = float4(-1.25, 0.0, 0.5, 0.5);
float4 expectedB = float4(-1.25, 0.0, 0.0, 1.0);
_out.sk_FragColor = ((((((min(_uniforms.testInputs.x, 0.5) == expectedA.x && all(min(_uniforms.testInputs.xy, 0.5) == expectedA.xy)) && all(min(_uniforms.testInputs.xyz, 0.5) == expectedA.xyz)) && all(min(_uniforms.testInputs, 0.5) == expectedA)) && min(_uniforms.testInputs.x, _uniforms.colorGreen.x) == expectedB.x) && all(min(_uniforms.testInputs.xy, _uniforms.colorGreen.xy) == expectedB.xy)) && all(min(_uniforms.testInputs.xyz, _uniforms.colorGreen.xyz) == expectedB.xyz)) && all(min(_uniforms.testInputs, _uniforms.colorGreen) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -13,6 +13,8 @@ OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %intValues "intValues"
OpName %intGreen "intGreen"
OpName %expectedA "expectedA"
OpName %expectedB "expectedB"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -29,9 +31,9 @@ OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %27 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %140 RelaxedPrecision
OpDecorate %143 RelaxedPrecision
OpDecorate %144 RelaxedPrecision
OpDecorate %153 RelaxedPrecision
OpDecorate %156 RelaxedPrecision
OpDecorate %157 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -52,20 +54,17 @@ OpDecorate %144 RelaxedPrecision
%int_0 = OpConstant %int 0
%float_100 = OpConstant %float 100
%int_1 = OpConstant %int 1
%false = OpConstantFalse %bool
%int_50 = OpConstant %int 50
%int_n125 = OpConstant %int -125
%int_50 = OpConstant %int 50
%56 = OpConstantComposite %v4int %int_n125 %int_0 %int_50 %int_50
%int_100 = OpConstant %int 100
%59 = OpConstantComposite %v4int %int_n125 %int_0 %int_0 %int_100
%false = OpConstantFalse %bool
%v2int = OpTypeVector %int 2
%67 = OpConstantComposite %v2int %int_n125 %int_0
%v2bool = OpTypeVector %bool 2
%v3int = OpTypeVector %int 3
%79 = OpConstantComposite %v3int %int_n125 %int_0 %int_50
%v3bool = OpTypeVector %bool 3
%89 = OpConstantComposite %v4int %int_n125 %int_0 %int_50 %int_50
%v4bool = OpTypeVector %bool 4
%120 = OpConstantComposite %v3int %int_n125 %int_0 %int_0
%int_100 = OpConstant %int 100
%130 = OpConstantComposite %v4int %int_n125 %int_0 %int_0 %int_100
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -78,7 +77,9 @@ OpFunctionEnd
%19 = OpLabel
%intValues = OpVariable %_ptr_Function_v4int Function
%intGreen = OpVariable %_ptr_Function_v4int Function
%134 = OpVariable %_ptr_Function_v4float Function
%expectedA = OpVariable %_ptr_Function_v4int Function
%expectedB = OpVariable %_ptr_Function_v4int Function
%147 = OpVariable %_ptr_Function_v4float Function
%24 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%27 = OpLoad %v4float %24
%29 = OpVectorTimesScalar %v4float %27 %float_100
@ -105,107 +106,123 @@ OpStore %intValues %38
%51 = OpConvertFToS %int %50
%52 = OpCompositeConstruct %v4int %45 %47 %49 %51
OpStore %intGreen %52
%55 = OpLoad %v4int %intValues
%56 = OpCompositeExtract %int %55 0
%54 = OpExtInst %int %1 SMin %56 %int_50
%59 = OpIEqual %bool %54 %int_n125
OpSelectionMerge %61 None
OpBranchConditional %59 %60 %61
%60 = OpLabel
%63 = OpLoad %v4int %intValues
%64 = OpVectorShuffle %v2int %63 %63 0 1
%66 = OpCompositeConstruct %v2int %int_50 %int_50
%62 = OpExtInst %v2int %1 SMin %64 %66
%68 = OpIEqual %v2bool %62 %67
%70 = OpAll %bool %68
OpBranch %61
%61 = OpLabel
%71 = OpPhi %bool %false %19 %70 %60
OpSelectionMerge %73 None
OpBranchConditional %71 %72 %73
%72 = OpLabel
%75 = OpLoad %v4int %intValues
%76 = OpVectorShuffle %v3int %75 %75 0 1 2
%78 = OpCompositeConstruct %v3int %int_50 %int_50 %int_50
%74 = OpExtInst %v3int %1 SMin %76 %78
%80 = OpIEqual %v3bool %74 %79
%82 = OpAll %bool %80
OpBranch %73
%73 = OpLabel
%83 = OpPhi %bool %false %61 %82 %72
OpSelectionMerge %85 None
OpBranchConditional %83 %84 %85
%84 = OpLabel
%87 = OpLoad %v4int %intValues
%88 = OpCompositeConstruct %v4int %int_50 %int_50 %int_50 %int_50
%86 = OpExtInst %v4int %1 SMin %87 %88
%90 = OpIEqual %v4bool %86 %89
%92 = OpAll %bool %90
OpBranch %85
%85 = OpLabel
%93 = OpPhi %bool %false %73 %92 %84
OpSelectionMerge %95 None
OpBranchConditional %93 %94 %95
OpStore %expectedA %56
OpStore %expectedB %59
%62 = OpLoad %v4int %intValues
%63 = OpCompositeExtract %int %62 0
%61 = OpExtInst %int %1 SMin %63 %int_50
%64 = OpLoad %v4int %expectedA
%65 = OpCompositeExtract %int %64 0
%66 = OpIEqual %bool %61 %65
OpSelectionMerge %68 None
OpBranchConditional %66 %67 %68
%67 = OpLabel
%70 = OpLoad %v4int %intValues
%71 = OpVectorShuffle %v2int %70 %70 0 1
%73 = OpCompositeConstruct %v2int %int_50 %int_50
%69 = OpExtInst %v2int %1 SMin %71 %73
%74 = OpLoad %v4int %expectedA
%75 = OpVectorShuffle %v2int %74 %74 0 1
%76 = OpIEqual %v2bool %69 %75
%78 = OpAll %bool %76
OpBranch %68
%68 = OpLabel
%79 = OpPhi %bool %false %19 %78 %67
OpSelectionMerge %81 None
OpBranchConditional %79 %80 %81
%80 = OpLabel
%83 = OpLoad %v4int %intValues
%84 = OpVectorShuffle %v3int %83 %83 0 1 2
%86 = OpCompositeConstruct %v3int %int_50 %int_50 %int_50
%82 = OpExtInst %v3int %1 SMin %84 %86
%87 = OpLoad %v4int %expectedA
%88 = OpVectorShuffle %v3int %87 %87 0 1 2
%89 = OpIEqual %v3bool %82 %88
%91 = OpAll %bool %89
OpBranch %81
%81 = OpLabel
%92 = OpPhi %bool %false %68 %91 %80
OpSelectionMerge %94 None
OpBranchConditional %92 %93 %94
%93 = OpLabel
%96 = OpLoad %v4int %intValues
%97 = OpCompositeConstruct %v4int %int_50 %int_50 %int_50 %int_50
%95 = OpExtInst %v4int %1 SMin %96 %97
%98 = OpLoad %v4int %expectedA
%99 = OpIEqual %v4bool %95 %98
%101 = OpAll %bool %99
OpBranch %94
%94 = OpLabel
%97 = OpLoad %v4int %intValues
%98 = OpCompositeExtract %int %97 0
%99 = OpLoad %v4int %intGreen
%100 = OpCompositeExtract %int %99 0
%96 = OpExtInst %int %1 SMin %98 %100
%101 = OpIEqual %bool %96 %int_n125
OpBranch %95
%95 = OpLabel
%102 = OpPhi %bool %false %85 %101 %94
%102 = OpPhi %bool %false %81 %101 %93
OpSelectionMerge %104 None
OpBranchConditional %102 %103 %104
%103 = OpLabel
%106 = OpLoad %v4int %intValues
%107 = OpVectorShuffle %v2int %106 %106 0 1
%107 = OpCompositeExtract %int %106 0
%108 = OpLoad %v4int %intGreen
%109 = OpVectorShuffle %v2int %108 %108 0 1
%105 = OpExtInst %v2int %1 SMin %107 %109
%110 = OpIEqual %v2bool %105 %67
%111 = OpAll %bool %110
%109 = OpCompositeExtract %int %108 0
%105 = OpExtInst %int %1 SMin %107 %109
%110 = OpLoad %v4int %expectedB
%111 = OpCompositeExtract %int %110 0
%112 = OpIEqual %bool %105 %111
OpBranch %104
%104 = OpLabel
%112 = OpPhi %bool %false %95 %111 %103
OpSelectionMerge %114 None
OpBranchConditional %112 %113 %114
%113 = OpLabel
%116 = OpLoad %v4int %intValues
%117 = OpVectorShuffle %v3int %116 %116 0 1 2
%118 = OpLoad %v4int %intGreen
%119 = OpVectorShuffle %v3int %118 %118 0 1 2
%115 = OpExtInst %v3int %1 SMin %117 %119
%121 = OpIEqual %v3bool %115 %120
%122 = OpAll %bool %121
OpBranch %114
%113 = OpPhi %bool %false %94 %112 %103
OpSelectionMerge %115 None
OpBranchConditional %113 %114 %115
%114 = OpLabel
%123 = OpPhi %bool %false %104 %122 %113
OpSelectionMerge %125 None
OpBranchConditional %123 %124 %125
%124 = OpLabel
%127 = OpLoad %v4int %intValues
%128 = OpLoad %v4int %intGreen
%126 = OpExtInst %v4int %1 SMin %127 %128
%131 = OpIEqual %v4bool %126 %130
%132 = OpAll %bool %131
OpBranch %125
%125 = OpLabel
%133 = OpPhi %bool %false %114 %132 %124
OpSelectionMerge %138 None
OpBranchConditional %133 %136 %137
%136 = OpLabel
%139 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%140 = OpLoad %v4float %139
OpStore %134 %140
OpBranch %138
%137 = OpLabel
%141 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%143 = OpLoad %v4float %141
OpStore %134 %143
OpBranch %138
%117 = OpLoad %v4int %intValues
%118 = OpVectorShuffle %v2int %117 %117 0 1
%119 = OpLoad %v4int %intGreen
%120 = OpVectorShuffle %v2int %119 %119 0 1
%116 = OpExtInst %v2int %1 SMin %118 %120
%121 = OpLoad %v4int %expectedB
%122 = OpVectorShuffle %v2int %121 %121 0 1
%123 = OpIEqual %v2bool %116 %122
%124 = OpAll %bool %123
OpBranch %115
%115 = OpLabel
%125 = OpPhi %bool %false %104 %124 %114
OpSelectionMerge %127 None
OpBranchConditional %125 %126 %127
%126 = OpLabel
%129 = OpLoad %v4int %intValues
%130 = OpVectorShuffle %v3int %129 %129 0 1 2
%131 = OpLoad %v4int %intGreen
%132 = OpVectorShuffle %v3int %131 %131 0 1 2
%128 = OpExtInst %v3int %1 SMin %130 %132
%133 = OpLoad %v4int %expectedB
%134 = OpVectorShuffle %v3int %133 %133 0 1 2
%135 = OpIEqual %v3bool %128 %134
%136 = OpAll %bool %135
OpBranch %127
%127 = OpLabel
%137 = OpPhi %bool %false %115 %136 %126
OpSelectionMerge %139 None
OpBranchConditional %137 %138 %139
%138 = OpLabel
%144 = OpLoad %v4float %134
OpReturnValue %144
%141 = OpLoad %v4int %intValues
%142 = OpLoad %v4int %intGreen
%140 = OpExtInst %v4int %1 SMin %141 %142
%143 = OpLoad %v4int %expectedB
%144 = OpIEqual %v4bool %140 %143
%145 = OpAll %bool %144
OpBranch %139
%139 = OpLabel
%146 = OpPhi %bool %false %127 %145 %138
OpSelectionMerge %151 None
OpBranchConditional %146 %149 %150
%149 = OpLabel
%152 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%153 = OpLoad %v4float %152
OpStore %147 %153
OpBranch %151
%150 = OpLabel
%154 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%156 = OpLoad %v4float %154
OpStore %147 %156
OpBranch %151
%151 = OpLabel
%157 = OpLoad %v4float %147
OpReturnValue %157
OpFunctionEnd

View File

@ -6,5 +6,7 @@ uniform vec4 colorRed;
vec4 main() {
ivec4 intValues = ivec4(testInputs * 100.0);
ivec4 intGreen = ivec4(colorGreen * 100.0);
return ((((((min(intValues.x, 50) == -125 && min(intValues.xy, 50) == ivec2(-125, 0)) && min(intValues.xyz, 50) == ivec3(-125, 0, 50)) && min(intValues, 50) == ivec4(-125, 0, 50, 50)) && min(intValues.x, intGreen.x) == -125) && min(intValues.xy, intGreen.xy) == ivec2(-125, 0)) && min(intValues.xyz, intGreen.xyz) == ivec3(-125, 0, 0)) && min(intValues, intGreen) == ivec4(-125, 0, 0, 100) ? colorGreen : colorRed;
ivec4 expectedA = ivec4(-125, 0, 50, 50);
ivec4 expectedB = ivec4(-125, 0, 0, 100);
return ((((((min(intValues.x, 50) == expectedA.x && min(intValues.xy, 50) == expectedA.xy) && min(intValues.xyz, 50) == expectedA.xyz) && min(intValues, 50) == expectedA) && min(intValues.x, intGreen.x) == expectedB.x) && min(intValues.xy, intGreen.xy) == expectedB.xy) && min(intValues.xyz, intGreen.xyz) == expectedB.xyz) && min(intValues, intGreen) == expectedB ? colorGreen : colorRed;
}

View File

@ -19,6 +19,8 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
(void)_out;
int4 intValues = int4(_uniforms.testInputs * 100.0);
int4 intGreen = int4(_uniforms.colorGreen * 100.0);
_out.sk_FragColor = ((((((min(intValues.x, 50) == -125 && all(min(intValues.xy, 50) == int2(-125, 0))) && all(min(intValues.xyz, 50) == int3(-125, 0, 50))) && all(min(intValues, 50) == int4(-125, 0, 50, 50))) && min(intValues.x, intGreen.x) == -125) && all(min(intValues.xy, intGreen.xy) == int2(-125, 0))) && all(min(intValues.xyz, intGreen.xyz) == int3(-125, 0, 0))) && all(min(intValues, intGreen) == int4(-125, 0, 0, 100)) ? _uniforms.colorGreen : _uniforms.colorRed;
int4 expectedA = int4(-125, 0, 50, 50);
int4 expectedB = int4(-125, 0, 0, 100);
_out.sk_FragColor = ((((((min(intValues.x, 50) == expectedA.x && all(min(intValues.xy, 50) == expectedA.xy)) && all(min(intValues.xyz, 50) == expectedA.xyz)) && all(min(intValues, 50) == expectedA)) && min(intValues.x, intGreen.x) == expectedB.x) && all(min(intValues.xy, intGreen.xy) == expectedB.xy)) && all(min(intValues.xyz, intGreen.xyz) == expectedB.xyz)) && all(min(intValues, intGreen) == expectedB) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -13,6 +13,8 @@ OpMemberName %_UniformBuffer 3 "colorWhite"
OpMemberName %_UniformBuffer 4 "testInputs"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expectedBW "expectedBW"
OpName %expectedWT "expectedWT"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -31,40 +33,48 @@ OpMemberDecorate %_UniformBuffer 4 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %29 RelaxedPrecision
OpDecorate %31 RelaxedPrecision
OpDecorate %41 RelaxedPrecision
OpDecorate %43 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %55 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
OpDecorate %70 RelaxedPrecision
OpDecorate %80 RelaxedPrecision
OpDecorate %84 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %50 RelaxedPrecision
OpDecorate %52 RelaxedPrecision
OpDecorate %62 RelaxedPrecision
OpDecorate %64 RelaxedPrecision
OpDecorate %65 RelaxedPrecision
OpDecorate %74 RelaxedPrecision
OpDecorate %76 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %87 RelaxedPrecision
OpDecorate %91 RelaxedPrecision
OpDecorate %93 RelaxedPrecision
OpDecorate %97 RelaxedPrecision
OpDecorate %99 RelaxedPrecision
OpDecorate %109 RelaxedPrecision
OpDecorate %113 RelaxedPrecision
OpDecorate %115 RelaxedPrecision
OpDecorate %101 RelaxedPrecision
OpDecorate %105 RelaxedPrecision
OpDecorate %107 RelaxedPrecision
OpDecorate %108 RelaxedPrecision
OpDecorate %118 RelaxedPrecision
OpDecorate %122 RelaxedPrecision
OpDecorate %124 RelaxedPrecision
OpDecorate %125 RelaxedPrecision
OpDecorate %127 RelaxedPrecision
OpDecorate %128 RelaxedPrecision
OpDecorate %135 RelaxedPrecision
OpDecorate %137 RelaxedPrecision
OpDecorate %141 RelaxedPrecision
OpDecorate %149 RelaxedPrecision
OpDecorate %152 RelaxedPrecision
OpDecorate %163 RelaxedPrecision
OpDecorate %166 RelaxedPrecision
OpDecorate %177 RelaxedPrecision
OpDecorate %138 RelaxedPrecision
OpDecorate %139 RelaxedPrecision
OpDecorate %147 RelaxedPrecision
OpDecorate %151 RelaxedPrecision
OpDecorate %153 RelaxedPrecision
OpDecorate %161 RelaxedPrecision
OpDecorate %164 RelaxedPrecision
OpDecorate %167 RelaxedPrecision
OpDecorate %176 RelaxedPrecision
OpDecorate %179 RelaxedPrecision
OpDecorate %192 RelaxedPrecision
OpDecorate %194 RelaxedPrecision
OpDecorate %182 RelaxedPrecision
OpDecorate %191 RelaxedPrecision
OpDecorate %193 RelaxedPrecision
OpDecorate %195 RelaxedPrecision
OpDecorate %204 RelaxedPrecision
OpDecorate %206 RelaxedPrecision
OpDecorate %207 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -78,39 +88,35 @@ OpDecorate %195 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_0_5 = OpConstant %float 0.5
%float_1 = OpConstant %float 1
%24 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
%float_2_25 = OpConstant %float 2.25
%27 = OpConstantComposite %v4float %float_1 %float_0_5 %float_1 %float_2_25
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%33 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
%40 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
%v4bool = OpTypeVector %bool 4
%float_0_25 = OpConstant %float 0.25
%float_0_75 = OpConstant %float 0.75
%47 = OpConstantComposite %v4float %float_0_25 %float_0_75 %float_0 %float_1
%59 = OpConstantComposite %v4float %float_0_75 %float_0_25 %float_0 %float_1
%71 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%54 = OpConstantComposite %v4float %float_0_25 %float_0_75 %float_0 %float_1
%66 = OpConstantComposite %v4float %float_0_75 %float_0_25 %float_0 %float_1
%78 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%float_0_5 = OpConstant %float 0.5
%v2float = OpTypeVector %float 2
%100 = OpConstantComposite %v2float %float_0_5 %float_0_5
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%116 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
%v3bool = OpTypeVector %bool 3
%129 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
%int_4 = OpConstant %int 4
%154 = OpConstantComposite %v2float %float_0 %float_0_5
%155 = OpConstantComposite %v2float %float_1 %float_0_5
%168 = OpConstantComposite %v3float %float_0 %float_0_5 %float_0
%169 = OpConstantComposite %v3float %float_1 %float_0_5 %float_1
%180 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
%float_2_25 = OpConstant %float 2.25
%182 = OpConstantComposite %v4float %float_1 %float_0_5 %float_1 %float_2_25
%_ptr_Function_v4float = OpTypePointer Function %v4float
%166 = OpConstantComposite %v2float %float_0 %float_0_5
%181 = OpConstantComposite %v3float %float_0 %float_0_5 %float_0
%194 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
%_entrypoint = OpFunction %void None %15
%16 = OpLabel
%17 = OpFunctionCall %v4float %main
@ -119,187 +125,205 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%186 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%29 = OpLoad %v4float %27
%31 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_0
%21 = OpExtInst %v4float %1 FMix %26 %29 %31
%34 = OpFOrdEqual %v4bool %21 %33
%36 = OpAll %bool %34
OpSelectionMerge %38 None
OpBranchConditional %36 %37 %38
%37 = OpLabel
%40 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%41 = OpLoad %v4float %40
%42 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%43 = OpLoad %v4float %42
%45 = OpCompositeConstruct %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25
%39 = OpExtInst %v4float %1 FMix %41 %43 %45
%48 = OpFOrdEqual %v4bool %39 %47
%49 = OpAll %bool %48
OpBranch %38
%38 = OpLabel
%50 = OpPhi %bool %false %19 %49 %37
OpSelectionMerge %52 None
OpBranchConditional %50 %51 %52
%51 = OpLabel
%54 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%55 = OpLoad %v4float %54
%56 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%57 = OpLoad %v4float %56
%58 = OpCompositeConstruct %v4float %float_0_75 %float_0_75 %float_0_75 %float_0_75
%53 = OpExtInst %v4float %1 FMix %55 %57 %58
%60 = OpFOrdEqual %v4bool %53 %59
%61 = OpAll %bool %60
OpBranch %52
%52 = OpLabel
%62 = OpPhi %bool %false %38 %61 %51
OpSelectionMerge %64 None
OpBranchConditional %62 %63 %64
%63 = OpLabel
%66 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%67 = OpLoad %v4float %66
%68 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%69 = OpLoad %v4float %68
%70 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%65 = OpExtInst %v4float %1 FMix %67 %69 %70
%72 = OpFOrdEqual %v4bool %65 %71
%73 = OpAll %bool %72
OpBranch %64
%64 = OpLabel
%74 = OpPhi %bool %false %52 %73 %63
OpSelectionMerge %76 None
OpBranchConditional %74 %75 %76
%75 = OpLabel
%78 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%80 = OpLoad %v4float %78
%81 = OpCompositeExtract %float %80 0
%82 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%84 = OpLoad %v4float %82
%85 = OpCompositeExtract %float %84 0
%77 = OpExtInst %float %1 FMix %81 %85 %float_0_5
%87 = OpFOrdEqual %bool %77 %float_0_5
OpBranch %76
%76 = OpLabel
%88 = OpPhi %bool %false %64 %87 %75
OpSelectionMerge %90 None
OpBranchConditional %88 %89 %90
%89 = OpLabel
%92 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%93 = OpLoad %v4float %92
%94 = OpVectorShuffle %v2float %93 %93 0 1
%96 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%97 = OpLoad %v4float %96
%98 = OpVectorShuffle %v2float %97 %97 0 1
%99 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%91 = OpExtInst %v2float %1 FMix %94 %98 %99
%101 = OpFOrdEqual %v2bool %91 %100
%103 = OpAll %bool %101
OpBranch %90
%90 = OpLabel
%104 = OpPhi %bool %false %76 %103 %89
OpSelectionMerge %106 None
OpBranchConditional %104 %105 %106
%105 = OpLabel
%108 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%109 = OpLoad %v4float %108
%110 = OpVectorShuffle %v3float %109 %109 0 1 2
%112 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%113 = OpLoad %v4float %112
%114 = OpVectorShuffle %v3float %113 %113 0 1 2
%115 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%107 = OpExtInst %v3float %1 FMix %110 %114 %115
%117 = OpFOrdEqual %v3bool %107 %116
%119 = OpAll %bool %117
OpBranch %106
%106 = OpLabel
%120 = OpPhi %bool %false %90 %119 %105
OpSelectionMerge %122 None
OpBranchConditional %120 %121 %122
%121 = OpLabel
%124 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%125 = OpLoad %v4float %124
%126 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%127 = OpLoad %v4float %126
%128 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%123 = OpExtInst %v4float %1 FMix %125 %127 %128
%130 = OpFOrdEqual %v4bool %123 %129
%131 = OpAll %bool %130
OpBranch %122
%122 = OpLabel
%132 = OpPhi %bool %false %106 %131 %121
OpSelectionMerge %134 None
OpBranchConditional %132 %133 %134
%133 = OpLabel
%expectedBW = OpVariable %_ptr_Function_v4float Function
%expectedWT = OpVariable %_ptr_Function_v4float Function
%199 = OpVariable %_ptr_Function_v4float Function
OpStore %expectedBW %24
OpStore %expectedWT %27
%30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %30
%35 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%37 = OpLoad %v4float %35
%39 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_0
%29 = OpExtInst %v4float %1 FMix %34 %37 %39
%41 = OpFOrdEqual %v4bool %29 %40
%43 = OpAll %bool %41
OpSelectionMerge %45 None
OpBranchConditional %43 %44 %45
%44 = OpLabel
%47 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%48 = OpLoad %v4float %47
%49 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%50 = OpLoad %v4float %49
%52 = OpCompositeConstruct %v4float %float_0_25 %float_0_25 %float_0_25 %float_0_25
%46 = OpExtInst %v4float %1 FMix %48 %50 %52
%55 = OpFOrdEqual %v4bool %46 %54
%56 = OpAll %bool %55
OpBranch %45
%45 = OpLabel
%57 = OpPhi %bool %false %19 %56 %44
OpSelectionMerge %59 None
OpBranchConditional %57 %58 %59
%58 = OpLabel
%61 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%62 = OpLoad %v4float %61
%63 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%64 = OpLoad %v4float %63
%65 = OpCompositeConstruct %v4float %float_0_75 %float_0_75 %float_0_75 %float_0_75
%60 = OpExtInst %v4float %1 FMix %62 %64 %65
%67 = OpFOrdEqual %v4bool %60 %66
%68 = OpAll %bool %67
OpBranch %59
%59 = OpLabel
%69 = OpPhi %bool %false %45 %68 %58
OpSelectionMerge %71 None
OpBranchConditional %69 %70 %71
%70 = OpLabel
%73 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%74 = OpLoad %v4float %73
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%76 = OpLoad %v4float %75
%77 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
%72 = OpExtInst %v4float %1 FMix %74 %76 %77
%79 = OpFOrdEqual %v4bool %72 %78
%80 = OpAll %bool %79
OpBranch %71
%71 = OpLabel
%81 = OpPhi %bool %false %59 %80 %70
OpSelectionMerge %83 None
OpBranchConditional %81 %82 %83
%82 = OpLabel
%85 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%87 = OpLoad %v4float %85
%88 = OpCompositeExtract %float %87 0
%89 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%91 = OpLoad %v4float %89
%92 = OpCompositeExtract %float %91 0
%84 = OpExtInst %float %1 FMix %88 %92 %float_0_5
%93 = OpLoad %v4float %expectedBW
%94 = OpCompositeExtract %float %93 0
%95 = OpFOrdEqual %bool %84 %94
OpBranch %83
%83 = OpLabel
%96 = OpPhi %bool %false %71 %95 %82
OpSelectionMerge %98 None
OpBranchConditional %96 %97 %98
%97 = OpLabel
%100 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%101 = OpLoad %v4float %100
%102 = OpVectorShuffle %v2float %101 %101 0 1
%104 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%105 = OpLoad %v4float %104
%106 = OpVectorShuffle %v2float %105 %105 0 1
%107 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
%99 = OpExtInst %v2float %1 FMix %102 %106 %107
%108 = OpLoad %v4float %expectedBW
%109 = OpVectorShuffle %v2float %108 %108 0 1
%110 = OpFOrdEqual %v2bool %99 %109
%112 = OpAll %bool %110
OpBranch %98
%98 = OpLabel
%113 = OpPhi %bool %false %83 %112 %97
OpSelectionMerge %115 None
OpBranchConditional %113 %114 %115
%114 = OpLabel
%117 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%118 = OpLoad %v4float %117
%119 = OpVectorShuffle %v3float %118 %118 0 1 2
%121 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%122 = OpLoad %v4float %121
%123 = OpVectorShuffle %v3float %122 %122 0 1 2
%124 = OpCompositeConstruct %v3float %float_0_5 %float_0_5 %float_0_5
%116 = OpExtInst %v3float %1 FMix %119 %123 %124
%125 = OpLoad %v4float %expectedBW
%126 = OpVectorShuffle %v3float %125 %125 0 1 2
%127 = OpFOrdEqual %v3bool %116 %126
%129 = OpAll %bool %127
OpBranch %115
%115 = OpLabel
%130 = OpPhi %bool %false %98 %129 %114
OpSelectionMerge %132 None
OpBranchConditional %130 %131 %132
%131 = OpLabel
%134 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%135 = OpLoad %v4float %134
%136 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%137 = OpLoad %v4float %136
%138 = OpCompositeExtract %float %137 0
%139 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%141 = OpLoad %v4float %139
%142 = OpCompositeExtract %float %141 0
%135 = OpExtInst %float %1 FMix %138 %142 %float_0
%143 = OpFOrdEqual %bool %135 %float_1
OpBranch %134
%134 = OpLabel
%144 = OpPhi %bool %false %122 %143 %133
OpSelectionMerge %146 None
OpBranchConditional %144 %145 %146
%145 = OpLabel
%148 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%149 = OpLoad %v4float %148
%150 = OpVectorShuffle %v2float %149 %149 0 1
%151 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%152 = OpLoad %v4float %151
%153 = OpVectorShuffle %v2float %152 %152 0 1
%147 = OpExtInst %v2float %1 FMix %150 %153 %154
%156 = OpFOrdEqual %v2bool %147 %155
%157 = OpAll %bool %156
OpBranch %146
%146 = OpLabel
%158 = OpPhi %bool %false %134 %157 %145
OpSelectionMerge %160 None
OpBranchConditional %158 %159 %160
%159 = OpLabel
%162 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%163 = OpLoad %v4float %162
%164 = OpVectorShuffle %v3float %163 %163 0 1 2
%165 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%166 = OpLoad %v4float %165
%167 = OpVectorShuffle %v3float %166 %166 0 1 2
%161 = OpExtInst %v3float %1 FMix %164 %167 %168
%170 = OpFOrdEqual %v3bool %161 %169
%171 = OpAll %bool %170
OpBranch %160
%160 = OpLabel
%172 = OpPhi %bool %false %146 %171 %159
OpSelectionMerge %174 None
OpBranchConditional %172 %173 %174
%173 = OpLabel
%176 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%177 = OpLoad %v4float %176
%138 = OpCompositeConstruct %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%133 = OpExtInst %v4float %1 FMix %135 %137 %138
%139 = OpLoad %v4float %expectedBW
%140 = OpFOrdEqual %v4bool %133 %139
%141 = OpAll %bool %140
OpBranch %132
%132 = OpLabel
%142 = OpPhi %bool %false %115 %141 %131
OpSelectionMerge %144 None
OpBranchConditional %142 %143 %144
%143 = OpLabel
%146 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%147 = OpLoad %v4float %146
%148 = OpCompositeExtract %float %147 0
%149 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%151 = OpLoad %v4float %149
%152 = OpCompositeExtract %float %151 0
%145 = OpExtInst %float %1 FMix %148 %152 %float_0
%153 = OpLoad %v4float %expectedWT
%154 = OpCompositeExtract %float %153 0
%155 = OpFOrdEqual %bool %145 %154
OpBranch %144
%144 = OpLabel
%156 = OpPhi %bool %false %132 %155 %143
OpSelectionMerge %158 None
OpBranchConditional %156 %157 %158
%157 = OpLabel
%160 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%161 = OpLoad %v4float %160
%162 = OpVectorShuffle %v2float %161 %161 0 1
%163 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%164 = OpLoad %v4float %163
%165 = OpVectorShuffle %v2float %164 %164 0 1
%159 = OpExtInst %v2float %1 FMix %162 %165 %166
%167 = OpLoad %v4float %expectedWT
%168 = OpVectorShuffle %v2float %167 %167 0 1
%169 = OpFOrdEqual %v2bool %159 %168
%170 = OpAll %bool %169
OpBranch %158
%158 = OpLabel
%171 = OpPhi %bool %false %144 %170 %157
OpSelectionMerge %173 None
OpBranchConditional %171 %172 %173
%172 = OpLabel
%175 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%176 = OpLoad %v4float %175
%177 = OpVectorShuffle %v3float %176 %176 0 1 2
%178 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%179 = OpLoad %v4float %178
%175 = OpExtInst %v4float %1 FMix %177 %179 %180
%183 = OpFOrdEqual %v4bool %175 %182
%184 = OpAll %bool %183
OpBranch %174
%174 = OpLabel
%185 = OpPhi %bool %false %160 %184 %173
OpSelectionMerge %190 None
OpBranchConditional %185 %188 %189
%180 = OpVectorShuffle %v3float %179 %179 0 1 2
%174 = OpExtInst %v3float %1 FMix %177 %180 %181
%182 = OpLoad %v4float %expectedWT
%183 = OpVectorShuffle %v3float %182 %182 0 1 2
%184 = OpFOrdEqual %v3bool %174 %183
%185 = OpAll %bool %184
OpBranch %173
%173 = OpLabel
%186 = OpPhi %bool %false %158 %185 %172
OpSelectionMerge %188 None
OpBranchConditional %186 %187 %188
%187 = OpLabel
%190 = OpAccessChain %_ptr_Uniform_v4float %10 %int_3
%191 = OpLoad %v4float %190
%192 = OpAccessChain %_ptr_Uniform_v4float %10 %int_4
%193 = OpLoad %v4float %192
%189 = OpExtInst %v4float %1 FMix %191 %193 %194
%195 = OpLoad %v4float %expectedWT
%196 = OpFOrdEqual %v4bool %189 %195
%197 = OpAll %bool %196
OpBranch %188
%188 = OpLabel
%191 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%192 = OpLoad %v4float %191
OpStore %186 %192
OpBranch %190
%189 = OpLabel
%193 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%194 = OpLoad %v4float %193
OpStore %186 %194
OpBranch %190
%190 = OpLabel
%195 = OpLoad %v4float %186
OpReturnValue %195
%198 = OpPhi %bool %false %173 %197 %187
OpSelectionMerge %202 None
OpBranchConditional %198 %200 %201
%200 = OpLabel
%203 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%204 = OpLoad %v4float %203
OpStore %199 %204
OpBranch %202
%201 = OpLabel
%205 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%206 = OpLoad %v4float %205
OpStore %199 %206
OpBranch %202
%202 = OpLabel
%207 = OpLoad %v4float %199
OpReturnValue %207
OpFunctionEnd

View File

@ -6,5 +6,7 @@ uniform vec4 colorBlack;
uniform vec4 colorWhite;
uniform vec4 testInputs;
vec4 main() {
return ((((((((((mix(colorGreen, colorRed, 0.0) == vec4(0.0, 1.0, 0.0, 1.0) && mix(colorGreen, colorRed, 0.25) == vec4(0.25, 0.75, 0.0, 1.0)) && mix(colorGreen, colorRed, 0.75) == vec4(0.75, 0.25, 0.0, 1.0)) && mix(colorGreen, colorRed, 1.0) == vec4(1.0, 0.0, 0.0, 1.0)) && mix(colorBlack.x, colorWhite.x, 0.5) == 0.5) && mix(colorBlack.xy, colorWhite.xy, 0.5) == vec2(0.5, 0.5)) && mix(colorBlack.xyz, colorWhite.xyz, 0.5) == vec3(0.5, 0.5, 0.5)) && mix(colorBlack, colorWhite, 0.5) == vec4(0.5, 0.5, 0.5, 1.0)) && mix(colorWhite.x, testInputs.x, 0.0) == 1.0) && mix(colorWhite.xy, testInputs.xy, vec2(0.0, 0.5)) == vec2(1.0, 0.5)) && mix(colorWhite.xyz, testInputs.xyz, vec3(0.0, 0.5, 0.0)) == vec3(1.0, 0.5, 1.0)) && mix(colorWhite, testInputs, vec4(0.0, 0.5, 0.0, 1.0)) == vec4(1.0, 0.5, 1.0, 2.25) ? colorGreen : colorRed;
vec4 expectedBW = vec4(0.5, 0.5, 0.5, 1.0);
vec4 expectedWT = vec4(1.0, 0.5, 1.0, 2.25);
return ((((((((((mix(colorGreen, colorRed, 0.0) == vec4(0.0, 1.0, 0.0, 1.0) && mix(colorGreen, colorRed, 0.25) == vec4(0.25, 0.75, 0.0, 1.0)) && mix(colorGreen, colorRed, 0.75) == vec4(0.75, 0.25, 0.0, 1.0)) && mix(colorGreen, colorRed, 1.0) == vec4(1.0, 0.0, 0.0, 1.0)) && mix(colorBlack.x, colorWhite.x, 0.5) == expectedBW.x) && mix(colorBlack.xy, colorWhite.xy, 0.5) == expectedBW.xy) && mix(colorBlack.xyz, colorWhite.xyz, 0.5) == expectedBW.xyz) && mix(colorBlack, colorWhite, 0.5) == expectedBW) && mix(colorWhite.x, testInputs.x, 0.0) == expectedWT.x) && mix(colorWhite.xy, testInputs.xy, vec2(0.0, 0.5)) == expectedWT.xy) && mix(colorWhite.xyz, testInputs.xyz, vec3(0.0, 0.5, 0.0)) == expectedWT.xyz) && mix(colorWhite, testInputs, vec4(0.0, 0.5, 0.0, 1.0)) == expectedWT ? colorGreen : colorRed;
}

View File

@ -21,6 +21,8 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((((((((((all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.0) == float4(0.0, 1.0, 0.0, 1.0)) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.25) == float4(0.25, 0.75, 0.0, 1.0))) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.75) == float4(0.75, 0.25, 0.0, 1.0))) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 1.0) == float4(1.0, 0.0, 0.0, 1.0))) && mix(_uniforms.colorBlack.x, _uniforms.colorWhite.x, 0.5) == 0.5) && all(mix(_uniforms.colorBlack.xy, _uniforms.colorWhite.xy, 0.5) == float2(0.5, 0.5))) && all(mix(_uniforms.colorBlack.xyz, _uniforms.colorWhite.xyz, 0.5) == float3(0.5, 0.5, 0.5))) && all(mix(_uniforms.colorBlack, _uniforms.colorWhite, 0.5) == float4(0.5, 0.5, 0.5, 1.0))) && mix(_uniforms.colorWhite.x, _uniforms.testInputs.x, 0.0) == 1.0) && all(mix(_uniforms.colorWhite.xy, _uniforms.testInputs.xy, float2(0.0, 0.5)) == float2(1.0, 0.5))) && all(mix(_uniforms.colorWhite.xyz, _uniforms.testInputs.xyz, float3(0.0, 0.5, 0.0)) == float3(1.0, 0.5, 1.0))) && all(mix(_uniforms.colorWhite, _uniforms.testInputs, float4(0.0, 0.5, 0.0, 1.0)) == float4(1.0, 0.5, 1.0, 2.25)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expectedBW = float4(0.5, 0.5, 0.5, 1.0);
float4 expectedWT = float4(1.0, 0.5, 1.0, 2.25);
_out.sk_FragColor = ((((((((((all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.0) == float4(0.0, 1.0, 0.0, 1.0)) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.25) == float4(0.25, 0.75, 0.0, 1.0))) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 0.75) == float4(0.75, 0.25, 0.0, 1.0))) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, 1.0) == float4(1.0, 0.0, 0.0, 1.0))) && mix(_uniforms.colorBlack.x, _uniforms.colorWhite.x, 0.5) == expectedBW.x) && all(mix(_uniforms.colorBlack.xy, _uniforms.colorWhite.xy, 0.5) == expectedBW.xy)) && all(mix(_uniforms.colorBlack.xyz, _uniforms.colorWhite.xyz, 0.5) == expectedBW.xyz)) && all(mix(_uniforms.colorBlack, _uniforms.colorWhite, 0.5) == expectedBW)) && mix(_uniforms.colorWhite.x, _uniforms.testInputs.x, 0.0) == expectedWT.x) && all(mix(_uniforms.colorWhite.xy, _uniforms.testInputs.xy, float2(0.0, 0.5)) == expectedWT.xy)) && all(mix(_uniforms.colorWhite.xyz, _uniforms.testInputs.xyz, float3(0.0, 0.5, 0.0)) == expectedWT.xyz)) && all(mix(_uniforms.colorWhite, _uniforms.testInputs, float4(0.0, 0.5, 0.0, 1.0)) == expectedWT) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -11,6 +11,7 @@ OpMemberName %_UniformBuffer 1 "colorGreen"
OpMemberName %_UniformBuffer 2 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %expected "expected"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -25,13 +26,17 @@ OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %26 RelaxedPrecision
OpDecorate %32 RelaxedPrecision
OpDecorate %34 RelaxedPrecision
OpDecorate %47 RelaxedPrecision
OpDecorate %60 RelaxedPrecision
OpDecorate %73 RelaxedPrecision
OpDecorate %76 RelaxedPrecision
OpDecorate %77 RelaxedPrecision
OpDecorate %41 RelaxedPrecision
OpDecorate %44 RelaxedPrecision
OpDecorate %54 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %67 RelaxedPrecision
OpDecorate %68 RelaxedPrecision
OpDecorate %79 RelaxedPrecision
OpDecorate %82 RelaxedPrecision
OpDecorate %83 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -45,22 +50,20 @@ OpDecorate %77 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_n1 = OpConstant %float -1
%float_0 = OpConstant %float 0
%float_1 = OpConstant %float 1
%25 = OpConstantComposite %v4float %float_n1 %float_0 %float_1 %float_1
%false = OpConstantFalse %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%float_n1 = OpConstant %float -1
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%38 = OpConstantComposite %v2float %float_n1 %float_0
%v2bool = OpTypeVector %bool 2
%v3float = OpTypeVector %float 3
%float_1 = OpConstant %float 1
%51 = OpConstantComposite %v3float %float_n1 %float_0 %float_1
%v3bool = OpTypeVector %bool 3
%61 = OpConstantComposite %v4float %float_n1 %float_0 %float_1 %float_1
%v4bool = OpTypeVector %bool 4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%_entrypoint = OpFunction %void None %15
@ -71,60 +74,69 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%66 = OpVariable %_ptr_Function_v4float Function
%22 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%26 = OpLoad %v4float %22
%27 = OpCompositeExtract %float %26 0
%21 = OpExtInst %float %1 FSign %27
%29 = OpFOrdEqual %bool %21 %float_n1
OpSelectionMerge %31 None
OpBranchConditional %29 %30 %31
%30 = OpLabel
%33 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%34 = OpLoad %v4float %33
%35 = OpVectorShuffle %v2float %34 %34 0 1
%32 = OpExtInst %v2float %1 FSign %35
%39 = OpFOrdEqual %v2bool %32 %38
%41 = OpAll %bool %39
OpBranch %31
%31 = OpLabel
%42 = OpPhi %bool %false %19 %41 %30
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%47 = OpLoad %v4float %46
%48 = OpVectorShuffle %v3float %47 %47 0 1 2
%45 = OpExtInst %v3float %1 FSign %48
%52 = OpFOrdEqual %v3bool %45 %51
%54 = OpAll %bool %52
OpBranch %44
%44 = OpLabel
%55 = OpPhi %bool %false %31 %54 %43
OpSelectionMerge %57 None
OpBranchConditional %55 %56 %57
%56 = OpLabel
%59 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%60 = OpLoad %v4float %59
%58 = OpExtInst %v4float %1 FSign %60
%62 = OpFOrdEqual %v4bool %58 %61
%64 = OpAll %bool %62
OpBranch %57
%57 = OpLabel
%65 = OpPhi %bool %false %44 %64 %56
OpSelectionMerge %70 None
OpBranchConditional %65 %68 %69
%68 = OpLabel
%71 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%73 = OpLoad %v4float %71
OpStore %66 %73
OpBranch %70
%69 = OpLabel
%74 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%76 = OpLoad %v4float %74
OpStore %66 %76
OpBranch %70
%70 = OpLabel
%77 = OpLoad %v4float %66
OpReturnValue %77
%expected = OpVariable %_ptr_Function_v4float Function
%73 = OpVariable %_ptr_Function_v4float Function
OpStore %expected %25
%28 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%32 = OpLoad %v4float %28
%33 = OpCompositeExtract %float %32 0
%27 = OpExtInst %float %1 FSign %33
%34 = OpLoad %v4float %expected
%35 = OpCompositeExtract %float %34 0
%36 = OpFOrdEqual %bool %27 %35
OpSelectionMerge %38 None
OpBranchConditional %36 %37 %38
%37 = OpLabel
%40 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%41 = OpLoad %v4float %40
%42 = OpVectorShuffle %v2float %41 %41 0 1
%39 = OpExtInst %v2float %1 FSign %42
%44 = OpLoad %v4float %expected
%45 = OpVectorShuffle %v2float %44 %44 0 1
%46 = OpFOrdEqual %v2bool %39 %45
%48 = OpAll %bool %46
OpBranch %38
%38 = OpLabel
%49 = OpPhi %bool %false %19 %48 %37
OpSelectionMerge %51 None
OpBranchConditional %49 %50 %51
%50 = OpLabel
%53 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%54 = OpLoad %v4float %53
%55 = OpVectorShuffle %v3float %54 %54 0 1 2
%52 = OpExtInst %v3float %1 FSign %55
%57 = OpLoad %v4float %expected
%58 = OpVectorShuffle %v3float %57 %57 0 1 2
%59 = OpFOrdEqual %v3bool %52 %58
%61 = OpAll %bool %59
OpBranch %51
%51 = OpLabel
%62 = OpPhi %bool %false %38 %61 %50
OpSelectionMerge %64 None
OpBranchConditional %62 %63 %64
%63 = OpLabel
%66 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%67 = OpLoad %v4float %66
%65 = OpExtInst %v4float %1 FSign %67
%68 = OpLoad %v4float %expected
%69 = OpFOrdEqual %v4bool %65 %68
%71 = OpAll %bool %69
OpBranch %64
%64 = OpLabel
%72 = OpPhi %bool %false %51 %71 %63
OpSelectionMerge %76 None
OpBranchConditional %72 %74 %75
%74 = OpLabel
%77 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%79 = OpLoad %v4float %77
OpStore %73 %79
OpBranch %76
%75 = OpLabel
%80 = OpAccessChain %_ptr_Uniform_v4float %10 %int_2
%82 = OpLoad %v4float %80
OpStore %73 %82
OpBranch %76
%76 = OpLabel
%83 = OpLoad %v4float %73
OpReturnValue %83
OpFunctionEnd

View File

@ -4,5 +4,6 @@ uniform vec4 testInputs;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return ((sign(testInputs.x) == -1.0 && sign(testInputs.xy) == vec2(-1.0, 0.0)) && sign(testInputs.xyz) == vec3(-1.0, 0.0, 1.0)) && sign(testInputs) == vec4(-1.0, 0.0, 1.0, 1.0) ? colorGreen : colorRed;
vec4 expected = vec4(-1.0, 0.0, 1.0, 1.0);
return ((sign(testInputs.x) == expected.x && sign(testInputs.xy) == expected.xy) && sign(testInputs.xyz) == expected.xyz) && sign(testInputs) == expected ? colorGreen : colorRed;
}

View File

@ -17,6 +17,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = ((sign(_uniforms.testInputs.x) == -1.0 && all(sign(_uniforms.testInputs.xy) == float2(-1.0, 0.0))) && all(sign(_uniforms.testInputs.xyz) == float3(-1.0, 0.0, 1.0))) && all(sign(_uniforms.testInputs) == float4(-1.0, 0.0, 1.0, 1.0)) ? _uniforms.colorGreen : _uniforms.colorRed;
float4 expected = float4(-1.0, 0.0, 1.0, 1.0);
_out.sk_FragColor = ((sign(_uniforms.testInputs.x) == expected.x && all(sign(_uniforms.testInputs.xy) == expected.xy)) && all(sign(_uniforms.testInputs.xyz) == expected.xyz)) && all(sign(_uniforms.testInputs) == expected) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -9,6 +9,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0].xyxy;
float2x2 m1 = float2x2(float2(1.0, 2.0), float2(3.0, 4.0));
_out.sk_FragColor = m1[0].xyxy;
return _out;
}

View File

@ -12,6 +12,8 @@ float3x3 float3x3_from_float2x2(float2x2 x0) {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor.x = float(all(float3x3(1.0)[0] == float3x3_from_float2x2(float2x2(1.0))[0]) ? 0 : 1);
float3x3 a = float3x3(1.0);
float3x3 b = float3x3_from_float2x2(float2x2(1.0));
_out.sk_FragColor.x = float(all(a[0] == b[0]) ? 0 : 1);
return _out;
}

View File

@ -12,6 +12,8 @@ float4x4 float4x4_from_float2x3(float2x3 x0) {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor.x = float(all(float4x4(6.0)[1] == float4x4_from_float2x3(float2x3(7.0))[1]) ? 0 : 1);
float4x4 a = float4x4(6.0);
float4x4 b = float4x4_from_float2x3(float2x3(7.0));
_out.sk_FragColor.x = float(all(a[1] == b[1]) ? 0 : 1);
return _out;
}

View File

@ -12,6 +12,8 @@ float3x4 float3x4_from_float4x4(float4x4 x0) {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor.x = float(all(float3x4(1.0)[0] == float3x4_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
float3x4 a = float3x4(1.0);
float3x4 b = float3x4_from_float4x4(float4x4(1.0));
_out.sk_FragColor.x = float(all(a[0] == b[0]) ? 0 : 1);
return _out;
}

View File

@ -12,6 +12,8 @@ float4x3 float4x3_from_float4x4(float4x4 x0) {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor.x = float(all(float4x3(1.0)[0] == float4x3_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
float4x3 a = float4x3(1.0);
float4x3 b = float4x3_from_float4x4(float4x4(1.0));
_out.sk_FragColor.x = float(all(a[0] == b[0]) ? 0 : 1);
return _out;
}

View File

@ -33,8 +33,10 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
(void)_globals;
Outputs _out;
(void)_out;
float2 a = float2(1.0);
float3 b = float3(2.0);
float4x4 c = float4x4(3.0);
float3x3 d = float3x3(4.0);
_out.sk_FragColor = _skOutParamHelper0_fn(_out, _globals, 1.0, b, _globals.glob, d);
_out.sk_FragColor = _skOutParamHelper0_fn(_out, _globals, a.x, b, _globals.glob, d);
return _out;
}

View File

@ -10,6 +10,9 @@ OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %test1 "test1"
OpName %test2 "test2"
OpName %test3 "test3"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -49,21 +52,21 @@ OpDecorate %77 RelaxedPrecision
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%int_3 = OpConstant %int 3
%_ptr_Function_float = OpTypePointer Function %float
%v2float = OpTypeVector %float 2
%int_2 = OpConstant %int 2
%_arr_v2float_int_2 = OpTypeArray %v2float %int_2
%_ptr_Function__arr_v2float_int_2 = OpTypePointer Function %_arr_v2float_int_2
%39 = OpConstantComposite %v2float %float_1 %float_2
%40 = OpConstantComposite %v2float %float_3 %float_4
%int_1 = OpConstant %int 1
%_ptr_Function_v2float = OpTypePointer Function %v2float
%35 = OpConstantComposite %v2float %float_1 %float_2
%36 = OpConstantComposite %v2float %float_3 %float_4
%mat4v4float = OpTypeMatrix %v4float 4
%int_1 = OpConstant %int 1
%_arr_mat4v4float_int_1 = OpTypeArray %mat4v4float %int_1
%_ptr_Function__arr_mat4v4float_int_1 = OpTypePointer Function %_arr_mat4v4float_int_1
%float_16 = OpConstant %float 16
%float_0 = OpConstant %float 0
%int_3 = OpConstant %int 3
%_ptr_Function_float = OpTypePointer Function %float
%_ptr_Function_v2float = OpTypePointer Function %v2float
%int_0 = OpConstant %int 0
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_24 = OpConstant %float 24
@ -76,31 +79,31 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%20 = OpVariable %_ptr_Function__arr_float_int_4 Function
%34 = OpVariable %_ptr_Function__arr_v2float_int_2 Function
%48 = OpVariable %_ptr_Function__arr_mat4v4float_int_1 Function
%test1 = OpVariable %_ptr_Function__arr_float_int_4 Function
%test2 = OpVariable %_ptr_Function__arr_v2float_int_2 Function
%test3 = OpVariable %_ptr_Function__arr_mat4v4float_int_1 Function
%68 = OpVariable %_ptr_Function_v4float Function
%29 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
OpStore %20 %29
%31 = OpAccessChain %_ptr_Function_float %20 %int_3
%33 = OpLoad %float %31
%41 = OpCompositeConstruct %_arr_v2float_int_2 %39 %40
OpStore %34 %41
%43 = OpAccessChain %_ptr_Function_v2float %34 %int_1
%45 = OpLoad %v2float %43
%46 = OpCompositeExtract %float %45 1
%47 = OpFAdd %float %33 %46
%55 = OpCompositeConstruct %v4float %float_16 %float_0 %float_0 %float_0
%56 = OpCompositeConstruct %v4float %float_0 %float_16 %float_0 %float_0
%57 = OpCompositeConstruct %v4float %float_0 %float_0 %float_16 %float_0
%58 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_16
%53 = OpCompositeConstruct %mat4v4float %55 %56 %57 %58
%59 = OpCompositeConstruct %_arr_mat4v4float_int_1 %53
OpStore %48 %59
%61 = OpAccessChain %_ptr_Function_v4float %48 %int_0 %int_3
OpStore %test1 %29
%37 = OpCompositeConstruct %_arr_v2float_int_2 %35 %36
OpStore %test2 %37
%46 = OpCompositeConstruct %v4float %float_16 %float_0 %float_0 %float_0
%47 = OpCompositeConstruct %v4float %float_0 %float_16 %float_0 %float_0
%48 = OpCompositeConstruct %v4float %float_0 %float_0 %float_16 %float_0
%49 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_16
%44 = OpCompositeConstruct %mat4v4float %46 %47 %48 %49
%50 = OpCompositeConstruct %_arr_mat4v4float_int_1 %44
OpStore %test3 %50
%52 = OpAccessChain %_ptr_Function_float %test1 %int_3
%54 = OpLoad %float %52
%55 = OpAccessChain %_ptr_Function_v2float %test2 %int_1
%57 = OpLoad %v2float %55
%58 = OpCompositeExtract %float %57 1
%59 = OpFAdd %float %54 %58
%61 = OpAccessChain %_ptr_Function_v4float %test3 %int_0 %int_3
%63 = OpLoad %v4float %61
%64 = OpCompositeExtract %float %63 3
%65 = OpFAdd %float %47 %64
%65 = OpFAdd %float %59 %64
%67 = OpFOrdEqual %bool %65 %float_24
OpSelectionMerge %71 None
OpBranchConditional %67 %69 %70

View File

@ -3,5 +3,8 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return (float[4](1.0, 2.0, 3.0, 4.0)[3] + vec2[2](vec2(1.0, 2.0), vec2(3.0, 4.0))[1].y) + mat4[1](mat4(16.0))[0][3].w == 24.0 ? colorGreen : colorRed;
float test1[4] = float[4](1.0, 2.0, 3.0, 4.0);
vec2 test2[2] = vec2[2](vec2(1.0, 2.0), vec2(3.0, 4.0));
mat4 test3[1] = mat4[1](mat4(16.0));
return (test1[3] + test2[1].y) + test3[0][3].w == 24.0 ? colorGreen : colorRed;
}

View File

@ -15,6 +15,9 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = (array<float, 4>{1.0, 2.0, 3.0, 4.0}[3] + array<float2, 2>{float2(1.0, 2.0), float2(3.0, 4.0)}[1].y) + array<float4x4, 1>{float4x4(16.0)}[0][3].w == 24.0 ? _uniforms.colorGreen : _uniforms.colorRed;
array<float, 4> test1 = array<float, 4>{1.0, 2.0, 3.0, 4.0};
array<float2, 2> test2 = array<float2, 2>{float2(1.0, 2.0), float2(3.0, 4.0)};
array<float4x4, 1> test3 = array<float4x4, 1>{float4x4(16.0)};
_out.sk_FragColor = (test1[3] + test2[1].y) + test3[0][3].w == 24.0 ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -6,12 +6,19 @@ OpExecutionMode %main OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
OpName %main "main"
OpName %array "array"
OpName %x "x"
OpName %y "y"
OpName %z "z"
OpName %w "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 %_arr_float_int_4 ArrayStride 16
OpDecorate %34 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -29,35 +36,40 @@ OpDecorate %_arr_float_int_4 ArrayStride 16
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
%float_4 = OpConstant %float 4
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
%_ptr_Function_float = OpTypePointer Function %float
%uint = OpTypeInt 32 0
%_ptr_Function_uint = OpTypePointer Function %uint
%uint_1 = OpConstant %uint 1
%int_2 = OpConstant %int 2
%uint_3 = OpConstant %uint 3
%_ptr_Function_float = OpTypePointer Function %float
%main = OpFunction %void None %11
%12 = OpLabel
%13 = OpVariable %_ptr_Function__arr_float_int_4 Function
%27 = OpVariable %_ptr_Function__arr_float_int_4 Function
%33 = OpVariable %_ptr_Function__arr_float_int_4 Function
%38 = OpVariable %_ptr_Function__arr_float_int_4 Function
%array = OpVariable %_ptr_Function__arr_float_int_4 Function
%x = OpVariable %_ptr_Function_int Function
%y = OpVariable %_ptr_Function_uint Function
%z = OpVariable %_ptr_Function_int Function
%w = OpVariable %_ptr_Function_uint Function
%22 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
OpStore %13 %22
%24 = OpAccessChain %_ptr_Function_float %13 %int_0
%26 = OpLoad %float %24
%28 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
OpStore %27 %28
%31 = OpAccessChain %_ptr_Function_float %27 %uint_1
%32 = OpLoad %float %31
%34 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
OpStore %33 %34
%36 = OpAccessChain %_ptr_Function_float %33 %int_2
%37 = OpLoad %float %36
%39 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
OpStore %38 %39
%41 = OpAccessChain %_ptr_Function_float %38 %uint_3
%42 = OpLoad %float %41
%43 = OpCompositeConstruct %v4float %26 %32 %37 %42
OpStore %sk_FragColor %43
OpStore %array %22
OpStore %x %int_0
OpStore %y %uint_1
OpStore %z %int_2
OpStore %w %uint_3
%34 = OpLoad %int %x
%35 = OpAccessChain %_ptr_Function_float %array %34
%37 = OpLoad %float %35
%38 = OpLoad %uint %y
%39 = OpAccessChain %_ptr_Function_float %array %38
%40 = OpLoad %float %39
%41 = OpLoad %int %z
%42 = OpAccessChain %_ptr_Function_float %array %41
%43 = OpLoad %float %42
%44 = OpLoad %uint %w
%45 = OpAccessChain %_ptr_Function_float %array %44
%46 = OpLoad %float %45
%47 = OpCompositeConstruct %v4float %37 %40 %43 %46
OpStore %sk_FragColor %47
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,10 @@
out vec4 sk_FragColor;
void main() {
sk_FragColor = vec4(float[4](1.0, 2.0, 3.0, 4.0)[0], float[4](1.0, 2.0, 3.0, 4.0)[1u], float[4](1.0, 2.0, 3.0, 4.0)[2], float[4](1.0, 2.0, 3.0, 4.0)[3u]);
float array[4] = float[4](1.0, 2.0, 3.0, 4.0);
int x = 0;
uint y = 1u;
int z = 2;
uint w = 3u;
sk_FragColor = vec4(array[x], array[y], array[z], array[w]);
}

View File

@ -9,6 +9,11 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = float4(array<float, 4>{1.0, 2.0, 3.0, 4.0}[0], array<float, 4>{1.0, 2.0, 3.0, 4.0}[1u], array<float, 4>{1.0, 2.0, 3.0, 4.0}[2], array<float, 4>{1.0, 2.0, 3.0, 4.0}[3u]);
array<float, 4> array = array<float, 4>{1.0, 2.0, 3.0, 4.0};
short x = 0;
ushort y = 1u;
int z = 2;
uint w = 3u;
_out.sk_FragColor = float4(array[x], array[y], array[z], array[w]);
return _out;
}

View File

@ -9,7 +9,9 @@ OpName %_UniformBuffer "_UniformBuffer"
OpMemberName %_UniformBuffer 0 "colorGreen"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %i "i"
OpName %i4 "i4"
OpName %f3x3 "f3x3"
OpName %x "x"
OpName %ai "ai"
OpName %ai4 "ai4"
@ -21,6 +23,8 @@ OpMemberName %S 1 "af"
OpMemberName %S 2 "h4"
OpMemberName %S 3 "ah4"
OpName %s "s"
OpName %l "l"
OpName %r "r"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -31,14 +35,14 @@ OpMemberDecorate %_UniformBuffer 0 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %37 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %_arr_int_int_1 ArrayStride 16
OpDecorate %_arr_v4int_int_1 ArrayStride 16
OpDecorate %_arr_mat3v3float_int_1 ArrayStride 48
OpDecorate %63 RelaxedPrecision
OpDecorate %64 RelaxedPrecision
OpDecorate %65 RelaxedPrecision
OpDecorate %62 RelaxedPrecision
OpDecorate %70 RelaxedPrecision
OpDecorate %71 RelaxedPrecision
OpDecorate %72 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
OpDecorate %_arr_v4float_int_1 ArrayStride 16
OpDecorate %_arr_float_int_5 ArrayStride 16
OpDecorate %_arr_v4float_int_5 ArrayStride 16
@ -48,12 +52,14 @@ OpMemberDecorate %S 2 Offset 96
OpMemberDecorate %S 2 RelaxedPrecision
OpMemberDecorate %S 3 Offset 112
OpMemberDecorate %S 3 RelaxedPrecision
OpDecorate %88 RelaxedPrecision
OpDecorate %92 RelaxedPrecision
OpDecorate %108 RelaxedPrecision
OpDecorate %115 RelaxedPrecision
OpDecorate %94 RelaxedPrecision
OpDecorate %98 RelaxedPrecision
OpDecorate %116 RelaxedPrecision
OpDecorate %122 RelaxedPrecision
OpDecorate %124 RelaxedPrecision
OpDecorate %125 RelaxedPrecision
OpDecorate %126 RelaxedPrecision
OpDecorate %129 RelaxedPrecision
OpDecorate %133 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -68,28 +74,18 @@ OpDecorate %122 RelaxedPrecision
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_3 = OpConstant %int 3
%int_4 = OpConstant %int 4
%28 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_0 = OpConstant %float 0
%_ptr_Function_float = OpTypePointer Function %float
%v2float = OpTypeVector %float 2
%35 = OpConstantComposite %v2float %float_0 %float_0
%_arr_int_int_1 = OpTypeArray %int %int_1
%_ptr_Function__arr_int_int_1 = OpTypePointer Function %_arr_int_int_1
%int_0 = OpConstant %int 0
%_ptr_Function_int = OpTypePointer Function %int
%_arr_v4int_int_1 = OpTypeArray %v4int %int_1
%_ptr_Function__arr_v4int_int_1 = OpTypePointer Function %_arr_v4int_int_1
%31 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
%v3float = OpTypeVector %float 3
%mat3v3float = OpTypeMatrix %v3float 3
%_arr_mat3v3float_int_1 = OpTypeArray %mat3v3float %int_1
%_ptr_Function__arr_mat3v3float_int_1 = OpTypePointer Function %_arr_mat3v3float_int_1
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
%float_1 = OpConstant %float 1
%float_2 = OpConstant %float 2
%float_3 = OpConstant %float 3
@ -99,18 +95,28 @@ OpDecorate %122 RelaxedPrecision
%float_7 = OpConstant %float 7
%float_8 = OpConstant %float 8
%float_9 = OpConstant %float 9
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_0 = OpConstant %float 0
%_ptr_Function_float = OpTypePointer Function %float
%v2float = OpTypeVector %float 2
%55 = OpConstantComposite %v2float %float_0 %float_0
%_arr_int_int_1 = OpTypeArray %int %int_1
%_ptr_Function__arr_int_int_1 = OpTypePointer Function %_arr_int_int_1
%_arr_v4int_int_1 = OpTypeArray %v4int %int_1
%_ptr_Function__arr_v4int_int_1 = OpTypePointer Function %_arr_v4int_int_1
%_arr_mat3v3float_int_1 = OpTypeArray %mat3v3float %int_1
%_ptr_Function__arr_mat3v3float_int_1 = OpTypePointer Function %_arr_mat3v3float_int_1
%_arr_v4float_int_1 = OpTypeArray %v4float %int_1
%_ptr_Function__arr_v4float_int_1 = OpTypePointer Function %_arr_v4float_int_1
%73 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%79 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%int_5 = OpConstant %int 5
%_arr_float_int_5 = OpTypeArray %float %int_5
%_arr_v4float_int_5 = OpTypeArray %v4float %int_5
%S = OpTypeStruct %float %_arr_float_int_5 %v4float %_arr_v4float_int_5
%_ptr_Function_S = OpTypePointer Function %S
%85 = OpConstantComposite %v3float %float_9 %float_9 %float_9
%89 = OpConstantComposite %v2float %float_5 %float_5
%102 = OpConstantComposite %v4float %float_2 %float_2 %float_2 %float_2
%91 = OpConstantComposite %v3float %float_9 %float_9 %float_9
%95 = OpConstantComposite %v2float %float_5 %float_5
%110 = OpConstantComposite %v4float %float_2 %float_2 %float_2 %float_2
%_ptr_Function_v3float = OpTypePointer Function %v3float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%_entrypoint = OpFunction %void None %15
@ -121,83 +127,97 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%i = OpVariable %_ptr_Function_int Function
%i4 = OpVariable %_ptr_Function_v4int Function
%f3x3 = OpVariable %_ptr_Function_mat3v3float Function
%x = OpVariable %_ptr_Function_v4float Function
%ai = OpVariable %_ptr_Function__arr_int_int_1 Function
%ai4 = OpVariable %_ptr_Function__arr_v4int_int_1 Function
%ah2x4 = OpVariable %_ptr_Function__arr_mat3v3float_int_1 Function
%af4 = OpVariable %_ptr_Function__arr_v4float_int_1 Function
%s = OpVariable %_ptr_Function_S Function
OpStore %i4 %28
%32 = OpAccessChain %_ptr_Function_float %x %int_3
OpStore %32 %float_0
%36 = OpLoad %v4float %x
%37 = OpVectorShuffle %v4float %36 %35 5 4 2 3
OpStore %x %37
%42 = OpAccessChain %_ptr_Function_int %ai %int_0
OpStore %42 %int_0
%47 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
OpStore %47 %28
%63 = OpCompositeConstruct %v3float %float_1 %float_2 %float_3
%64 = OpCompositeConstruct %v3float %float_4 %float_5 %float_6
%65 = OpCompositeConstruct %v3float %float_7 %float_8 %float_9
%62 = OpCompositeConstruct %mat3v3float %63 %64 %65
%66 = OpAccessChain %_ptr_Function_mat3v3float %ah2x4 %int_0
OpStore %66 %62
%71 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%72 = OpAccessChain %_ptr_Function_float %71 %int_0
OpStore %72 %float_0
%74 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%75 = OpLoad %v4float %74
%76 = OpVectorShuffle %v4float %75 %73 6 4 7 5
OpStore %74 %76
%83 = OpAccessChain %_ptr_Function_float %s %int_0
OpStore %83 %float_0
%84 = OpAccessChain %_ptr_Function_float %s %int_1 %int_1
OpStore %84 %float_0
%86 = OpAccessChain %_ptr_Function_v4float %s %int_2
%87 = OpLoad %v4float %86
%88 = OpVectorShuffle %v4float %87 %85 5 6 4 3
OpStore %86 %88
%90 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_2
%91 = OpLoad %v4float %90
%92 = OpVectorShuffle %v4float %91 %89 0 4 2 5
OpStore %90 %92
%93 = OpAccessChain %_ptr_Function_int %ai %int_0
%94 = OpLoad %int %93
%95 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
%96 = OpLoad %v4int %95
%97 = OpCompositeExtract %int %96 0
%98 = OpIAdd %int %94 %97
OpStore %93 %98
%99 = OpAccessChain %_ptr_Function_float %s %int_0
OpStore %99 %float_1
%100 = OpAccessChain %_ptr_Function_float %s %int_1 %int_0
OpStore %100 %float_2
%101 = OpAccessChain %_ptr_Function_v4float %s %int_2
OpStore %101 %73
%103 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_0
OpStore %103 %102
%104 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%105 = OpLoad %v4float %104
%106 = OpAccessChain %_ptr_Function_v3float %ah2x4 %int_0 %int_0
%108 = OpLoad %v3float %106
%109 = OpCompositeExtract %float %108 0
%110 = OpVectorTimesScalar %v4float %105 %109
OpStore %104 %110
%111 = OpAccessChain %_ptr_Function_int %i4 %int_1
%112 = OpLoad %int %111
%113 = OpIMul %int %112 %int_0
OpStore %111 %113
%114 = OpAccessChain %_ptr_Function_float %x %int_1
%115 = OpLoad %float %114
%116 = OpFMul %float %115 %float_0
OpStore %114 %116
%117 = OpAccessChain %_ptr_Function_float %s %int_0
%118 = OpLoad %float %117
%119 = OpFMul %float %118 %float_0
OpStore %117 %119
%120 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%122 = OpLoad %v4float %120
OpReturnValue %122
%l = OpVariable %_ptr_Function_float Function
%r = OpVariable %_ptr_Function_float Function
OpStore %i %int_0
OpStore %i4 %31
%46 = OpCompositeConstruct %v3float %float_1 %float_2 %float_3
%47 = OpCompositeConstruct %v3float %float_4 %float_5 %float_6
%48 = OpCompositeConstruct %v3float %float_7 %float_8 %float_9
%45 = OpCompositeConstruct %mat3v3float %46 %47 %48
OpStore %f3x3 %45
%52 = OpAccessChain %_ptr_Function_float %x %int_3
OpStore %52 %float_0
%56 = OpLoad %v4float %x
%57 = OpVectorShuffle %v4float %56 %55 5 4 2 3
OpStore %x %57
%61 = OpAccessChain %_ptr_Function_int %ai %int_0
OpStore %61 %int_0
%65 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
OpStore %65 %31
%70 = OpCompositeConstruct %v3float %float_1 %float_2 %float_3
%71 = OpCompositeConstruct %v3float %float_4 %float_5 %float_6
%72 = OpCompositeConstruct %v3float %float_7 %float_8 %float_9
%69 = OpCompositeConstruct %mat3v3float %70 %71 %72
%73 = OpAccessChain %_ptr_Function_mat3v3float %ah2x4 %int_0
OpStore %73 %69
%77 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%78 = OpAccessChain %_ptr_Function_float %77 %int_0
OpStore %78 %float_0
%80 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%81 = OpLoad %v4float %80
%82 = OpVectorShuffle %v4float %81 %79 6 4 7 5
OpStore %80 %82
%89 = OpAccessChain %_ptr_Function_float %s %int_0
OpStore %89 %float_0
%90 = OpAccessChain %_ptr_Function_float %s %int_1 %int_1
OpStore %90 %float_0
%92 = OpAccessChain %_ptr_Function_v4float %s %int_2
%93 = OpLoad %v4float %92
%94 = OpVectorShuffle %v4float %93 %91 5 6 4 3
OpStore %92 %94
%96 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_2
%97 = OpLoad %v4float %96
%98 = OpVectorShuffle %v4float %97 %95 0 4 2 5
OpStore %96 %98
OpStore %l %float_0
%101 = OpAccessChain %_ptr_Function_int %ai %int_0
%102 = OpLoad %int %101
%103 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
%104 = OpLoad %v4int %103
%105 = OpCompositeExtract %int %104 0
%106 = OpIAdd %int %102 %105
OpStore %101 %106
%107 = OpAccessChain %_ptr_Function_float %s %int_0
OpStore %107 %float_1
%108 = OpAccessChain %_ptr_Function_float %s %int_1 %int_0
OpStore %108 %float_2
%109 = OpAccessChain %_ptr_Function_v4float %s %int_2
OpStore %109 %79
%111 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_0
OpStore %111 %110
%112 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
%113 = OpLoad %v4float %112
%114 = OpAccessChain %_ptr_Function_v3float %ah2x4 %int_0 %int_0
%116 = OpLoad %v3float %114
%117 = OpCompositeExtract %float %116 0
%118 = OpVectorTimesScalar %v4float %113 %117
OpStore %112 %118
%119 = OpAccessChain %_ptr_Function_int %i4 %int_1
%120 = OpLoad %int %119
%121 = OpLoad %int %i
%122 = OpIMul %int %120 %121
OpStore %119 %122
%123 = OpAccessChain %_ptr_Function_float %x %int_1
%124 = OpLoad %float %123
%125 = OpLoad %float %l
%126 = OpFMul %float %124 %125
OpStore %123 %126
%127 = OpAccessChain %_ptr_Function_float %s %int_0
%128 = OpLoad %float %127
%129 = OpLoad %float %l
%130 = OpFMul %float %128 %129
OpStore %127 %130
%131 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%133 = OpLoad %v4float %131
OpReturnValue %133
OpFunctionEnd

View File

@ -8,8 +8,12 @@ struct S {
vec4 ah4[5];
};
vec4 main() {
int i;
i = 0;
ivec4 i4;
i4 = ivec4(1, 2, 3, 4);
mat3 f3x3;
f3x3 = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
vec4 x;
x.w = 0.0;
x.yx = vec2(0.0);
@ -27,14 +31,18 @@ vec4 main() {
s.af[1] = 0.0;
s.h4.zxy = vec3(9.0);
s.ah4[2].yw = vec2(5.0);
float l;
float r;
l = 0.0;
ai[0] += ai4[0].x;
s.f = 1.0;
s.af[0] = 2.0;
s.h4 = vec4(1.0);
s.ah4[0] = vec4(2.0);
af4[0] *= ah2x4[0][0].x;
i4.y *= 0;
x.y *= 0.0;
s.f *= 0.0;
i4.y *= i;
x.y *= l;
s.f *= l;
return colorGreen;
}

View File

@ -19,8 +19,12 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
int i;
i = 0;
int4 i4;
i4 = int4(1, 2, 3, 4);
float3x3 f3x3;
f3x3 = float3x3(float3(1.0, 2.0, 3.0), float3(4.0, 5.0, 6.0), float3(7.0, 8.0, 9.0));
float4 x;
x.w = 0.0;
x.yx = float2(0.0);
@ -38,15 +42,19 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
s.af[1] = 0.0;
s.h4.zxy = float3(9.0);
s.ah4[2].yw = float2(5.0);
float l;
float r;
l = 0.0;
ai[0] += ai4[0].x;
s.f = 1.0;
s.af[0] = 2.0;
s.h4 = float4(1.0);
s.ah4[0] = float4(2.0);
af4[0] *= ah2x4[0][0].x;
i4.y = i4.y * 0;
x.y = x.y * 0.0;
s.f *= 0.0;
i4.y = i4.y * i;
x.y = x.y * l;
s.f *= l;
_out.sk_FragColor = _uniforms.colorGreen;
return _out;
}

View File

@ -6,12 +6,15 @@ OpExecutionMode %main OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
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 RelaxedPrecision
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpDecorate %17 RelaxedPrecision
OpDecorate %29 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -21,13 +24,31 @@ OpDecorate %17 RelaxedPrecision
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%void = OpTypeVoid
%11 = OpTypeFunction %void
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%v3float = OpTypeVector %float 3
%float_1 = OpConstant %float 1
%15 = OpConstantComposite %v3float %float_1 %float_1 %float_1
%main = OpFunction %void None %11
%12 = OpLabel
%16 = OpLoad %v4float %sk_FragColor
%17 = OpVectorShuffle %v4float %16 %15 4 5 6 3
OpStore %sk_FragColor %17
%x = OpVariable %_ptr_Function_int Function
%y = OpVariable %_ptr_Function_int Function
%z = OpVariable %_ptr_Function_int Function
OpStore %x %int_0
OpStore %y %int_0
OpStore %z %int_0
OpStore %x %int_1
OpStore %y %int_1
OpStore %z %int_1
%20 = OpLoad %int %x
%21 = OpConvertSToF %float %20
%22 = OpLoad %int %y
%23 = OpConvertSToF %float %22
%24 = OpLoad %int %z
%25 = OpConvertSToF %float %24
%26 = OpCompositeConstruct %v3float %21 %23 %25
%28 = OpLoad %v4float %sk_FragColor
%29 = OpVectorShuffle %v4float %28 %26 4 5 6 3
OpStore %sk_FragColor %29
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,11 @@
out vec4 sk_FragColor;
void main() {
sk_FragColor.xyz = vec3(1.0, 1.0, 1.0);
int x = 0;
int y = 0;
int z = 0;
x = 1;
y = 1;
z = 1;
sk_FragColor.xyz = vec3(float(x), float(y), float(z));
}

View File

@ -9,6 +9,12 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor.xyz = float3(1.0, 1.0, 1.0);
int x = 0;
int y = 0;
int z = 0;
x = 1;
y = 1;
z = 1;
_out.sk_FragColor.xyz = float3(float(x), float(y), float(z));
return _out;
}

View File

@ -10,6 +10,7 @@ OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %ok "ok"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -22,7 +23,10 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %24 RelaxedPrecision
OpDecorate %23 RelaxedPrecision
OpDecorate %33 RelaxedPrecision
OpDecorate %36 RelaxedPrecision
OpDecorate %37 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -36,9 +40,13 @@ OpDecorate %24 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%_entrypoint = OpFunction %void None %15
%16 = OpLabel
%17 = OpFunctionCall %v4float %main
@ -47,7 +55,23 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%20 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%24 = OpLoad %v4float %20
OpReturnValue %24
%ok = OpVariable %_ptr_Function_bool Function
%24 = OpVariable %_ptr_Function_v4float Function
OpStore %ok %true
%23 = OpLoad %bool %ok
OpSelectionMerge %28 None
OpBranchConditional %23 %26 %27
%26 = OpLabel
%29 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%33 = OpLoad %v4float %29
OpStore %24 %33
OpBranch %28
%27 = OpLabel
%34 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%36 = OpLoad %v4float %34
OpStore %24 %36
OpBranch %28
%28 = OpLabel
%37 = OpLoad %v4float %24
OpReturnValue %37
OpFunctionEnd

View File

@ -3,5 +3,6 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return colorGreen;
bool ok = true;
return ok ? colorGreen : colorRed;
}

View File

@ -15,6 +15,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = _uniforms.colorGreen;
bool ok = true;
_out.sk_FragColor = ok ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -10,6 +10,8 @@ OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %a "a"
OpName %b "b"
OpName %c "c"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
@ -23,8 +25,8 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %36 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -39,8 +41,10 @@ OpDecorate %39 RelaxedPrecision
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_v4float = OpTypePointer Function %v4float
%float_0 = OpConstant %float 0
%23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
%float_1 = OpConstant %float 1
%24 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%26 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
%v4bool = OpTypeVector %bool 4
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
@ -54,22 +58,28 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%a = OpVariable %_ptr_Function_v4float Function
%b = OpVariable %_ptr_Function_v4float Function
%c = OpVariable %_ptr_Function_v4float Function
%22 = OpExtInst %v4float %1 FAbs %24
OpStore %c %22
%25 = OpLoad %v4float %c
%26 = OpFOrdNotEqual %v4bool %24 %25
%28 = OpAny %bool %26
OpSelectionMerge %31 None
OpBranchConditional %28 %29 %30
%29 = OpLabel
%32 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%36 = OpLoad %v4float %32
OpReturnValue %36
%30 = OpLabel
%37 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%39 = OpLoad %v4float %37
OpReturnValue %39
%31 = OpLabel
OpStore %a %23
OpStore %b %26
%29 = OpLoad %v4float %b
%28 = OpExtInst %v4float %1 FAbs %29
OpStore %c %28
%30 = OpLoad %v4float %b
%31 = OpLoad %v4float %c
%32 = OpFOrdNotEqual %v4bool %30 %31
%34 = OpAny %bool %32
OpSelectionMerge %37 None
OpBranchConditional %34 %35 %36
%35 = OpLabel
%38 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%42 = OpLoad %v4float %38
OpReturnValue %42
%36 = OpLabel
%43 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%45 = OpLoad %v4float %43
OpReturnValue %45
%37 = OpLabel
OpUnreachable
OpFunctionEnd

View File

@ -3,8 +3,10 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
vec4 c = abs(vec4(1.0));
if (vec4(1.0) != c) {
const vec4 a = vec4(0.0);
const vec4 b = vec4(1.0);
vec4 c = abs(b);
if (b != c) {
return colorRed;
} else {
return colorGreen;

View File

@ -15,8 +15,10 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
float4 c = abs(float4(1.0));
if (any(float4(1.0) != c)) {
const float4 a = float4(0.0);
const float4 b = float4(1.0);
float4 c = abs(b);
if (any(b != c)) {
_out.sk_FragColor = _uniforms.colorRed;
return _out;
} else {

View File

@ -10,6 +10,10 @@ OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %a "a"
OpName %b "b"
OpName %c "c"
OpName %d "d"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -22,7 +26,9 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %24 RelaxedPrecision
OpDecorate %55 RelaxedPrecision
OpDecorate %57 RelaxedPrecision
OpDecorate %58 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -36,9 +42,15 @@ OpDecorate %24 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
%int_1 = OpConstant %int 1
%int_2 = OpConstant %int 2
%int_5 = OpConstant %int 5
%false = OpConstantFalse %bool
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%_entrypoint = OpFunction %void None %15
%16 = OpLabel
%17 = OpFunctionCall %v4float %main
@ -47,7 +59,57 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%20 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%24 = OpLoad %v4float %20
OpReturnValue %24
%a = OpVariable %_ptr_Function_int Function
%b = OpVariable %_ptr_Function_int Function
%c = OpVariable %_ptr_Function_int Function
%d = OpVariable %_ptr_Function_int Function
%48 = OpVariable %_ptr_Function_v4float Function
OpStore %a %int_0
OpStore %b %int_0
OpStore %c %int_0
OpStore %d %int_0
OpStore %a %int_1
OpStore %b %int_2
OpStore %c %int_5
%31 = OpLoad %int %a
%32 = OpIEqual %bool %31 %int_1
OpSelectionMerge %34 None
OpBranchConditional %32 %33 %34
%33 = OpLabel
%35 = OpLoad %int %b
%36 = OpIEqual %bool %35 %int_2
OpBranch %34
%34 = OpLabel
%37 = OpPhi %bool %false %19 %36 %33
OpSelectionMerge %39 None
OpBranchConditional %37 %38 %39
%38 = OpLabel
%40 = OpLoad %int %c
%41 = OpIEqual %bool %40 %int_5
OpBranch %39
%39 = OpLabel
%42 = OpPhi %bool %false %34 %41 %38
OpSelectionMerge %44 None
OpBranchConditional %42 %43 %44
%43 = OpLabel
%45 = OpLoad %int %d
%46 = OpIEqual %bool %45 %int_0
OpBranch %44
%44 = OpLabel
%47 = OpPhi %bool %false %39 %46 %43
OpSelectionMerge %52 None
OpBranchConditional %47 %50 %51
%50 = OpLabel
%53 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%55 = OpLoad %v4float %53
OpStore %48 %55
OpBranch %52
%51 = OpLabel
%56 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%57 = OpLoad %v4float %56
OpStore %48 %57
OpBranch %52
%52 = OpLabel
%58 = OpLoad %v4float %48
OpReturnValue %58
OpFunctionEnd

View File

@ -3,5 +3,13 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
return colorGreen;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
a = 1;
b = 2;
c = 5;
return ((a == 1 && b == 2) && c == 5) && d == 0 ? colorGreen : colorRed;
}

View File

@ -15,6 +15,14 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
_out.sk_FragColor = _uniforms.colorGreen;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
a = 1;
b = 2;
c = 5;
_out.sk_FragColor = ((a == 1 && b == 2) && c == 5) && d == 0 ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}

View File

@ -10,6 +10,7 @@ OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpName %_entrypoint "_entrypoint"
OpName %main "main"
OpName %x "x"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
@ -22,7 +23,7 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %24 RelaxedPrecision
OpDecorate %27 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
@ -36,6 +37,8 @@ OpDecorate %24 RelaxedPrecision
%void = OpTypeVoid
%15 = OpTypeFunction %void
%18 = OpTypeFunction %v4float
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1
%int_0 = OpConstant %int 0
@ -47,7 +50,9 @@ OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %18
%19 = OpLabel
%20 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%24 = OpLoad %v4float %20
OpReturnValue %24
%x = OpVariable %_ptr_Function_bool Function
OpStore %x %true
%23 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%27 = OpLoad %v4float %23
OpReturnValue %27
OpFunctionEnd

View File

@ -3,5 +3,6 @@ out vec4 sk_FragColor;
uniform vec4 colorGreen;
uniform vec4 colorRed;
vec4 main() {
const bool x = true;
return colorGreen;
}

View File

@ -15,6 +15,7 @@ struct Outputs {
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _out;
(void)_out;
const bool x = true;
_out.sk_FragColor = _uniforms.colorGreen;
return _out;
}

Some files were not shown because too many files have changed in this diff Show More