| Index: src/gpu/gl/GrGLProgram.cpp
|
| ===================================================================
|
| --- src/gpu/gl/GrGLProgram.cpp (revision 8241)
|
| +++ src/gpu/gl/GrGLProgram.cpp (working copy)
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "GrAllocator.h"
|
| #include "GrEffect.h"
|
| +#include "GrDrawEffect.h"
|
| #include "GrGLEffect.h"
|
| #include "GrGpuGL.h"
|
| #include "GrGLShaderVar.h"
|
| @@ -26,7 +27,6 @@
|
| SK_CONF_DECLARE(bool, c_PrintShaders, "gpu.printShaders", false,
|
| "Print the source code for all shaders generated.");
|
|
|
| -#define TEX_ATTR_NAME "aTexCoord"
|
| #define COL_ATTR_NAME "aColor"
|
| #define COV_ATTR_NAME "aCoverage"
|
| #define EDGE_ATTR_NAME "aEdge"
|
| @@ -134,7 +134,10 @@
|
| lastEnabledStage = s;
|
| const GrEffectRef& effect = *drawState.getStage(s).getEffect();
|
| const GrBackendEffectFactory& factory = effect->getFactory();
|
| - desc->fEffectKeys[s] = factory.glEffectKey(drawState.getStage(s), gpu->glCaps());
|
| + bool explicitLocalCoords = (drawState.getAttribBindings() &
|
| + GrDrawState::kLocalCoords_AttribBindingsBit);
|
| + GrDrawEffect drawEffect(drawState.getStage(s), explicitLocalCoords);
|
| + desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
|
| } else {
|
| desc->fEffectKeys[s] = 0;
|
| }
|
| @@ -207,8 +210,8 @@
|
| if (desc->fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) {
|
| desc->fEdgeAttributeIndex = drawState.getAttribIndex(GrDrawState::kEdge_AttribIndex);
|
| }
|
| - if (GrDrawState::AttributesBindExplicitTexCoords(desc->fAttribBindings)) {
|
| - desc->fTexCoordAttributeIndex = drawState.getAttribIndex(GrDrawState::kTexCoord_AttribIndex);
|
| + if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
|
| + desc->fLocalCoordsAttributeIndex = drawState.getAttribIndex(GrDrawState::kLocalCoords_AttribIndex);
|
| }
|
|
|
| #if GR_DEBUG
|
| @@ -227,11 +230,11 @@
|
| if (desc->fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) {
|
| GrAssert(desc->fEdgeAttributeIndex < GrDrawState::kVertexAttribCnt);
|
| GrAssert(kAttribLayouts[vertexAttribs[desc->fEdgeAttributeIndex].fType].fCount == 4);
|
| - }
|
| - if (GrDrawState::AttributesBindExplicitTexCoords(desc->fAttribBindings)) {
|
| - GrAssert(desc->fTexCoordAttributeIndex < GrDrawState::kVertexAttribCnt);
|
| - GrAssert(kAttribLayouts[vertexAttribs[desc->fTexCoordAttributeIndex].fType].fCount == 2);
|
| }
|
| + if (desc->fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
|
| + GrAssert(desc->fLocalCoordsAttributeIndex < GrDrawState::kVertexAttribCnt);
|
| + GrAssert(kAttribLayouts[vertexAttribs[desc->fLocalCoordsAttributeIndex].fType].fCount == 2);
|
| + }
|
| #endif
|
| }
|
|
|
| @@ -679,8 +682,10 @@
|
| bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
|
| GrAssert(0 == fProgramID);
|
|
|
| - GrGLShaderBuilder builder(fContext.info(), fUniformManager);
|
| const GrAttribBindings& attribBindings = fDesc.fAttribBindings;
|
| + bool hasExplicitLocalCoords =
|
| + SkToBool(attribBindings & GrDrawState::kLocalCoords_AttribBindingsBit);
|
| + GrGLShaderBuilder builder(fContext.info(), fUniformManager, hasExplicitLocalCoords);
|
|
|
| #if GR_GL_EXPERIMENTAL_GS
|
| builder.fUsesGS = fDesc.fExperimentalGS;
|
| @@ -760,11 +765,6 @@
|
| builder.vsCodeAppend("\tgl_PointSize = 1.0;\n");
|
| }
|
|
|
| - // add texture coordinates that are used to the list of vertex attr decls
|
| - if (GrDrawState::AttributesBindExplicitTexCoords(attribBindings)) {
|
| - builder.addAttribute(kVec2f_GrSLType, TEX_ATTR_NAME);
|
| - }
|
| -
|
| ///////////////////////////////////////////////////////////////////////////
|
| // compute the final color
|
|
|
| @@ -779,21 +779,11 @@
|
| outColor.appendS32(s);
|
| builder.fsCodeAppendf("\tvec4 %s;\n", outColor.c_str());
|
|
|
| - const char* inCoords;
|
| - // figure out what our input coords are
|
| - if (!GrDrawState::StageBindsExplicitTexCoords(attribBindings, s)) {
|
| - inCoords = builder.positionAttribute().c_str();
|
| - } else {
|
| - // must have input tex coordinates if stage is enabled.
|
| - inCoords = TEX_ATTR_NAME;
|
| - }
|
| -
|
| builder.setCurrentStage(s);
|
| fEffects[s] = builder.createAndEmitGLEffect(*stages[s],
|
| fDesc.fEffectKeys[s],
|
| inColor.size() ? inColor.c_str() : NULL,
|
| outColor.c_str(),
|
| - inCoords,
|
| &fUniformHandles.fSamplerUnis[s]);
|
| builder.setNonStage();
|
| inColor = outColor;
|
| @@ -871,16 +861,6 @@
|
| outCoverage.appendS32(s);
|
| builder.fsCodeAppendf("\tvec4 %s;\n", outCoverage.c_str());
|
|
|
| - const char* inCoords;
|
| - // figure out what our input coords are
|
| - if (!GrDrawState::StageBindsExplicitTexCoords(attribBindings, s)) {
|
| - inCoords = builder.positionAttribute().c_str();
|
| - } else {
|
| - // must have input tex coordinates if stage is
|
| - // enabled.
|
| - inCoords = TEX_ATTR_NAME;
|
| - }
|
| -
|
| // stages don't know how to deal with a scalar input. (Maybe they should. We
|
| // could pass a GrGLShaderVar)
|
| if (inCoverageIsScalar) {
|
| @@ -894,7 +874,6 @@
|
| fDesc.fEffectKeys[s],
|
| inCoverage.size() ? inCoverage.c_str() : NULL,
|
| outCoverage.c_str(),
|
| - inCoords,
|
| &fUniformHandles.fSamplerUnis[s]);
|
| builder.setNonStage();
|
| inCoverage = outCoverage;
|
| @@ -1008,8 +987,10 @@
|
| if (fDesc.fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) {
|
| GL_CALL(BindAttribLocation(fProgramID, fDesc.fEdgeAttributeIndex, EDGE_ATTR_NAME));
|
| }
|
| - if (GrDrawState::AttributesBindExplicitTexCoords(fDesc.fAttribBindings)) {
|
| - GL_CALL(BindAttribLocation(fProgramID, fDesc.fTexCoordAttributeIndex, TEX_ATTR_NAME));
|
| + if (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
|
| + GL_CALL(BindAttribLocation(fProgramID,
|
| + fDesc.fLocalCoordsAttributeIndex,
|
| + builder.localCoordsAttribute().c_str()));
|
| }
|
|
|
| const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttributes().end();
|
| @@ -1088,7 +1069,11 @@
|
| if (NULL != fEffects[s]) {
|
| const GrEffectStage& stage = drawState.getStage(s);
|
| GrAssert(NULL != stage.getEffect());
|
| - fEffects[s]->setData(fUniformManager, stage);
|
| +
|
| + bool explicitLocalCoords =
|
| + (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit);
|
| + GrDrawEffect drawEffect(stage, explicitLocalCoords);
|
| + fEffects[s]->setData(fUniformManager, drawEffect);
|
| int numSamplers = fUniformHandles.fSamplerUnis[s].count();
|
| for (int u = 0; u < numSamplers; ++u) {
|
| UniformHandle handle = fUniformHandles.fSamplerUnis[s][u];
|
|
|