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