skia2/resources/sksl/runtime/SwitchWithFallthrough.rts
John Stiles cb40008b43 Implement switch in SkVM.
SkVM implements switches as a pseudo-loop; breaks are handled with the
condition mask just like a for loop. Fallthrough is handled via a
scratch Value in a temporary slot. `writeStore` neeeded to be refactored
to support writing into slot(s) without an associated Variable.

At IR generation time, SwitchStatements are now emitted without error
even in strict-ES2 mode. The GLSL code generator currently reports these
as an error in strict-ES2 mode, but this will be fixed in a followup
coming shortly (the switch will be rewritten as ifs inside a one-shot
loop, similar to our IR-rewrite strategy).

Change-Id: I5507257246c42a35d2f46b4b9a89492a5ffeff9b
Bug: skia:12450
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/451421
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
2021-09-23 19:58:55 +00:00

30 lines
615 B
Plaintext

uniform half4 colorGreen, colorRed;
bool switch_fallthrough(int value) {
bool ok = false;
switch (value) {
case 2: break;
case 1:
case 0: ok = true; break;
default: break;
}
return ok;
}
bool switch_fallthrough_twice(int value) {
bool ok = false;
switch (value) {
case 0: break;
case 1:
case 2:
case 3: ok = true; break;
default: break;
}
return ok;
}
half4 main(float2 coords) {
int x = int(colorGreen.g);
return (switch_fallthrough(x) && switch_fallthrough_twice(x)) ? colorGreen : colorRed;
}