diff options
author | 2016-12-12 15:33:30 -0500 | |
---|---|---|
committer | 2016-12-13 14:28:53 +0000 | |
commit | 941e7e2c9567ab1d8a3b2d1b0e3db71ee5eb75c9 (patch) | |
tree | 7f0ad6c5b2c3772d2c83be545fe04c53044746bd /src/gpu/gl | |
parent | 3dc73f3596d93a89f71b0c7e96d5d63dafeaf378 (diff) |
re-land of added sk_FragCoord support to skslc
BUG=skia:
Change-Id: Ifac1aa39839058787ad1794200c3dbb93c147a69
Reviewed-on: https://skia-review.googlesource.com/5850
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/gpu/gl')
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 39 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLProgramBuilder.cpp | 25 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLProgramBuilder.h | 5 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderStringBuilder.cpp | 19 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderStringBuilder.h | 4 |
5 files changed, 68 insertions, 24 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 20609af39a..bbbcf4c671 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -27,6 +27,7 @@ #include "SkMipMap.h" #include "SkPixmap.h" #include "SkStrokeRec.h" +#include "SkSLCompiler.h" #include "SkTemplates.h" #include "SkTypes.h" #include "../private/GrGLSL.h" @@ -399,13 +400,20 @@ bool GrGLGpu::createPLSSetupProgram() { str = vshaderTxt.c_str(); length = SkToInt(vshaderTxt.size()); + SkSL::Program::Settings settings; + settings.fCaps = shaderCaps; + SkSL::Program::Inputs inputs; GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fPLSSetupProgram.fProgram, - GR_GL_VERTEX_SHADER, &str, &length, 1, &fStats); + GR_GL_VERTEX_SHADER, &str, &length, 1, &fStats, + settings, &inputs); + SkASSERT(inputs.isEmpty()); str = fshaderTxt.c_str(); length = SkToInt(fshaderTxt.size()); GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fPLSSetupProgram.fProgram, - GR_GL_FRAGMENT_SHADER, &str, &length, 1, &fStats); + GR_GL_FRAGMENT_SHADER, &str, &length, 1, &fStats, + settings, &inputs); + SkASSERT(inputs.isEmpty()); GL_CALL(LinkProgram(fPLSSetupProgram.fProgram)); @@ -3855,15 +3863,20 @@ bool GrGLGpu::createCopyProgram(GrTexture* srcTex) { str = vshaderTxt.c_str(); length = SkToInt(vshaderTxt.size()); + SkSL::Program::Settings settings; + settings.fCaps = shaderCaps; + SkSL::Program::Inputs inputs; GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms[progIdx].fProgram, GR_GL_VERTEX_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); str = fshaderTxt.c_str(); length = SkToInt(fshaderTxt.size()); GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms[progIdx].fProgram, GR_GL_FRAGMENT_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); GL_CALL(LinkProgram(fCopyPrograms[progIdx].fProgram)); @@ -4008,15 +4021,20 @@ bool GrGLGpu::createMipmapProgram(int progIdx) { str = vshaderTxt.c_str(); length = SkToInt(vshaderTxt.size()); + SkSL::Program::Settings settings; + settings.fCaps = shaderCaps; + SkSL::Program::Inputs inputs; GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fMipmapPrograms[progIdx].fProgram, GR_GL_VERTEX_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); str = fshaderTxt.c_str(); length = SkToInt(fshaderTxt.size()); GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fMipmapPrograms[progIdx].fProgram, GR_GL_FRAGMENT_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); GL_CALL(LinkProgram(fMipmapPrograms[progIdx].fProgram)); @@ -4097,15 +4115,20 @@ bool GrGLGpu::createWireRectProgram() { str = vshaderTxt.c_str(); length = SkToInt(vshaderTxt.size()); + SkSL::Program::Settings settings; + settings.fCaps = this->caps()->shaderCaps(); + SkSL::Program::Inputs inputs; GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fWireRectProgram.fProgram, GR_GL_VERTEX_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); str = fshaderTxt.c_str(); length = SkToInt(fshaderTxt.size()); GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fWireRectProgram.fProgram, GR_GL_FRAGMENT_SHADER, &str, &length, 1, - &fStats); + &fStats, settings, &inputs); + SkASSERT(inputs.isEmpty()); GL_CALL(LinkProgram(fWireRectProgram.fProgram)); diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp index cc29022456..045593ff42 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp @@ -69,7 +69,9 @@ const GrCaps* GrGLProgramBuilder::caps() const { bool GrGLProgramBuilder::compileAndAttachShaders(GrGLSLShaderBuilder& shader, GrGLuint programId, GrGLenum type, - SkTDArray<GrGLuint>* shaderIds) { + SkTDArray<GrGLuint>* shaderIds, + const SkSL::Program::Settings& settings, + SkSL::Program::Inputs* outInputs) { GrGLGpu* gpu = this->gpu(); GrGLuint shaderId = GrGLCompileAndAttachShader(gpu->glContext(), programId, @@ -77,7 +79,9 @@ bool GrGLProgramBuilder::compileAndAttachShaders(GrGLSLShaderBuilder& shader, shader.fCompilerStrings.begin(), shader.fCompilerStringLengths.begin(), shader.fCompilerStrings.count(), - gpu->stats()); + gpu->stats(), + settings, + outInputs); if (!shaderId) { return false; @@ -100,8 +104,13 @@ GrGLProgram* GrGLProgramBuilder::finalize() { this->finalizeShaders(); // compile shaders and bind attributes / uniforms + SkSL::Program::Settings settings; + settings.fCaps = this->gpu()->glCaps().shaderCaps(); + settings.fFlipY = this->pipeline().getRenderTarget()->origin() != kTopLeft_GrSurfaceOrigin; + SkSL::Program::Inputs inputs; SkTDArray<GrGLuint> shadersToDelete; - if (!this->compileAndAttachShaders(fVS, programID, GR_GL_VERTEX_SHADER, &shadersToDelete)) { + if (!this->compileAndAttachShaders(fVS, programID, GR_GL_VERTEX_SHADER, &shadersToDelete, + settings, &inputs)) { this->cleanupProgram(programID, shadersToDelete); return nullptr; } @@ -117,16 +126,22 @@ GrGLProgram* GrGLProgramBuilder::finalize() { } if (primProc.willUseGeoShader() && - !this->compileAndAttachShaders(fGS, programID, GR_GL_GEOMETRY_SHADER, &shadersToDelete)) { + !this->compileAndAttachShaders(fGS, programID, GR_GL_GEOMETRY_SHADER, &shadersToDelete, + settings, &inputs)) { this->cleanupProgram(programID, shadersToDelete); return nullptr; } - if (!this->compileAndAttachShaders(fFS, programID, GR_GL_FRAGMENT_SHADER, &shadersToDelete)) { + if (!this->compileAndAttachShaders(fFS, programID, GR_GL_FRAGMENT_SHADER, &shadersToDelete, + settings, &inputs)) { this->cleanupProgram(programID, shadersToDelete); return nullptr; } + if (inputs.fRTHeight) { + this->addRTHeightUniform(SKSL_RTHEIGHT_NAME); + } + this->bindProgramResourceLocations(programID); GL_CALL(LinkProgram(programID)); diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h index a88f278b93..84d6d91a57 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.h +++ b/src/gpu/gl/builders/GrGLProgramBuilder.h @@ -14,6 +14,7 @@ #include "gl/GrGLVaryingHandler.h" #include "glsl/GrGLSLProgramBuilder.h" #include "glsl/GrGLSLProgramDataManager.h" +#include "ir/SkSLProgram.h" class GrFragmentProcessor; class GrGLContextInfo; @@ -46,7 +47,9 @@ private: bool compileAndAttachShaders(GrGLSLShaderBuilder& shader, GrGLuint programId, GrGLenum type, - SkTDArray<GrGLuint>* shaderIds); + SkTDArray<GrGLuint>* shaderIds, + const SkSL::Program::Settings& settings, + SkSL::Program::Inputs* outInputs); GrGLProgram* finalize(); void bindProgramResourceLocations(GrGLuint programID); bool checkLinkStatus(GrGLuint programID); diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp index bd4921b650..df44edd07e 100644 --- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp +++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp @@ -44,7 +44,9 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, const char** strings, int* lengths, int count, - GrGpu::Stats* stats) { + GrGpu::Stats* stats, + const SkSL::Program::Settings& settings, + SkSL::Program::Inputs* outInputs) { const GrGLInterface* gli = glCtx.interface(); GrGLuint shaderId; @@ -65,21 +67,20 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, SkString glsl; if (type == GR_GL_VERTEX_SHADER || type == GR_GL_FRAGMENT_SHADER) { SkSL::Compiler& compiler = *glCtx.compiler(); - SkDEBUGCODE(bool result = )compiler.toGLSL(type == GR_GL_VERTEX_SHADER - ? SkSL::Program::kVertex_Kind + std::unique_ptr<SkSL::Program> program; + program = compiler.convertProgram( + type == GR_GL_VERTEX_SHADER ? SkSL::Program::kVertex_Kind : SkSL::Program::kFragment_Kind, - sksl, - *glCtx.caps()->shaderCaps(), - &glsl); -#ifdef SK_DEBUG - if (!result) { + sksl, + settings); + if (!program || !compiler.toGLSL(*program, &glsl)) { SkDebugf("SKSL compilation error\n----------------------\n"); SkDebugf("SKSL:\n"); dump_string(sksl); SkDebugf("\nErrors:\n%s\n", compiler.errorText().c_str()); SkDEBUGFAIL("SKSL compilation failed!\n"); } -#endif + *outInputs = program->fInputs; } else { // TODO: geometry shader support in sksl. SkASSERT(type == GR_GL_GEOMETRY_SHADER); diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.h b/src/gpu/gl/builders/GrGLShaderStringBuilder.h index 71fce6a95a..242fe617e0 100644 --- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h +++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h @@ -20,6 +20,8 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, const char** strings, int* lengths, int count, - GrGpu::Stats*); + GrGpu::Stats*, + const SkSL::Program::Settings& settings, + SkSL::Program::Inputs* inputs); #endif |