skia2/resources/sksl/runtime/LoopInt.rts
John Stiles 1991780081 Update LoopFloat/LoopInt tests to reduce hoisting.
Previously, none of our `runtime` tests relied on the input coordinate
in any way, so all of the logic was hoisted above the main loop in every
test. This CL adds an artificial reliance on the input coordinate so
that we have at least some SkVM tests with real code in the main loop.
This lets us see debug trace instructions interleaved with real code.

The input coordinate is clamped against a known uniform value
(`colorGreen` always contains 0101) so that the final test output
remains consistent in practice.

Additionally, I noticed that this test was only enabled in ES3, but
it doesn't seem to have anything ES3-specific in it, so it's now
enabled across the board.

Change-Id: Ie82f40b1060edb6071e300040ac59fb7d27094b0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/470397
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
2021-11-12 13:45:59 +00:00

113 lines
2.8 KiB
Plaintext

/*#pragma settings SkVMDebugTrace*/
uniform half4 colorRed, colorGreen;
// Should return 5
const int kZero = 0;
int return_loop(int five) {
for (int i = kZero; i < 10; ++i) {
if (i == five) { return i; }
}
return 0;
}
// Should return 35
const int kTen = kZero + 10;
int continue_loop(int five) {
int sum = 0;
for (int i = 0; i < kTen; ++i) {
if (i < five) { continue; }
sum += i;
}
return sum;
}
// Should return 15
int break_loop(int five) {
int sum = 0;
const int kOne = 1;
for (int i = 0; i < 10; i += kOne) {
if (i > five) { break; }
sum += i;
}
return sum;
}
bool loop_operator_le() {
// These loops are inside-out and execute zero times.
for (int i = 3; i <= 1; ++i) { return false; }
for (int i = 3; i <= 1; --i) { return false; }
int4 result = int4(9);
for (int i = 1; i <= 3; ++i) {
result = int4(result.yzw, i);
}
return result == int4(9, 1, 2, 3);
}
bool loop_operator_lt() {
// These loops are inside-out and execute zero times.
for (int i = 4; i < 1; ++i) { return false; }
for (int i = 4; i < 1; --i) { return false; }
int4 result = int4(9);
for (int i = 1; i < 4; ++i) {
result = int4(result.yzw, i);
}
return result == int4(9, 1, 2, 3);
}
bool loop_operator_ge() {
// These loops are inside-out and execute zero times.
for (int i = 1; i >= 3; ++i) { return false; }
for (int i = 1; i >= 3; --i) { return false; }
int4 result = int4(9);
for (int i = 3; i >= 1; --i) {
result = int4(result.yzw, i);
}
return result == int4(9, 3, 2, 1);
}
bool loop_operator_gt() {
// These loops are inside-out and execute zero times.
for (int i = 0; i > 3; ++i) { return false; }
for (int i = 0; i > 3; --i) { return false; }
int4 result = int4(9);
for (int i = 3; i > 0; --i) {
result = int4(result.yzw, i);
}
return result == int4(9, 3, 2, 1);
}
bool loop_operator_ne() {
// This loop executes zero times.
for (int i = 1; i != 1; ++i) { return false; }
int4 result = int4(9);
for (int i = 1; i != 4; ++i) {
result = int4(result.yzw, i);
}
return result == int4(9, 1, 2, 3);
}
bool loop_operator_eq() {
// This loop executes zero times.
for (int i = 1; i == 2; ++i) { return false; }
int4 result = int4(9);
for (int i = 1; i == 1; ++i) {
result = int4(result.yzw, i);
}
return result == int4(9, 9, 9, 1);
}
half4 main(float2 pos) {
int five = int(clamp(pos.x, colorGreen.g, colorGreen.a)) * 5;
return (return_loop(five) == 5 && continue_loop(five) == 35 && break_loop(five) == 15 &&
loop_operator_le() && loop_operator_lt() &&
loop_operator_ge() && loop_operator_gt() &&
loop_operator_eq() && loop_operator_ne()) ? colorGreen : colorRed;
}