| Index: src/gpu/gl/GrGLEffectMatrix.cpp
|
| ===================================================================
|
| --- src/gpu/gl/GrGLEffectMatrix.cpp (revision 8241)
|
| +++ src/gpu/gl/GrGLEffectMatrix.cpp (working copy)
|
| @@ -6,58 +6,67 @@
|
| */
|
|
|
| #include "GrGLEffectMatrix.h"
|
| +#include "GrDrawEffect.h"
|
| #include "GrTexture.h"
|
|
|
| GrGLEffect::EffectKey GrGLEffectMatrix::GenKey(const SkMatrix& effectMatrix,
|
| - const SkMatrix& coordChangeMatrix,
|
| + const GrDrawEffect& drawEffect,
|
| + CoordsType coordsType,
|
| const GrTexture* texture) {
|
| + EffectKey key = 0;
|
| SkMatrix::TypeMask type0 = effectMatrix.getType();
|
| - SkMatrix::TypeMask type1 = coordChangeMatrix.getType();
|
| + SkMatrix::TypeMask type1;
|
| + if (GrEffect::kLocal_CoordsType == coordsType) {
|
| + type1 = drawEffect.getCoordChangeMatrix().getType();
|
| + } else {
|
| + if (drawEffect.programHasExplicitLocalCoords()) {
|
| + // We only make the key indicate that device coords are referenced when the local coords
|
| + // are not actually determined by positions.
|
| + key |= kPositionCoords_Flag;
|
| + }
|
| + type1 = SkMatrix::kIdentity_Mask;
|
| + }
|
|
|
| - static const int kNonTransMask = SkMatrix::kAffine_Mask |
|
| - SkMatrix::kScale_Mask |
|
| - SkMatrix::kPerspective_Mask;
|
| int combinedTypes = type0 | type1;
|
|
|
| bool reverseY = (NULL != texture) && kBottomLeft_GrSurfaceOrigin == texture->origin();
|
|
|
| if (SkMatrix::kPerspective_Mask & combinedTypes) {
|
| - return kGeneral_Key;
|
| - } else if ((kNonTransMask & combinedTypes) || reverseY) {
|
| - return kNoPersp_Key;
|
| - } else if (kTrans_Key & combinedTypes) {
|
| - return kTrans_Key;
|
| + key |= kGeneral_MatrixType;
|
| + } else if (((SkMatrix::kAffine_Mask | SkMatrix::kScale_Mask) & combinedTypes) || reverseY) {
|
| + key |= kNoPersp_MatrixType;
|
| + } else if (SkMatrix::kTranslate_Mask & combinedTypes) {
|
| + key |= kTrans_MatrixType;
|
| } else {
|
| - GrAssert(effectMatrix.isIdentity() && coordChangeMatrix.isIdentity());
|
| - return kIdentity_Key;
|
| + key |= kIdentity_MatrixType;
|
| }
|
| + return key;
|
| }
|
|
|
| GrSLType GrGLEffectMatrix::emitCode(GrGLShaderBuilder* builder,
|
| EffectKey key,
|
| - const char* vertexCoords,
|
| const char** fsCoordName,
|
| const char** vsCoordName,
|
| const char* suffix) {
|
| GrSLType varyingType;
|
| const char* uniName;
|
| key &= kKeyMask;
|
| - switch (key) {
|
| - case kIdentity_Key:
|
| + switch (key & kMatrixTypeKeyMask) {
|
| + case kIdentity_MatrixType:
|
| fUniType = kVoid_GrSLType;
|
| varyingType = kVec2f_GrSLType;
|
| break;
|
| - case kTrans_Key:
|
| + case kTrans_MatrixType:
|
| fUniType = kVec2f_GrSLType;
|
| uniName = "StageTranslate";
|
| varyingType = kVec2f_GrSLType;
|
| break;
|
| - case kNoPersp_Key:
|
| + case kNoPersp_MatrixType:
|
| fUniType = kMat33f_GrSLType;
|
| uniName = "StageMatrix";
|
| varyingType = kVec2f_GrSLType;
|
| break;
|
| - case kGeneral_Key:
|
| + case kGeneral_MatrixType:
|
| fUniType = kMat33f_GrSLType;
|
| uniName = "StageMatrix";
|
| varyingType = kVec3f_GrSLType;
|
| @@ -89,24 +98,38 @@
|
| const char* fsVaryingName;
|
| builder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVaryingName);
|
|
|
| - // varying = matrix * vertex-coords (logically)
|
| + const GrGLShaderVar* coords;
|
| + switch (fCoordsType) {
|
| + case GrEffect::kLocal_CoordsType:
|
| + GrAssert(!(kPositionCoords_Flag & key));
|
| + coords = &builder->localCoordsAttribute();
|
| + break;
|
| + case GrEffect::kPosition_CoordsType:
|
| + GrAssert((kPositionCoords_Flag & key) || !builder->hasExplicitLocalCoords());
|
| + coords = &builder->positionAttribute();
|
| + break;
|
| + default:
|
| + GrCrash("Unexpected coords type.");
|
| + }
|
| + // varying = matrix * coords (logically)
|
| switch (fUniType) {
|
| case kVoid_GrSLType:
|
| GrAssert(kVec2f_GrSLType == varyingType);
|
| - builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, vertexCoords);
|
| + builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, coords->c_str());
|
| break;
|
| case kVec2f_GrSLType:
|
| GrAssert(kVec2f_GrSLType == varyingType);
|
| - builder->vsCodeAppendf("\t%s = %s + %s;\n", vsVaryingName, uniName, vertexCoords);
|
| + builder->vsCodeAppendf("\t%s = %s + %s;\n",
|
| + vsVaryingName, uniName, coords->c_str());
|
| break;
|
| case kMat33f_GrSLType: {
|
| GrAssert(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType);
|
| if (kVec2f_GrSLType == varyingType) {
|
| builder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n",
|
| - vsVaryingName, uniName, vertexCoords);
|
| + vsVaryingName, uniName, coords->c_str());
|
| } else {
|
| builder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n",
|
| - vsVaryingName, uniName, vertexCoords);
|
| + vsVaryingName, uniName, coords->c_str());
|
| }
|
| break;
|
| }
|
| @@ -128,7 +151,6 @@
|
| */
|
| void GrGLEffectMatrix::emitCodeMakeFSCoords2D(GrGLShaderBuilder* builder,
|
| EffectKey key,
|
| - const char* vertexCoords,
|
| const char** fsCoordName,
|
| const char** vsVaryingName,
|
| GrSLType* vsVaryingType,
|
| @@ -137,7 +159,6 @@
|
|
|
| GrSLType varyingType = this->emitCode(builder,
|
| key,
|
| - vertexCoords,
|
| &fsVaryingName,
|
| vsVaryingName,
|
| suffix);
|
| @@ -164,11 +185,14 @@
|
| }
|
|
|
| void GrGLEffectMatrix::setData(const GrGLUniformManager& uniformManager,
|
| - const SkMatrix& matrix,
|
| - const SkMatrix& coordChangeMatrix,
|
| - const GrTexture* texture) {
|
| + const SkMatrix& matrix,
|
| + const GrDrawEffect& drawEffect,
|
| + const GrTexture* texture) {
|
| GrAssert((GrGLUniformManager::kInvalidUniformHandle == fUni) ==
|
| - (kVoid_GrSLType == fUniType));
|
| + (kVoid_GrSLType == fUniType));
|
| + const SkMatrix& coordChangeMatrix = GrEffect::kLocal_CoordsType == fCoordsType ?
|
| + drawEffect.getCoordChangeMatrix() :
|
| + SkMatrix::I();
|
| switch (fUniType) {
|
| case kVoid_GrSLType:
|
| GrAssert(matrix.isIdentity());
|
| @@ -178,8 +202,8 @@
|
| case kVec2f_GrSLType: {
|
| GrAssert(SkMatrix::kTranslate_Mask == (matrix.getType() | coordChangeMatrix.getType()));
|
| GrAssert(NULL == texture || kTopLeft_GrSurfaceOrigin == texture->origin());
|
| - SkScalar tx = matrix[SkMatrix::kMTransX] + coordChangeMatrix[SkMatrix::kMTransX];
|
| - SkScalar ty = matrix[SkMatrix::kMTransY] + coordChangeMatrix[SkMatrix::kMTransY];
|
| + 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) {
|
| uniformManager.set2f(fUni, tx, ty);
|
|
|