Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index c63914893d2950a0be069a25f1526d24efc0cc84..1d85b0a3278514422bd11d815c31f6d730990942 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); |
} |
} |