aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-02-09 10:15:25 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-09 19:29:33 +0000
commit67d64605d3421404a94c0717fdff194730579873 (patch)
tree7ffd92cae8a120704da08be7226c30b120e40d9f
parent5d4cd9ea8818f65bb4878c050dbdb9dcd48505ad (diff)
added support for sk_ClipDistance
Change-Id: I9ea202679211b98cf98165c8609f24f9b4e14b66 Reviewed-on: https://skia-review.googlesource.com/8247 Reviewed-by: Ethan Nicholas <ethannicholas@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
-rw-r--r--src/sksl/SkSLCompiler.h7
-rw-r--r--src/sksl/SkSLGLSLCodeGenerator.cpp11
-rw-r--r--src/sksl/sksl_frag.include1
-rw-r--r--src/sksl/sksl_vert.include3
-rw-r--r--tests/SkSLGLSLTest.cpp18
5 files changed, 35 insertions, 5 deletions
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index 167f042d52..f7dcf2b5b9 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -17,9 +17,10 @@
#include "SkSLErrorReporter.h"
#include "SkSLIRGenerator.h"
-#define SK_FRAGCOLOR_BUILTIN 10001
-#define SK_FRAGCOORD_BUILTIN 15
-#define SK_VERTEXID_BUILTIN 5
+#define SK_FRAGCOLOR_BUILTIN 10001
+#define SK_FRAGCOORD_BUILTIN 15
+#define SK_VERTEXID_BUILTIN 5
+#define SK_CLIPDISTANCE_BUILTIN 3
namespace SkSL {
diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp
index 70e2e7761c..4b1eea3451 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/SkSLGLSLCodeGenerator.cpp
@@ -329,6 +329,9 @@ void GLSLCodeGenerator::writeVariableReference(const VariableReference& ref) {
case SK_VERTEXID_BUILTIN:
this->write("gl_VertexID");
break;
+ case SK_CLIPDISTANCE_BUILTIN:
+ this->write("gl_ClipDistance");
+ break;
default:
this->write(ref.fVariable.fName);
}
@@ -346,7 +349,13 @@ void GLSLCodeGenerator::writeFieldAccess(const FieldAccess& f) {
this->writeExpression(*f.fBase, kPostfix_Precedence);
this->write(".");
}
- this->write(f.fBase->fType.fields()[f.fFieldIndex].fName);
+ switch (f.fBase->fType.fields()[f.fFieldIndex].fModifiers.fLayout.fBuiltin) {
+ case SK_CLIPDISTANCE_BUILTIN:
+ this->write("gl_ClipDistance");
+ break;
+ default:
+ this->write(f.fBase->fType.fields()[f.fFieldIndex].fName);
+ }
}
void GLSLCodeGenerator::writeSwizzle(const Swizzle& swizzle) {
diff --git a/src/sksl/sksl_frag.include b/src/sksl/sksl_frag.include
index 21849866df..d65545da66 100644
--- a/src/sksl/sksl_frag.include
+++ b/src/sksl/sksl_frag.include
@@ -3,6 +3,7 @@ STRINGIFY(
// defines built-in interfaces supported by SkiaSL fragment shaders
layout(builtin=15) in vec4 sk_FragCoord;
+layout(builtin=3) float sk_ClipDistance[1];
// 9999 is a temporary value that causes us to ignore these declarations beyond
// adding them to the symbol table. This works fine in GLSL (where they do not
diff --git a/src/sksl/sksl_vert.include b/src/sksl/sksl_vert.include
index af74c0c54c..b5ccfcb2a3 100644
--- a/src/sksl/sksl_vert.include
+++ b/src/sksl/sksl_vert.include
@@ -4,7 +4,8 @@ STRINGIFY(
out gl_PerVertex {
layout(builtin=0) vec4 gl_Position;
- layout(builtin=1) float gl_PointSize;
+ layout(builtin=1) float gl_PointSize;
+ layout(builtin=3) float sk_ClipDistance[1];
};
layout(builtin=5) int sk_VertexID;
diff --git a/tests/SkSLGLSLTest.cpp b/tests/SkSLGLSLTest.cpp
index 671f6d849b..a0cc7d559e 100644
--- a/tests/SkSLGLSLTest.cpp
+++ b/tests/SkSLGLSLTest.cpp
@@ -688,4 +688,22 @@ DEF_TEST(SkSLVertexID, r) {
SkSL::Program::kVertex_Kind);
}
+DEF_TEST(SkSLClipDistance, r) {
+ test(r,
+ "void main() { sk_ClipDistance[0] = 0; }",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "void main() {\n"
+ " gl_ClipDistance[0] = 0.0;\n"
+ "}\n",
+ SkSL::Program::kVertex_Kind);
+ test(r,
+ "void main() { sk_FragColor = vec4(sk_ClipDistance[0]); }",
+ *SkSL::ShaderCapsFactory::Default(),
+ "#version 400\n"
+ "out vec4 sk_FragColor;\n"
+ "void main() {\n"
+ " sk_FragColor = vec4(gl_ClipDistance[0]);\n"
+ "}\n");
+}
#endif