aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-05-10 15:06:17 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-10 19:31:34 +0000
commit5ac13c23628c6ee8c3f6056f38527706b403e502 (patch)
treec8a96588eed9009037bd368bb155a0f990cd4cc3 /tests
parent37c5a96bbdeac2000c8b31d40f4786b31c39f2dd (diff)
sksl support for static ifs & switches
Bug: skia: Change-Id: Ic9e01a3a18efddb19bab26e92bfb473cad294fc1 Reviewed-on: https://skia-review.googlesource.com/16144 Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ben Wagner <benjaminwagner@google.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/SkSLErrorTest.cpp57
-rw-r--r--tests/SkSLGLSLTest.cpp118
-rw-r--r--tests/SkSLSPIRVTest.cpp42
3 files changed, 193 insertions, 24 deletions
diff --git a/tests/SkSLErrorTest.cpp b/tests/SkSLErrorTest.cpp
index d443b1844f..453a8f84c9 100644
--- a/tests/SkSLErrorTest.cpp
+++ b/tests/SkSLErrorTest.cpp
@@ -16,12 +16,7 @@ static void test_failure(skiatest::Reporter* r, const char* src, const char* err
SkSL::Program::Settings settings;
sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::Default();
settings.fCaps = caps.get();
- std::unique_ptr<SkSL::Program> program = compiler.convertProgram(SkSL::Program::kFragment_Kind,
- SkString(src), settings);
- if (program) {
- SkSL::String ignored;
- compiler.toSPIRV(*program, &ignored);
- }
+ compiler.convertProgram(SkSL::Program::kFragment_Kind, SkString(src), settings);
SkSL::String skError(error);
if (compiler.errorText() != skError) {
SkDebugf("SKSL ERROR:\n source: %s\n expected: %s received: %s", src, error,
@@ -38,8 +33,6 @@ static void test_success(skiatest::Reporter* r, const char* src) {
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(SkSL::Program::kFragment_Kind,
SkString(src), settings);
REPORTER_ASSERT(r, program);
- SkSL::String ignored;
- REPORTER_ASSERT(r, compiler.toSPIRV(*program, &ignored));
}
DEF_TEST(SkSLUndefinedSymbol, r) {
@@ -405,15 +398,6 @@ DEF_TEST(SkSLBadCap, r) {
"error: 1: unknown capability flag 'bugFreeDriver'\n1 error\n");
}
-DEF_TEST(SkSLBadOffset, r) {
- test_failure(r,
- "struct Bad { layout (offset = 5) int x; } bad; void main() { bad.x = 5; }",
- "error: 1: offset of field 'x' must be a multiple of 4\n1 error\n");
- test_failure(r,
- "struct Bad { int x; layout (offset = 0) int y; } bad; void main() { bad.x = 5; }",
- "error: 1: offset of field 'y' must be at least 4\n1 error\n");
-}
-
DEF_TEST(SkSLDivByZero, r) {
test_failure(r,
"int x = 1 / 0;",
@@ -466,4 +450,43 @@ DEF_TEST(SkSLFieldAfterRuntimeArray, r) {
"array\n1 error\n");
}
+DEF_TEST(SkSLStaticIf, r) {
+ test_success(r,
+ "void main() { float x = 5; float y = 10;"
+ "@if (x < y) { sk_FragColor = vec4(1); } }");
+ test_failure(r,
+ "void main() { float x = sqrt(25); float y = 10;"
+ "@if (x < y) { sk_FragColor = vec4(1); } }",
+ "error: 1: static if has non-static test\n1 error\n");
+}
+
+DEF_TEST(SkSLStaticSwitch, r) {
+ test_success(r,
+ "void main() {"
+ "int x = 1;"
+ "@switch (x) {"
+ "case 1: sk_FragColor = vec4(1); break;"
+ "default: sk_FragColor = vec4(0);"
+ "}"
+ "}");
+ test_failure(r,
+ "void main() {"
+ "int x = int(sqrt(1));"
+ "@switch (x) {"
+ "case 1: sk_FragColor = vec4(1); break;"
+ "default: sk_FragColor = vec4(0);"
+ "}"
+ "}",
+ "error: 1: static switch has non-static test\n1 error\n");
+ test_failure(r,
+ "void main() {"
+ "int x = 1;"
+ "@switch (x) {"
+ "case 1: sk_FragColor = vec4(1); if (sqrt(0) < sqrt(1)) break;"
+ "default: sk_FragColor = vec4(0);"
+ "}"
+ "}",
+ "error: 1: static switch contains non-static conditional break\n1 error\n");
+}
+
#endif
diff --git a/tests/SkSLGLSLTest.cpp b/tests/SkSLGLSLTest.cpp
index 32fd668dda..ff1d5f5972 100644
--- a/tests/SkSLGLSLTest.cpp
+++ b/tests/SkSLGLSLTest.cpp
@@ -831,7 +831,7 @@ DEF_TEST(SkSLMatFolding, r) {
"}\n");
}
-DEF_TEST(SkSLStaticIf, r) {
+DEF_TEST(SkSLConstantIf, r) {
test(r,
"void main() {"
"int x;"
@@ -1067,10 +1067,11 @@ DEF_TEST(SkSLGeometry, r) {
}
DEF_TEST(SkSLSwitch, r) {
+ // basic "does a switch even work" test
test(r,
"void main() {"
" float x;"
- " switch (1) {"
+ " switch (int(sqrt(1))) {"
" case 0:"
" x = 0.0;"
" break;"
@@ -1087,7 +1088,7 @@ DEF_TEST(SkSLSwitch, r) {
"out vec4 sk_FragColor;\n"
"void main() {\n"
" float x;\n"
- " switch (1) {\n"
+ " switch (int(sqrt(1.0))) {\n"
" case 0:\n"
" x = 0.0;\n"
" break;\n"
@@ -1099,10 +1100,11 @@ DEF_TEST(SkSLSwitch, r) {
" }\n"
" sk_FragColor = vec4(x);\n"
"}\n");
+ // dead code inside of switch
test(r,
"void main() {"
" float x;"
- " switch (2) {"
+ " switch (int(sqrt(2))) {"
" case 0:"
" x = 0.0;"
" case 1:"
@@ -1116,7 +1118,7 @@ DEF_TEST(SkSLSwitch, r) {
"#version 400\n"
"out vec4 sk_FragColor;\n"
"void main() {\n"
- " switch (2) {\n"
+ " switch (int(sqrt(2.0))) {\n"
" case 0:\n"
" ;\n"
" case 1:\n"
@@ -1126,12 +1128,113 @@ DEF_TEST(SkSLSwitch, r) {
" }\n"
" sk_FragColor = vec4(2.0);\n"
"}\n");
+ // non-static test w/ fallthrough
+ test(r,
+ "void main() {"
+ " float x = 0.0;"
+ " switch (int(sqrt(3))) {"
+ " case 0:"
+ " x = 0.0;"
+ " case 1:"
+ " x = 1.0;"
+ " }"
+ " sk_FragColor = vec4(x);"
+ "}",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " float x = 0.0;\n"
+ " switch (int(sqrt(3.0))) {\n"
+ " case 0:\n"
+ " x = 0.0;\n"
+ " case 1:\n"
+ " x = 1.0;\n"
+ " }\n"
+ " sk_FragColor = vec4(x);\n"
+ "}\n");
+ // static test w/ fallthrough
+ test(r,
+ "void main() {"
+ " float x = 0.0;"
+ " switch (0) {"
+ " case 0:"
+ " x = 0.0;"
+ " case 1:"
+ " x = 1.0;"
+ " }"
+ " sk_FragColor = vec4(x);"
+ "}",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " sk_FragColor = vec4(1.0);\n"
+ "}\n");
+ // static test w/ fallthrough, different entry point
+ test(r,
+ "void main() {"
+ " float x = 0.0;"
+ " switch (1) {"
+ " case 0:"
+ " x = 0.0;"
+ " case 1:"
+ " x = 1.0;"
+ " }"
+ " sk_FragColor = vec4(x);"
+ "}",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " sk_FragColor = vec4(1.0);\n"
+ "}\n");
+ // static test w/ break
+ test(r,
+ "void main() {"
+ " float x = 0.0;"
+ " switch (0) {"
+ " case 0:"
+ " x = 0.0;"
+ " break;"
+ " case 1:"
+ " x = 1.0;"
+ " }"
+ " sk_FragColor = vec4(x);"
+ "}",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " sk_FragColor = vec4(0.0);\n"
+ "}\n");
+ // static test w/ static conditional break
+ test(r,
+ "void main() {"
+ " float x = 0.0;"
+ " switch (0) {"
+ " case 0:"
+ " x = 0.0;"
+ " if (x < 1) break;"
+ " case 1:"
+ " x = 1.0;"
+ " }"
+ " sk_FragColor = vec4(x);"
+ "}",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " sk_FragColor = vec4(0.0);\n"
+ "}\n");
+ // static test w/ non-static conditional break
test(r,
"void main() {"
" float x = 0.0;"
- " switch (3) {"
+ " switch (0) {"
" case 0:"
" x = 0.0;"
+ " if (x < sqrt(1)) break;"
" case 1:"
" x = 1.0;"
" }"
@@ -1142,9 +1245,10 @@ DEF_TEST(SkSLSwitch, r) {
"out vec4 sk_FragColor;\n"
"void main() {\n"
" float x = 0.0;\n"
- " switch (3) {\n"
+ " switch (0) {\n"
" case 0:\n"
" x = 0.0;\n"
+ " if (0.0 < sqrt(1.0)) break;\n"
" case 1:\n"
" x = 1.0;\n"
" }\n"
diff --git a/tests/SkSLSPIRVTest.cpp b/tests/SkSLSPIRVTest.cpp
new file mode 100644
index 0000000000..4d5457f339
--- /dev/null
+++ b/tests/SkSLSPIRVTest.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkSLCompiler.h"
+
+#include "Test.h"
+
+#if SK_SUPPORT_GPU
+
+static void test_failure(skiatest::Reporter* r, const char* src, const char* error) {
+ SkSL::Compiler compiler;
+ SkSL::Program::Settings settings;
+ sk_sp<GrShaderCaps> caps = SkSL::ShaderCapsFactory::Default();
+ settings.fCaps = caps.get();
+ std::unique_ptr<SkSL::Program> program = compiler.convertProgram(SkSL::Program::kFragment_Kind,
+ SkString(src), settings);
+ if (program) {
+ SkSL::String ignored;
+ compiler.toSPIRV(*program, &ignored);
+ }
+ SkSL::String skError(error);
+ if (compiler.errorText() != skError) {
+ SkDebugf("SKSL ERROR:\n source: %s\n expected: %s received: %s", src, error,
+ compiler.errorText().c_str());
+ }
+ REPORTER_ASSERT(r, compiler.errorText() == skError);
+}
+
+DEF_TEST(SkSLBadOffset, r) {
+ test_failure(r,
+ "struct Bad { layout (offset = 5) int x; } bad; void main() { bad.x = 5; }",
+ "error: 1: offset of field 'x' must be a multiple of 4\n1 error\n");
+ test_failure(r,
+ "struct Bad { int x; layout (offset = 0) int y; } bad; void main() { bad.x = 5; }",
+ "error: 1: offset of field 'y' must be at least 4\n1 error\n");
+}
+
+#endif