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; |
} |