diff options
author | 2014-05-29 19:09:52 +0000 | |
---|---|---|
committer | 2014-05-29 19:09:52 +0000 | |
commit | 0365261597f73c049f2d8c117c8c87ef2fb2c9ab (patch) | |
tree | 6ddba5c2bf99c91b61b886b634e102418d107d36 /src/gpu/gl/GrGLProgram.cpp | |
parent | 5744bbee6fa65f9d532587b6539fa0f104dda98b (diff) |
Move all code generation from GrGLProgram to GrGLShaderBuilder
R=robertphillips@google.com
Author: bsalomon@google.com
Review URL: https://codereview.chromium.org/306663003
git-svn-id: http://skia.googlecode.com/svn/trunk@14974 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/gl/GrGLProgram.cpp')
-rw-r--r-- | src/gpu/gl/GrGLProgram.cpp | 98 |
1 files changed, 12 insertions, 86 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index efd6e4606b..c63914893d 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -47,19 +47,18 @@ GrGLProgram::GrGLProgram(GrGpuGL* gpu, fColor = GrColor_ILLEGAL; - if (fDesc.getHeader().fHasVertexCode || - !fGpu->shouldUseFixedFunctionTexturing()) { - GrGLFullShaderBuilder fullBuilder(fGpu, fUniformManager, fDesc); - if (this->genProgram(&fullBuilder, colorStages, coverageStages)) { - fUniformHandles.fViewMatrixUni = fullBuilder.getViewMatrixUniform(); - fUniformHandles.fRTAdjustmentUni = fullBuilder.getRTAdjustmentVecUniform(); - fHasVertexShader = true; - } - } else { - GrGLFragmentOnlyShaderBuilder fragmentOnlyBuilder(fGpu, fUniformManager, fDesc); - if (this->genProgram(&fragmentOnlyBuilder, colorStages, coverageStages)) { - fNumTexCoordSets = fragmentOnlyBuilder.getNumTexCoordSets(); - } + GrGLShaderBuilder::GenProgramOutput output; + + if (GrGLShaderBuilder::GenProgram(gpu, fUniformManager, desc, colorStages, coverageStages, + &output)) { + fProgramID = output.fProgramID; + fUniformHandles = output.fUniformHandles; + fColorEffects.reset(output.fColorEffects); + fCoverageEffects.reset(output.fCoverageEffects); + fHasVertexShader = output.fHasVS; + fNumTexCoordSets = output.fNumTexCoordSets; + fGpu = gpu; + this->initSamplerUniforms(); } } @@ -95,79 +94,6 @@ void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff, } } -bool GrGLProgram::genProgram(GrGLShaderBuilder* builder, - const GrEffectStage* colorStages[], - const GrEffectStage* coverageStages[]) { - SkASSERT(0 == fProgramID); - - const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); - - // incoming color to current stage being processed. - GrGLSLExpr4 inColor = builder->getInputColor(); - - fColorEffects.reset( - builder->createAndEmitEffects(colorStages, - fDesc.effectKeys(), - fDesc.numColorEffects(), - &inColor)); - - /////////////////////////////////////////////////////////////////////////// - // compute the partial coverage - GrGLSLExpr4 inCoverage = builder->getInputCoverage(); - - fCoverageEffects.reset( - builder->createAndEmitEffects(coverageStages, - fDesc.getEffectKeys() + fDesc.numColorEffects(), - fDesc.numCoverageEffects(), - &inCoverage)); - - if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutput)) { - const char* secondaryOutputName = builder->enableSecondaryOutput(); - - // default coeff to ones for kCoverage_DualSrcOutput - GrGLSLExpr4 coeff(1); - if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == header.fCoverageOutput) { - // Get (1-A) into coeff - coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inColor.a()); - } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == header.fCoverageOutput) { - // Get (1-RGBA) into coeff - coeff = GrGLSLExpr4(1) - inColor; - } - // Get coeff * coverage into modulate and then write that to the dual source output. - builder->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inCoverage).c_str()); - } - - /////////////////////////////////////////////////////////////////////////// - // combine color and coverage as frag color - - // Get "color * coverage" into fragColor - GrGLSLExpr4 fragColor = inColor * inCoverage; - // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do so. - if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutput) { - GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inCoverage; - - GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(builder->dstColor()); - - fragColor = fragColor + dstContribution; - } - builder->fsCodeAppendf("\t%s = %s;\n", builder->getColorOutputName(), fragColor.c_str()); - - if (!builder->finish(&fProgramID)) { - return false; - } - - fUniformHandles.fRTHeightUni = builder->getRTHeightUniform(); - fUniformHandles.fDstCopyTopLeftUni = builder->getDstCopyTopLeftUniform(); - fUniformHandles.fDstCopyScaleUni = builder->getDstCopyScaleUniform(); - fUniformHandles.fColorUni = builder->getColorUniform(); - fUniformHandles.fCoverageUni = builder->getCoverageUniform(); - fUniformHandles.fDstCopySamplerUni = builder->getDstCopySamplerUniform(); - // This must be called after we set fDstCopySamplerUni above. - this->initSamplerUniforms(); - - return true; -} - void GrGLProgram::initSamplerUniforms() { GL_CALL(UseProgram(fProgramID)); GrGLint texUnitIdx = 0; |