| Index: src/gpu/gl/GrGLProgram.cpp
|
| diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
|
| index d49d000fe341916b9eb7d8ffaee28fcfffec180e..11efda92144ee2aa72b4668dac6a5b037d9d3c34 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 ||
|
|
|