| Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| index daa0b6ba064205fccc2f89605d07f35bb6828841..bbae5921572c28ee6699020e511adae534ef51d6 100644
|
| --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| @@ -37,24 +37,17 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, G
|
| const GrGLProgramDescBuilder::GLKeyHeader& header = GrGLProgramDescBuilder::GetHeader(pb->desc());
|
|
|
| // emit code to read the dst copy texture, if necessary
|
| - if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey
|
| - && !gpu->glCaps().fbFetchSupport()) {
|
| + if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey &&
|
| + !gpu->glCaps().fbFetchSupport()) {
|
| pb->fFS.emitCodeToReadDstTexture();
|
| }
|
|
|
| - // get the initial color and coverage to feed into the first effect in each effect chain
|
| - GrGLSLExpr4 inputColor;
|
| - GrGLSLExpr1 inputCoverage;
|
| - pb->setupUniformColorAndCoverageIfNeeded(&inputColor, &inputCoverage);
|
| -
|
| // TODO: Once all stages can handle taking a float or vec4 and correctly handling them we can
|
| - // remove this cast to a vec4.
|
| - GrGLSLExpr4 inputCoverageVec4;
|
| - if (inputCoverage.isValid()) {
|
| - inputCoverageVec4 = GrGLSLExpr4::VectorCast(inputCoverage);
|
| - }
|
| + // seed correctly here
|
| + GrGLSLExpr4 inputColor;
|
| + GrGLSLExpr4 inputCoverage;
|
|
|
| - pb->emitAndInstallProcs(&inputColor, &inputCoverageVec4);
|
| + pb->emitAndInstallProcs(&inputColor, &inputCoverage);
|
|
|
| return pb->finalize();
|
| }
|
| @@ -65,8 +58,6 @@ GrGLProgramBuilder* GrGLProgramBuilder::CreateProgramBuilder(const GrOptDrawStat
|
| const GrProgramDesc& desc = optState.programDesc();
|
| if (GrGLProgramDescBuilder::GetHeader(desc).fUseNvpr) {
|
| SkASSERT(gpu->glCaps().pathRenderingSupport());
|
| - SkASSERT(GrProgramDesc::kAttribute_ColorInput != desc.header().fColorInput);
|
| - SkASSERT(GrProgramDesc::kAttribute_ColorInput != desc.header().fCoverageInput);
|
| SkASSERT(!hasGeometryProcessor);
|
| if (gpu->glPathRendering()->texturingMode() ==
|
| GrGLPathRendering::FixedFunction_TexturingMode) {
|
| @@ -185,36 +176,10 @@ const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const {
|
| return fGpu->ctxInfo();
|
| }
|
|
|
| -void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor,
|
| - GrGLSLExpr1* inputCoverage) {
|
| - const GrProgramDesc::KeyHeader& header = this->header();
|
| - if (GrProgramDesc::kUniform_ColorInput == header.fColorInput) {
|
| - const char* name;
|
| - fUniformHandles.fColorUni =
|
| - this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "Color", &name);
|
| - *inputColor = GrGLSLExpr4(name);
|
| - } else if (GrProgramDesc::kAllOnes_ColorInput == header.fColorInput) {
|
| - *inputColor = GrGLSLExpr4(1);
|
| - }
|
| - if (GrProgramDesc::kUniform_ColorInput == header.fCoverageInput) {
|
| - const char* name;
|
| - fUniformHandles.fCoverageUni =
|
| - this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "Coverage",&name);
|
| - *inputCoverage = GrGLSLExpr1(name);
|
| - } else if (GrProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) {
|
| - *inputCoverage = GrGLSLExpr1(1);
|
| - }
|
| -}
|
| -
|
| void GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage) {
|
| if (fOptState.hasGeometryProcessor()) {
|
| fVS.setupUniformViewMatrix();
|
|
|
| - const GrProgramDesc::KeyHeader& header = this->header();
|
| fVS.codeAppend("gl_PointSize = 1.0;");
|
|
|
| // Setup position
|
| @@ -227,25 +192,11 @@ void GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr
|
|
|
| const GrGeometryProcessor& gp = *fOptState.getGeometryProcessor();
|
| fVS.emitAttributes(gp);
|
| - GrGLSLExpr4 outputColor;
|
| - GrGLSLExpr4 outputCoverage;
|
| - this->emitAndInstallProc(gp, &outputColor, &outputCoverage);
|
| -
|
| - // We may override color and coverage here if we have unform color or coverage. This is
|
| - // obviously not ideal.
|
| - // TODO lets the GP itself do the override
|
| - if (GrProgramDesc::kAttribute_ColorInput == header.fColorInput) {
|
| - *inputColor = outputColor;
|
| - }
|
| -
|
| - // We may have uniform coverage, if so we need to multiply the GPs output by the uniform
|
| - // coverage
|
| - if (GrProgramDesc::kUniform_ColorInput == header.fCoverageInput) {
|
| - fFS.codeAppendf("%s *= %s;", outputCoverage.c_str(), inputCoverage->c_str());
|
| - }
|
| - *inputCoverage = outputCoverage;
|
| }
|
|
|
| + const GrPrimitiveProcessor& primProc = *fOptState.getPrimitiveProcessor();
|
| + this->emitAndInstallProc(primProc, inputColor, inputCoverage);
|
| +
|
| fFragmentProcessors.reset(SkNEW(GrGLInstalledFragProcs));
|
| int numProcs = fOptState.numFragmentStages();
|
| this->emitAndInstallFragProcs(0, fOptState.numColorStages(), inputColor);
|
| @@ -303,7 +254,7 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrPendingFragmentStage& proc,
|
| fFS.codeAppend("}");
|
| }
|
|
|
| -void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& proc,
|
| +void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& proc,
|
| GrGLSLExpr4* outputColor,
|
| GrGLSLExpr4* outputCoverage) {
|
| // Program builders have a bit of state we need to clear with each effect
|
| @@ -344,7 +295,7 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrPendingFragmentStage& fs,
|
| fFragmentProcessors->fProcs.push_back(ifp);
|
| }
|
|
|
| -void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp,
|
| +void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp,
|
| const char* outColor,
|
| const char* outCoverage) {
|
| SkASSERT(!fGeometryProcessor);
|
| @@ -403,7 +354,7 @@ void GrGLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp,
|
| fFS.codeAppend("}");
|
| }
|
|
|
| -void GrGLProgramBuilder::verify(const GrGeometryProcessor& gp) {
|
| +void GrGLProgramBuilder::verify(const GrPrimitiveProcessor& gp) {
|
| SkASSERT(fFS.hasReadFragmentPosition() == gp.willReadFragmentPosition());
|
| }
|
|
|
| @@ -489,11 +440,6 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
|
|
|
| // compile shaders and bind attributes / uniforms
|
| SkTDArray<GrGLuint> shadersToDelete;
|
| - if (!fFS.compileAndAttachShaders(programID, &shadersToDelete)) {
|
| - this->cleanupProgram(programID, shadersToDelete);
|
| - return NULL;
|
| - }
|
| -
|
| if (!(GrGLProgramDescBuilder::GetHeader(fDesc).fUseNvpr &&
|
| fGpu->glPathRendering()->texturingMode() ==
|
| GrGLPathRendering::FixedFunction_TexturingMode)) {
|
| @@ -507,6 +453,12 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
|
| fVS.bindVertexAttributes(programID);
|
| }
|
| }
|
| +
|
| + if (!fFS.compileAndAttachShaders(programID, &shadersToDelete)) {
|
| + this->cleanupProgram(programID, shadersToDelete);
|
| + return NULL;
|
| + }
|
| +
|
| bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
|
| if (usingBindUniform) {
|
| this->bindUniformLocations(programID);
|
|
|