diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-02-09 10:15:25 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-02-09 19:29:33 +0000 |
commit | 67d64605d3421404a94c0717fdff194730579873 (patch) | |
tree | 7ffd92cae8a120704da08be7226c30b120e40d9f | |
parent | 5d4cd9ea8818f65bb4878c050dbdb9dcd48505ad (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.h | 7 | ||||
-rw-r--r-- | src/sksl/SkSLGLSLCodeGenerator.cpp | 11 | ||||
-rw-r--r-- | src/sksl/sksl_frag.include | 1 | ||||
-rw-r--r-- | src/sksl/sksl_vert.include | 3 | ||||
-rw-r--r-- | tests/SkSLGLSLTest.cpp | 18 |
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 |