Added SkSL DSL switch statements
Change-Id: Iccb6f1bb65dce5b313716dfdf3a4eb87b9bb4fc3
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/368058
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/tests/SkSLDSLTest.cpp b/tests/SkSLDSLTest.cpp
index d1ffb92..0efe0b0 100644
--- a/tests/SkSLDSLTest.cpp
+++ b/tests/SkSLDSLTest.cpp
@@ -1091,6 +1091,50 @@
REPORTER_ASSERT(r, whitespace_insensitive_compare(y, "return true;"));
}
+DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLSwitch, r, ctxInfo) {
+ AutoDSLContext context(ctxInfo.directContext()->priv().getGpu());
+
+ Var a(kFloat, "a"), b(kInt, "b");
+
+ Statement x = Switch(5,
+ Case(0, a = 0, Break()),
+ Case(1, a = 1, Continue()),
+ Default(Discard())
+ );
+ REPORTER_ASSERT(r, whitespace_insensitive_compare(x,
+ "switch (5) { case 0: (a = 0.0); break; case 1: (a = 1.0); continue; default: discard; }"));
+
+ Statement y = Switch(b);
+ REPORTER_ASSERT(r, whitespace_insensitive_compare(y,
+ "switch (b) {}"));
+
+ Statement z = Switch(b, Default(), Case(0), Case(1));
+ REPORTER_ASSERT(r, whitespace_insensitive_compare(z,
+ "switch (b) { default: case 0: case 1: }"));
+
+ {
+ ExpectError error(r, "error: duplicate case value\n");
+ Switch(0, Case(0), Case(0)).release();
+ }
+
+ {
+ ExpectError error(r, "error: case value must be a constant integer\n");
+ Var b(kInt);
+ Switch(0, Case(b)).release();
+ }
+
+ {
+ ExpectError error(r, "error: continue statement must be inside a loop\n");
+ DSLFunction(kVoid, "fail").define(
+ Switch(5,
+ Case(0, a = 0, Break()),
+ Case(1, a = 1, Continue()),
+ Default(Discard())
+ )
+ );
+ }
+}
+
DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLSwizzle, r, ctxInfo) {
AutoDSLContext context(ctxInfo.directContext()->priv().getGpu());
Var a(kFloat4, "a");