diff options
author | 2014-05-29 21:29:51 +0000 | |
---|---|---|
committer | 2014-05-29 21:29:51 +0000 | |
commit | 6eac42e3ab68b085117d7f91621276a722b5a3a7 (patch) | |
tree | 0f477cafdc2581a70fab4a8baf4b122ae72ef782 /src/gpu/gl/GrGLProgram.cpp | |
parent | d0f824cfbd8951bb948b19d7ff5dce028ce557a5 (diff) |
Incremental refactoring of GrGLProgram and GrGLShaderBuilder
R=robertphillips@google.com
Author: bsalomon@google.com
Review URL: https://codereview.chromium.org/302663006
git-svn-id: http://skia.googlecode.com/svn/trunk@14980 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/gl/GrGLProgram.cpp')
-rw-r--r-- | src/gpu/gl/GrGLProgram.cpp | 85 |
1 files changed, 38 insertions, 47 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index c63914893d..1d85b0a327 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -24,42 +24,33 @@ GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, const GrGLProgramDesc& desc, const GrEffectStage* colorStages[], const GrEffectStage* coverageStages[]) { - GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gpu, desc, colorStages, coverageStages)); - if (!program->succeeded()) { - delete program; - program = NULL; + GrGLShaderBuilder::GenProgramOutput output; + SkAutoTUnref<GrGLUniformManager> uman(SkNEW_ARGS(GrGLUniformManager, (gpu))); + if (GrGLShaderBuilder::GenProgram(gpu, uman, desc, colorStages, coverageStages, + &output)) { + SkASSERT(0 != output.fProgramID); + return SkNEW_ARGS(GrGLProgram, (gpu, desc, uman, output)); } - return program; + return NULL; } GrGLProgram::GrGLProgram(GrGpuGL* gpu, const GrGLProgramDesc& desc, - const GrEffectStage* colorStages[], - const GrEffectStage* coverageStages[]) -: fGpu(gpu) -, fUniformManager(gpu) -, fHasVertexShader(false) -, fNumTexCoordSets(0) { - fDesc = desc; - fProgramID = 0; - - fDstCopyTexUnit = -1; - - fColor = GrColor_ILLEGAL; - - 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(); - } + GrGLUniformManager* uman, + const GrGLShaderBuilder::GenProgramOutput& builderOutput) + : fProgramID(builderOutput.fProgramID) + , fColor(GrColor_ILLEGAL) + , fCoverage(GrColor_ILLEGAL) + , fDstCopyTexUnit(-1) + , fColorEffects(builderOutput.fColorEffects) + , fCoverageEffects(builderOutput.fCoverageEffects) + , fDesc(desc) + , fGpu(gpu) + , fUniformManager(SkRef(uman)) + , fUniformHandles(builderOutput.fUniformHandles) + , fHasVertexShader(builderOutput.fHasVS) + , fNumTexCoordSets(builderOutput.fNumTexCoordSets) { + this->initSamplerUniforms(); } GrGLProgram::~GrGLProgram() { @@ -98,11 +89,11 @@ void GrGLProgram::initSamplerUniforms() { GL_CALL(UseProgram(fProgramID)); GrGLint texUnitIdx = 0; if (fUniformHandles.fDstCopySamplerUni.isValid()) { - fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx); + fUniformManager->setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx); fDstCopyTexUnit = texUnitIdx++; } - fColorEffects->initSamplers(fUniformManager, &texUnitIdx); - fCoverageEffects->initSamplers(fUniformManager, &texUnitIdx); + fColorEffects->initSamplers(*fUniformManager, &texUnitIdx); + fCoverageEffects->initSamplers(*fUniformManager, &texUnitIdx); } /////////////////////////////////////////////////////////////////////////////// @@ -133,12 +124,12 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, if (NULL != dstCopy) { if (fUniformHandles.fDstCopyTopLeftUni.isValid()) { - fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, - static_cast<GrGLfloat>(dstCopy->offset().fX), - static_cast<GrGLfloat>(dstCopy->offset().fY)); - fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, - 1.f / dstCopy->texture()->width(), - 1.f / dstCopy->texture()->height()); + fUniformManager->set2f(fUniformHandles.fDstCopyTopLeftUni, + static_cast<GrGLfloat>(dstCopy->offset().fX), + static_cast<GrGLfloat>(dstCopy->offset().fY)); + fUniformManager->set2f(fUniformHandles.fDstCopyScaleUni, + 1.f / dstCopy->texture()->width(), + 1.f / dstCopy->texture()->height()); GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()); static GrTextureParams kParams; // the default is clamp, nearest filtering. fGpu->bindTexture(fDstCopyTexUnit, kParams, texture); @@ -152,8 +143,8 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid()); } - fColorEffects->setData(fGpu, fUniformManager, colorStages); - fCoverageEffects->setData(fGpu, fUniformManager, coverageStages); + fColorEffects->setData(fGpu, *fUniformManager, colorStages); + fCoverageEffects->setData(fGpu, *fUniformManager, coverageStages); // PathTexGen state applies to the the fixed function vertex shader. For @@ -187,7 +178,7 @@ void GrGLProgram::setColor(const GrDrawState& drawState, // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(color, c); - fUniformManager.set4fv(fUniformHandles.fColorUni, 1, c); + fUniformManager->set4fv(fUniformHandles.fColorUni, 1, c); fColor = color; } sharedState->fConstAttribColorIndex = -1; @@ -226,7 +217,7 @@ void GrGLProgram::setCoverage(const GrDrawState& drawState, // OpenGL ES doesn't support unsigned byte varieties of glUniform GrGLfloat c[4]; GrColorToRGBAFloat(coverage, c); - fUniformManager.set4fv(fUniformHandles.fCoverageUni, 1, c); + fUniformManager->set4fv(fUniformHandles.fCoverageUni, 1, c); fCoverage = coverage; } sharedState->fConstAttribCoverageIndex = -1; @@ -251,7 +242,7 @@ void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { // Load the RT height uniform if it is needed to y-flip gl_FragCoord. if (fUniformHandles.fRTHeightUni.isValid() && fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { - fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.fHeight)); + fUniformManager->set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.fHeight)); } if (!fHasVertexShader) { @@ -269,10 +260,10 @@ void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { GrGLfloat viewMatrix[3 * 3]; fMatrixState.getGLMatrix<3>(viewMatrix); - fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix); + fUniformManager->setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix); GrGLfloat rtAdjustmentVec[4]; fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); - fUniformManager.set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec); + fUniformManager->set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec); } } |