| Index: src/gpu/gl/GrGLEffectMatrix.h | 
| =================================================================== | 
| --- src/gpu/gl/GrGLEffectMatrix.h	(revision 8241) | 
| +++ src/gpu/gl/GrGLEffectMatrix.h	(working copy) | 
| @@ -14,34 +14,68 @@ | 
| class GrTexture; | 
|  | 
| /** | 
| - * This is a helper to implement a texture matrix in a GrGLEffect. | 
| + * This is a helper to implement a matrix in a GrGLEffect that operates on incoming coords in the | 
| + * vertex shader and writes them to an attribute to be used in the fragment shader. When the input | 
| + * coords in the vertex shader are local coordinates this class accounts for the coord change matrix | 
| + * communicated via GrDrawEffect. The input coords may also be positions and in this case the coord | 
| + * change matrix is ignored. The GrGLEffectMatrix will emit different code based on the type of | 
| + * matrix and thus must contribute to the effect's key. | 
| + * | 
| + * This class cannot be used to apply a matrix to coordinates that come in the form of custom vertex | 
| + * attributes. | 
| */ | 
| class GrGLEffectMatrix { | 
| +private: | 
| +    // We specialize the generated code for each of these matrix types. | 
| +    enum MatrixTypes { | 
| +        kIdentity_MatrixType    = 0, | 
| +        kTrans_MatrixType       = 1, | 
| +        kNoPersp_MatrixType     = 2, | 
| +        kGeneral_MatrixType     = 3, | 
| +    }; | 
| +    // The key for is made up of a matrix type and a bit that indicates the source of the input | 
| +    // coords. | 
| +    enum { | 
| +        kMatrixTypeKeyBits      = 2, | 
| +        kMatrixTypeKeyMask      = (1 << kMatrixTypeKeyBits) - 1, | 
| +        kPositionCoords_Flag    = (1 << kMatrixTypeKeyBits), | 
| +        kKeyBitsPrivate         = kMatrixTypeKeyBits + 1, | 
| +    }; | 
| + | 
| public: | 
| + | 
| +    typedef GrEffect::CoordsType CoordsType; | 
| + | 
| typedef GrGLEffect::EffectKey EffectKey; | 
| + | 
| /** | 
| * The matrix uses kKeyBits of the effect's EffectKey. A GrGLEffect may place these bits at an | 
| * arbitrary shift in its final key. However, when GrGLEffectMatrix::emitCode*() code is called | 
| * the relevant bits must be in the lower kKeyBits of the key parameter. | 
| */ | 
| enum { | 
| -        kKeyBits = 2, | 
| +        kKeyBits = kKeyBitsPrivate, | 
| kKeyMask = (1 << kKeyBits) - 1, | 
| }; | 
|  | 
| -    GrGLEffectMatrix() : fUni(GrGLUniformManager::kInvalidUniformHandle) { | 
| +    GrGLEffectMatrix(CoordsType coordsType) | 
| +        : fUni(GrGLUniformManager::kInvalidUniformHandle) | 
| +        , fCoordsType(coordsType) { | 
| +        GrAssert(GrEffect::kLocal_CoordsType == coordsType || | 
| +                 GrEffect::kPosition_CoordsType == coordsType); | 
| fPrevMatrix = SkMatrix::InvalidMatrix(); | 
| } | 
|  | 
| /** | 
| * Generates the key for the portion of the code emitted by this class's emitCode() function. | 
| * Pass a texture to make GrGLEffectMatrix automatically adjust for the texture's origin. Pass | 
| -     * NULL when not using the EffectMatrix for a texture lookups, or if the GrGLEffect subclass | 
| -     * wants to handle origin adjustments in some other manner. coordChangeMatrix is the matrix | 
| -     * from GrEffectStage. | 
| +     * NULL when not using the EffectMatrix for a texture lookup, or if the GrGLEffect subclass | 
| +     * wants to handle origin adjustments in some other manner. The coords type param must match the | 
| +     * param that would be used to initialize GrGLEffectMatrix for the generating GrEffect. | 
| */ | 
| static EffectKey GenKey(const SkMatrix& effectMatrix, | 
| -                            const SkMatrix& coordChangeMatrix, | 
| +                            const GrDrawEffect&, | 
| +                            CoordsType, | 
| const GrTexture*); | 
|  | 
| /** | 
| @@ -55,7 +89,6 @@ | 
| */ | 
| GrSLType emitCode(GrGLShaderBuilder*, | 
| EffectKey, | 
| -                      const char* vertexCoords, | 
| const char** fsCoordName, /* optional */ | 
| const char** vsCoordName = NULL, | 
| const char* suffix = NULL); | 
| @@ -66,31 +99,23 @@ | 
| */ | 
| void emitCodeMakeFSCoords2D(GrGLShaderBuilder*, | 
| EffectKey, | 
| -                                const char* vertexCoords, | 
| const char** fsCoordName, /* optional */ | 
| const char** vsVaryingName = NULL, | 
| GrSLType* vsVaryingType = NULL, | 
| const char* suffix = NULL); | 
| /** | 
| -     * Call from a GrGLEffect's subclass to update the texture matrix. The matrix, | 
| -     * coordChangeMatrix, and texture params should match those used with GenKey. | 
| +     * Call from a GrGLEffect's subclass to update the texture matrix. The effectMatrix and texture | 
| +     * params should match those used with GenKey. | 
| */ | 
| void setData(const GrGLUniformManager& uniformManager, | 
| const SkMatrix& effectMatrix, | 
| -                 const SkMatrix& coordChangeMatrix, | 
| +                 const GrDrawEffect& drawEffect, | 
| const GrTexture*); | 
|  | 
| -private: | 
| -    enum { | 
| -        kIdentity_Key   = 0, | 
| -        kTrans_Key      = 1, | 
| -        kNoPersp_Key    = 2, | 
| -        kGeneral_Key    = 3, | 
| -    }; | 
| - | 
| GrGLUniformManager::UniformHandle fUni; | 
| GrSLType                          fUniType; | 
| SkMatrix                          fPrevMatrix; | 
| +    CoordsType                        fCoordsType; | 
| }; | 
|  | 
| #endif | 
|  |