diff options
Diffstat (limited to 'src/gpu/gl/GrGLProgram.cpp')
-rw-r--r-- | src/gpu/gl/GrGLProgram.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index d49d000fe3..11efda9214 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -13,6 +13,7 @@ #include "GrDrawEffect.h" #include "GrGLEffect.h" #include "GrGpuGL.h" +#include "GrGLPathRendering.h" #include "GrGLShaderVar.h" #include "GrGLSL.h" #include "SkXfermode.h" @@ -25,10 +26,12 @@ GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, const GrEffectStage* colorStages[], const GrEffectStage* coverageStages[]) { SkAutoTDelete<GrGLProgramBuilder> builder; - if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing()) { - builder.reset(SkNEW_ARGS(GrGLFullProgramBuilder, (gpu, desc))); - } else { + if (!desc.getHeader().fRequiresVertexShader && + gpu->glCaps().pathRenderingSupport() && + gpu->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunction_TexturingMode) { builder.reset(SkNEW_ARGS(GrGLFragmentOnlyProgramBuilder, (gpu, desc))); + } else { + builder.reset(SkNEW_ARGS(GrGLFullProgramBuilder, (gpu, desc))); } if (builder->genProgram(colorStages, coverageStages)) { SkASSERT(0 != builder->getProgramID()); @@ -100,7 +103,8 @@ void GrGLProgram::initSamplerUniforms() { /////////////////////////////////////////////////////////////////////////////// -void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, +void GrGLProgram::setData(GrGpu::DrawType drawType, + GrDrawState::BlendOptFlags blendOpts, const GrEffectStage* colorStages[], const GrEffectStage* coverageStages[], const GrDeviceCoordTexture* dstCopy, @@ -122,7 +126,7 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, this->setColor(drawState, color, sharedState); this->setCoverage(drawState, coverage, sharedState); - this->setMatrixAndRenderTargetHeight(drawState); + this->setMatrixAndRenderTargetHeight(drawType, drawState); if (NULL != dstCopy) { if (fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid()) { @@ -145,9 +149,8 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, SkASSERT(!fBuiltinUniformHandles.fDstCopySamplerUni.isValid()); } - fColorEffects->setData(fGpu, fProgramDataManager, colorStages); - fCoverageEffects->setData(fGpu, fProgramDataManager, coverageStages); - + fColorEffects->setData(fGpu, drawType,fProgramDataManager, colorStages); + fCoverageEffects->setData(fGpu, drawType,fProgramDataManager, coverageStages); // PathTexGen state applies to the the fixed function vertex shader. For // custom shaders, it's ignored, so we don't need to change the texgen @@ -231,7 +234,8 @@ void GrGLProgram::setCoverage(const GrDrawState& drawState, } } -void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { +void GrGLProgram::setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType, + const GrDrawState& drawState) { const GrRenderTarget* rt = drawState.getRenderTarget(); SkISize size; size.set(rt->width(), rt->height()); @@ -243,9 +247,7 @@ void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { SkIntToScalar(size.fHeight)); } - if (!fHasVertexShader) { - SkASSERT(!fBuiltinUniformHandles.fViewMatrixUni.isValid()); - SkASSERT(!fBuiltinUniformHandles.fRTAdjustmentUni.isValid()); + if (GrGpu::IsPathRenderingDrawType(drawType)) { fGpu->glPathRendering()->setProjectionMatrix(drawState.getViewMatrix(), size, rt->origin()); } else if (fMatrixState.fRenderTargetOrigin != rt->origin() || fMatrixState.fRenderTargetSize != size || |