| Index: src/gpu/gl/GrGLEffectMatrix.cpp
|
| diff --git a/src/gpu/gl/GrGLEffectMatrix.cpp b/src/gpu/gl/GrGLEffectMatrix.cpp
|
| index ef3812e0fbb7c87e9f4ef4b243a613cfaafd7515..9c333cd2d06c1e25357e459706f3d698c6879f9b 100644
|
| --- a/src/gpu/gl/GrGLEffectMatrix.cpp
|
| +++ b/src/gpu/gl/GrGLEffectMatrix.cpp
|
| @@ -48,10 +48,6 @@ GrSLType GrGLEffectMatrix::emitCode(GrGLShaderBuilder* builder,
|
| SkString* fsCoordName,
|
| SkString* vsCoordName,
|
| const char* suffix) {
|
| - // TODO: Handle vertexless shaders here before we start enabling them.
|
| - GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertexBuilder();
|
| - SkASSERT(NULL != vertexBuilder);
|
| -
|
| GrSLType varyingType = kVoid_GrSLType;
|
| const char* uniName;
|
| key &= kKeyMask;
|
| @@ -78,6 +74,16 @@ GrSLType GrGLEffectMatrix::emitCode(GrGLShaderBuilder* builder,
|
| default:
|
| GrCrash("Unexpected key.");
|
| }
|
| +
|
| + GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertexBuilder();
|
| + if (NULL == vertexBuilder) {
|
| + if (vsCoordName) {
|
| + vsCoordName->reset();
|
| + }
|
| + builder->addTexGenUnit(varyingType, fsCoordName, &fTexGenUnit, &fNumTexGenComponents);
|
| + return varyingType;
|
| + }
|
| +
|
| SkString suffixedUniName;
|
| if (NULL != suffix) {
|
| suffixedUniName.append(uniName);
|
| @@ -193,7 +199,7 @@ void GrGLEffectMatrix::setData(const GrGLUniformManager& uniformManager,
|
| const SkMatrix& matrix,
|
| const GrDrawEffect& drawEffect,
|
| const GrTexture* texture) {
|
| - SkASSERT(fUni.isValid() != (kVoid_GrSLType == fUniType));
|
| + SkASSERT(fUni.isValid() != (fTexGenUnit >= 0 || kVoid_GrSLType == fUniType));
|
| const SkMatrix& coordChangeMatrix = GrEffect::kLocal_CoordsType == fCoordsType ?
|
| drawEffect.getCoordChangeMatrix() :
|
| SkMatrix::I();
|
| @@ -202,14 +208,25 @@ void GrGLEffectMatrix::setData(const GrGLUniformManager& uniformManager,
|
| SkASSERT(matrix.isIdentity());
|
| SkASSERT(coordChangeMatrix.isIdentity());
|
| SkASSERT(NULL == texture || kTopLeft_GrSurfaceOrigin == texture->origin());
|
| + if (fTexGenUnit >= 0) {
|
| + SkASSERT(fNumTexGenComponents == 2);
|
| + GrGLfloat texgenCoefficients[] = {1, 0, 0,
|
| + 0, 1, 0};
|
| + uniformManager.enableGlobalTexGen(fTexGenUnit, 2, texgenCoefficients);
|
| + }
|
| return;
|
| case kVec2f_GrSLType: {
|
| SkASSERT(SkMatrix::kTranslate_Mask == (matrix.getType() | coordChangeMatrix.getType()));
|
| SkASSERT(NULL == texture || kTopLeft_GrSurfaceOrigin == texture->origin());
|
| SkScalar tx = matrix[SkMatrix::kMTransX] + (coordChangeMatrix)[SkMatrix::kMTransX];
|
| SkScalar ty = matrix[SkMatrix::kMTransY] + (coordChangeMatrix)[SkMatrix::kMTransY];
|
| - if (fPrevMatrix.get(SkMatrix::kMTransX) != tx ||
|
| - fPrevMatrix.get(SkMatrix::kMTransY) != ty) {
|
| + if (fTexGenUnit >= 0) {
|
| + SkASSERT(fNumTexGenComponents == 2);
|
| + GrGLfloat texgenCoefficients[] = {1, 0, SkScalarToFloat(tx),
|
| + 0, 1, SkScalarToFloat(ty)};
|
| + uniformManager.enableGlobalTexGen(fTexGenUnit, 2, texgenCoefficients);
|
| + } else if (fPrevMatrix.get(SkMatrix::kMTransX) != tx ||
|
| + fPrevMatrix.get(SkMatrix::kMTransY) != ty) {
|
| uniformManager.set2f(fUni, tx, ty);
|
| fPrevMatrix.set(SkMatrix::kMTransX, tx);
|
| fPrevMatrix.set(SkMatrix::kMTransY, ty);
|
| @@ -229,7 +246,9 @@ void GrGLEffectMatrix::setData(const GrGLUniformManager& uniformManager,
|
| combined.set(SkMatrix::kMTransY,
|
| combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]);
|
| }
|
| - if (!fPrevMatrix.cheapEqualTo(combined)) {
|
| + if (fTexGenUnit >= 0) {
|
| + uniformManager.enableGlobalTexGen(fTexGenUnit, fNumTexGenComponents, combined);
|
| + } else if (!fPrevMatrix.cheapEqualTo(combined)) {
|
| uniformManager.setSkMatrix(fUni, combined);
|
| fPrevMatrix = combined;
|
| }
|
|
|