| Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| index 8fc60201211e0a85c7189dfd717bca5ea7b9657f..62032f89c662b3c82c9f98c64fba6d5be41719ad 100644
|
| --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| @@ -57,9 +57,11 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState,
|
| bool hasVertexShader = !(header.fUseNvpr &&
|
| gpu->glPathRendering()->texturingMode() ==
|
| GrGLPathRendering::FixedFunction_TexturingMode);
|
| +
|
| if (hasVertexShader) {
|
| - pb->fVS.setupLocalCoords();
|
| - pb->fVS.transformGLToSkiaCoords();
|
| + pb->fVS.setupUniformViewMatrix();
|
| + pb->fVS.setupPositionAndLocalCoords();
|
| +
|
| if (header.fEmitsPointSize) {
|
| pb->fVS.codeAppend("gl_PointSize = 1.0;");
|
| }
|
| @@ -75,10 +77,10 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState,
|
| // remove this cast to a vec4.
|
| GrGLSLExpr4 inputCoverageVec4 = GrGLSLExpr4::VectorCast(inputCoverage);
|
|
|
| - pb->emitAndInstallProcs(optState, &inputColor, &inputCoverageVec4);
|
| + pb->emitAndInstallProcs(&inputColor, &inputCoverageVec4);
|
|
|
| if (hasVertexShader) {
|
| - pb->fVS.transformSkiaToGLCoords();
|
| + pb->fVS.transformToNormalizedDeviceSpace();
|
| }
|
|
|
| // write the secondary color output if necessary
|
| @@ -171,7 +173,17 @@ GrGLProgramDataManager::UniformHandle GrGLProgramBuilder::addUniformArray(uint32
|
| UniformInfo& uni = fUniforms.push_back();
|
| uni.fVariable.setType(type);
|
| uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier);
|
| - this->nameVariable(uni.fVariable.accessName(), 'u', name);
|
| + // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use
|
| + // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB
|
| + // exactly what name it wants to use for the uniform view matrix. If we prefix anythings, then
|
| + // the names will mismatch. I think the correct solution is to have all GPs which need the
|
| + // uniform view matrix, they should upload the view matrix in their setData along with regular
|
| + // uniforms.
|
| + char prefix = 'u';
|
| + if ('u' == name[0]) {
|
| + prefix = '\0';
|
| + }
|
| + this->nameVariable(uni.fVariable.accessName(), prefix, name);
|
| uni.fVariable.setArrayCount(count);
|
| uni.fVisibility = visibility;
|
|
|
| @@ -230,14 +242,13 @@ void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* input
|
| }
|
| }
|
|
|
| -void GrGLProgramBuilder::emitAndInstallProcs(const GrOptDrawState& optState,
|
| - GrGLSLExpr4* inputColor,
|
| +void GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor,
|
| GrGLSLExpr4* inputCoverage) {
|
| fFragmentProcessors.reset(SkNEW(GrGLInstalledFragProcs));
|
| - int numProcs = optState.numFragmentStages();
|
| - this->emitAndInstallFragProcs(0, optState.numColorStages(), inputColor);
|
| - if (optState.hasGeometryProcessor()) {
|
| - const GrGeometryProcessor& gp = *optState.getGeometryProcessor();
|
| + int numProcs = fOptState.numFragmentStages();
|
| + this->emitAndInstallFragProcs(0, fOptState.numColorStages(), inputColor);
|
| + if (fOptState.hasGeometryProcessor()) {
|
| + const GrGeometryProcessor& gp = *fOptState.getGeometryProcessor();
|
| fVS.emitAttributes(gp);
|
| ProcKeyProvider keyProvider(&fDesc,
|
| ProcKeyProvider::kGeometry_ProcessorType,
|
| @@ -246,7 +257,7 @@ void GrGLProgramBuilder::emitAndInstallProcs(const GrOptDrawState& optState,
|
| this->emitAndInstallProc<GrGeometryProcessor>(gp, 0, keyProvider, *inputCoverage, &output);
|
| *inputCoverage = output;
|
| }
|
| - this->emitAndInstallFragProcs(optState.numColorStages(), numProcs, inputCoverage);
|
| + this->emitAndInstallFragProcs(fOptState.numColorStages(), numProcs, inputCoverage);
|
| }
|
|
|
| void GrGLProgramBuilder::emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut) {
|
| @@ -272,9 +283,14 @@ void GrGLProgramBuilder::emitAndInstallProc(const Proc& proc,
|
| // Program builders have a bit of state we need to clear with each effect
|
| AutoStageAdvance adv(this);
|
|
|
| - // create var to hold stage result
|
| + // create var to hold stage result. If we already have a valid output name, just use that
|
| + // otherwise create a new mangled one.
|
| SkString outColorName;
|
| - this->nameVariable(&outColorName, '\0', "output");
|
| + if (output->isValid()) {
|
| + outColorName = output->c_str();
|
| + } else {
|
| + this->nameVariable(&outColorName, '\0', "output");
|
| + }
|
| fFS.codeAppendf("vec4 %s;", outColorName.c_str());
|
| *output = outColorName;
|
|
|
| @@ -315,8 +331,8 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrFragmentStage& fs,
|
|
|
| void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp,
|
| const GrProcessorKey& key,
|
| - const char* outColor,
|
| - const char* inColor) {
|
| + const char* outCoverage,
|
| + const char* inCoverage) {
|
| SkASSERT(!fGeometryProcessor);
|
| fGeometryProcessor = SkNEW(GrGLInstalledGeoProc);
|
|
|
| @@ -325,7 +341,7 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp,
|
| SkSTArray<4, GrGLProcessor::TextureSampler> samplers(gp.numTextures());
|
| this->emitSamplers(gp, &samplers, fGeometryProcessor);
|
|
|
| - GrGLGeometryProcessor::EmitArgs args(this, gp, key, outColor, inColor, samplers);
|
| + GrGLGeometryProcessor::EmitArgs args(this, gp, key, outCoverage, inCoverage, samplers);
|
| fGeometryProcessor->fGLProc->emitCode(args);
|
|
|
| // We have to check that effects and the code they emit are consistent, ie if an effect
|
| @@ -374,23 +390,13 @@ void GrGLProgramBuilder::emitTransforms(const GrFragmentStage& effectStage,
|
| suffixedVaryingName.appendf("_%i", t);
|
| varyingName = suffixedVaryingName.c_str();
|
| }
|
| + const char* coords = kPosition_GrCoordSet == effect->coordTransform(t).sourceCoords() ?
|
| + fVS.positionAttribute().c_str() :
|
| + fVS.localCoordsAttribute().c_str();
|
| GrGLVertToFrag v(varyingType);
|
| - this->addVarying(varyingName, &v);
|
| -
|
| - const GrGLShaderVar& coords =
|
| - kPosition_GrCoordSet == effect->coordTransform(t).sourceCoords() ?
|
| - fVS.positionAttribute() :
|
| - fVS.localCoordsAttribute();
|
| + this->addCoordVarying(varyingName, &v, uniName, coords);
|
|
|
| - // varying = matrix * coords (logically)
|
| SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType);
|
| - if (kVec2f_GrSLType == varyingType) {
|
| - fVS.codeAppendf("%s = (%s * vec3(%s, 1)).xy;",
|
| - v.vsOut(), uniName, coords.c_str());
|
| - } else {
|
| - fVS.codeAppendf("%s = %s * vec3(%s, 1);",
|
| - v.vsOut(), uniName, coords.c_str());
|
| - }
|
| SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords,
|
| (SkString(v.fsIn()), varyingType));
|
| }
|
|
|