| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLProgramBuilder.h" | 8 #include "GrGLProgramBuilder.h" |
| 9 #include "gl/GrGLProgram.h" | 9 #include "gl/GrGLProgram.h" |
| 10 #include "gl/GrGLSLPrettyPrint.h" | 10 #include "gl/GrGLSLPrettyPrint.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 ////////////////////////////////////////////////////////////////////////////// | 47 ////////////////////////////////////////////////////////////////////////////// |
| 48 | 48 |
| 49 const int GrGLProgramBuilder::kVarsPerBlock = 8; | 49 const int GrGLProgramBuilder::kVarsPerBlock = 8; |
| 50 | 50 |
| 51 GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, G
rGLGpu* gpu) { | 51 GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, G
rGLGpu* gpu) { |
| 52 // create a builder. This will be handed off to effects so they can use it
to add | 52 // create a builder. This will be handed off to effects so they can use it
to add |
| 53 // uniforms, varyings, textures, etc | 53 // uniforms, varyings, textures, etc |
| 54 SkAutoTDelete<GrGLProgramBuilder> builder(CreateProgramBuilder(optState, gpu
)); | 54 SkAutoTDelete<GrGLProgramBuilder> builder(CreateProgramBuilder(optState, gpu
)); |
| 55 | 55 |
| 56 GrGLProgramBuilder* pb = builder.get(); | 56 GrGLProgramBuilder* pb = builder.get(); |
| 57 const GrGLProgramDescBuilder::GLKeyHeader& header = | |
| 58 GrGLProgramDescBuilder::GetHeader(pb->desc()); | |
| 59 | 57 |
| 60 // emit code to read the dst copy texture, if necessary | 58 // emit code to read the dst copy texture, if necessary |
| 61 if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey &
& | 59 if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != pb->header().fDstRea
dKey && |
| 62 !gpu->glCaps().fbFetchSupport()) { | 60 !gpu->glCaps().fbFetchSupport()) { |
| 63 pb->fFS.emitCodeToReadDstTexture(); | 61 pb->fFS.emitCodeToReadDstTexture(); |
| 64 } | 62 } |
| 65 | 63 |
| 66 // TODO: Once all stages can handle taking a float or vec4 and correctly han
dling them we can | 64 // TODO: Once all stages can handle taking a float or vec4 and correctly han
dling them we can |
| 67 // seed correctly here | 65 // seed correctly here |
| 68 GrGLSLExpr4 inputColor; | 66 GrGLSLExpr4 inputColor; |
| 69 GrGLSLExpr4 inputCoverage; | 67 GrGLSLExpr4 inputCoverage; |
| 70 | 68 |
| 71 pb->emitAndInstallProcs(&inputColor, &inputCoverage); | 69 pb->emitAndInstallProcs(&inputColor, &inputCoverage); |
| 72 | 70 |
| 73 return pb->finalize(); | 71 return pb->finalize(); |
| 74 } | 72 } |
| 75 | 73 |
| 76 GrGLProgramBuilder* GrGLProgramBuilder::CreateProgramBuilder(const GrOptDrawStat
e& optState, | 74 GrGLProgramBuilder* GrGLProgramBuilder::CreateProgramBuilder(const GrOptDrawStat
e& optState, |
| 77 GrGLGpu* gpu) { | 75 GrGLGpu* gpu) { |
| 78 const GrProgramDesc& desc = optState.programDesc(); | 76 if (GrGpu::IsPathRenderingDrawType(optState.drawType())) { |
| 79 if (GrGLProgramDescBuilder::GetHeader(desc).fUseNvpr) { | 77 SkASSERT(gpu->glCaps().pathRenderingSupport() && |
| 80 SkASSERT(gpu->glCaps().pathRenderingSupport()); | 78 !optState.getPrimitiveProcessor()->willUseGeoShader() && |
| 81 SkASSERT(!optState.hasGeometryProcessor()); | 79 optState.getPrimitiveProcessor()->numAttribs() == 0); |
| 82 return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState)); | 80 return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState)); |
| 83 } else { | 81 } else { |
| 84 return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState)); | 82 return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState)); |
| 85 } | 83 } |
| 86 } | 84 } |
| 87 | 85 |
| 88 ///////////////////////////////////////////////////////////////////////////// | 86 ///////////////////////////////////////////////////////////////////////////// |
| 89 | 87 |
| 90 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const GrOptDrawState& optSt
ate) | 88 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const GrOptDrawState& optSt
ate) |
| 91 : fVS(this) | 89 : fVS(this) |
| 92 , fGS(this) | 90 , fGS(this) |
| 93 , fFS(this, optState.programDesc().header().fFragPosKey) | 91 , fFS(this, optState.programDesc().header().fFragPosKey) |
| 94 , fOutOfStage(true) | 92 , fOutOfStage(true) |
| 95 , fStageIndex(-1) | 93 , fStageIndex(-1) |
| 96 , fGeometryProcessor(NULL) | 94 , fGeometryProcessor(NULL) |
| 97 , fXferProcessor(NULL) | 95 , fXferProcessor(NULL) |
| 98 , fOptState(optState) | 96 , fOptState(optState) |
| 99 , fDesc(optState.programDesc()) | 97 , fDesc(optState.programDesc()) |
| 100 , fGpu(gpu) | 98 , fGpu(gpu) |
| 101 , fUniforms(kVarsPerBlock) { | 99 , fUniforms(kVarsPerBlock) { |
| 102 } | 100 } |
| 103 | 101 |
| 104 void GrGLProgramBuilder::addVarying(const char* name, | 102 void GrGLProgramBuilder::addVarying(const char* name, |
| 105 GrGLVarying* varying, | 103 GrGLVarying* varying, |
| 106 GrSLPrecision fsPrecision) { | 104 GrSLPrecision fsPrecision) { |
| 107 SkASSERT(varying); | 105 SkASSERT(varying); |
| 108 if (varying->vsVarying()) { | 106 if (varying->vsVarying()) { |
| 109 fVS.addVarying(name, varying); | 107 fVS.addVarying(name, varying); |
| 110 } | 108 } |
| 111 if (fOptState.hasGeometryProcessor() && fOptState.getGeometryProcessor()->wi
llUseGeoShader()) { | 109 if (fOptState.getPrimitiveProcessor()->willUseGeoShader()) { |
| 112 fGS.addVarying(name, varying); | 110 fGS.addVarying(name, varying); |
| 113 } | 111 } |
| 114 if (varying->fsVarying()) { | 112 if (varying->fsVarying()) { |
| 115 fFS.addVarying(varying, fsPrecision); | 113 fFS.addVarying(varying, fsPrecision); |
| 116 } | 114 } |
| 117 } | 115 } |
| 118 | 116 |
| 119 void GrGLProgramBuilder::addPassThroughAttribute(const GrGeometryProcessor::GrAt
tribute* input, | 117 void GrGLProgramBuilder::addPassThroughAttribute(const GrPrimitiveProcessor::Att
ribute* input, |
| 120 const char* output) { | 118 const char* output) { |
| 121 GrSLType type = GrVertexAttribTypeToSLType(input->fType); | 119 GrSLType type = GrVertexAttribTypeToSLType(input->fType); |
| 122 GrGLVertToFrag v(type); | 120 GrGLVertToFrag v(type); |
| 123 this->addVarying(input->fName, &v); | 121 this->addVarying(input->fName, &v); |
| 124 fVS.codeAppendf("%s = %s;", v.vsOut(), input->fName); | 122 fVS.codeAppendf("%s = %s;", v.vsOut(), input->fName); |
| 125 fFS.codeAppendf("%s = %s;", output, v.fsIn()); | 123 fFS.codeAppendf("%s = %s;", output, v.fsIn()); |
| 126 } | 124 } |
| 127 | 125 |
| 128 void GrGLProgramBuilder::nameVariable(SkString* out, char prefix, const char* na
me) { | 126 void GrGLProgramBuilder::nameVariable(SkString* out, char prefix, const char* na
me) { |
| 129 if ('\0' == prefix) { | 127 if ('\0' == prefix) { |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 GrGLProgram* GrGLProgramBuilder::finalize() { | 389 GrGLProgram* GrGLProgramBuilder::finalize() { |
| 392 // verify we can get a program id | 390 // verify we can get a program id |
| 393 GrGLuint programID; | 391 GrGLuint programID; |
| 394 GL_CALL_RET(programID, CreateProgram()); | 392 GL_CALL_RET(programID, CreateProgram()); |
| 395 if (0 == programID) { | 393 if (0 == programID) { |
| 396 return NULL; | 394 return NULL; |
| 397 } | 395 } |
| 398 | 396 |
| 399 // compile shaders and bind attributes / uniforms | 397 // compile shaders and bind attributes / uniforms |
| 400 SkTDArray<GrGLuint> shadersToDelete; | 398 SkTDArray<GrGLuint> shadersToDelete; |
| 401 if (!(GrGLProgramDescBuilder::GetHeader(fDesc).fUseNvpr && | 399 |
| 402 fGpu->glPathRendering()->texturingMode() == | 400 // Legacy nvpr will not compile with a vertex shader, but newer nvpr require
s a dummy vertex |
| 403 GrGLPathRendering::FixedFunction_TexturingMode)) { | 401 // shader |
| 402 bool useNvpr = GrGpu::IsPathRenderingDrawType(fOptState.drawType()); |
| 403 if (!(useNvpr && fGpu->glCaps().nvprSupport() == GrGLCaps::kLegacy_NvprSuppo
rt)) { |
| 404 if (!fVS.compileAndAttachShaders(programID, &shadersToDelete)) { | 404 if (!fVS.compileAndAttachShaders(programID, &shadersToDelete)) { |
| 405 this->cleanupProgram(programID, shadersToDelete); | 405 this->cleanupProgram(programID, shadersToDelete); |
| 406 return NULL; | 406 return NULL; |
| 407 } | 407 } |
| 408 | 408 |
| 409 // Non fixed function NVPR actually requires a vertex shader to compile | 409 // Non fixed function NVPR actually requires a vertex shader to compile |
| 410 if (fOptState.hasGeometryProcessor()) { | 410 if (!useNvpr) { |
| 411 fVS.bindVertexAttributes(programID); | 411 fVS.bindVertexAttributes(programID); |
| 412 } | 412 } |
| 413 } | 413 } |
| 414 | 414 |
| 415 if (!fFS.compileAndAttachShaders(programID, &shadersToDelete)) { | 415 if (!fFS.compileAndAttachShaders(programID, &shadersToDelete)) { |
| 416 this->cleanupProgram(programID, shadersToDelete); | 416 this->cleanupProgram(programID, shadersToDelete); |
| 417 return NULL; | 417 return NULL; |
| 418 } | 418 } |
| 419 | 419 |
| 420 bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation
!= NULL; | 420 bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation
!= NULL; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 } | 498 } |
| 499 | 499 |
| 500 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 500 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 501 | 501 |
| 502 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { | 502 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { |
| 503 int numProcs = fProcs.count(); | 503 int numProcs = fProcs.count(); |
| 504 for (int e = 0; e < numProcs; ++e) { | 504 for (int e = 0; e < numProcs; ++e) { |
| 505 SkDELETE(fProcs[e]); | 505 SkDELETE(fProcs[e]); |
| 506 } | 506 } |
| 507 } | 507 } |
| OLD | NEW |