Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrGLEffectMatrix_DEFINED | 8 #ifndef GrGLEffectMatrix_DEFINED |
| 9 #define GrGLEffectMatrix_DEFINED | 9 #define GrGLEffectMatrix_DEFINED |
| 10 | 10 |
| 11 #include "GrGLEffect.h" | 11 #include "GrGLEffect.h" |
| 12 #include "SkMatrix.h" | 12 #include "SkMatrix.h" |
| 13 | 13 |
| 14 class GrTexture; | 14 class GrTexture; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * This is a helper to implement a texture matrix in a GrGLEffect. | 17 * This is a helper to implement a matrix in a GrGLEffect that operates on incom ing coords in the |
| 18 * vertex shader and writes them to an attribute to be used in the fragment shad er. When the input | |
| 19 * coords in the vertex shader are local coordinates this class accounts for the coord change matrix | |
| 20 * communicated via GrDrawEffect. The input coords may also be positions and in this case the coord | |
| 21 * change matrix is ignored. The GrGLEffectMatrix will emit different code based on the type of | |
| 22 * matrix and thus must contribute to the effect's key. | |
| 23 * | |
| 24 * This class cannot be used to apply a matrix to coordinates that come in the f orm of custom vertex | |
| 25 * attributes. | |
| 18 */ | 26 */ |
| 19 class GrGLEffectMatrix { | 27 class GrGLEffectMatrix { |
| 20 public: | 28 public: |
| 29 | |
| 30 typedef GrEffect::CoordsType CoordsType; | |
| 31 | |
| 21 typedef GrGLEffect::EffectKey EffectKey; | 32 typedef GrGLEffect::EffectKey EffectKey; |
| 22 /** | 33 /** |
| 23 * The matrix uses kKeyBits of the effect's EffectKey. A GrGLEffect may plac e these bits at an | 34 * The matrix uses kKeyBits of the effect's EffectKey. A GrGLEffect may plac e these bits at an |
| 24 * arbitrary shift in its final key. However, when GrGLEffectMatrix::emitCod e*() code is called | 35 * arbitrary shift in its final key. However, when GrGLEffectMatrix::emitCod e*() code is called |
| 25 * the relevant bits must be in the lower kKeyBits of the key parameter. | 36 * the relevant bits must be in the lower kKeyBits of the key parameter. |
| 26 */ | 37 */ |
| 27 enum { | 38 enum { |
| 28 kKeyBits = 2, | 39 kKeyBits = 3, |
| 29 kKeyMask = (1 << kKeyBits) - 1, | 40 kKeyMask = (1 << kKeyBits) - 1, |
| 30 }; | 41 }; |
| 31 | 42 |
| 32 GrGLEffectMatrix() : fUni(GrGLUniformManager::kInvalidUniformHandle) { | 43 GrGLEffectMatrix(CoordsType coordsType) |
| 44 : fUni(GrGLUniformManager::kInvalidUniformHandle) | |
| 45 , fCoordsType(coordsType) { | |
| 46 GrAssert(GrEffect::kLocal_CoordsType == coordsType || | |
| 47 GrEffect::kPosition_CoordsType == coordsType); | |
| 33 fPrevMatrix = SkMatrix::InvalidMatrix(); | 48 fPrevMatrix = SkMatrix::InvalidMatrix(); |
| 34 } | 49 } |
| 35 | 50 |
| 36 /** | 51 /** |
| 37 * Generates the key for the portion of the code emitted by this class's emi tCode() function. | 52 * Generates the key for the portion of the code emitted by this class's emi tCode() function. |
| 38 * Pass a texture to make GrGLEffectMatrix automatically adjust for the text ure's origin. Pass | 53 * Pass a texture to make GrGLEffectMatrix automatically adjust for the text ure's origin. Pass |
| 39 * NULL when not using the EffectMatrix for a texture lookups, or if the GrG LEffect subclass | 54 * NULL when not using the EffectMatrix for a texture lookup, or if the GrGL Effect subclass |
| 40 * wants to handle origin adjustments in some other manner. coordChangeMatri x is the matrix | 55 * wants to handle origin adjustments in some other manner. The coords type param must match the |
| 41 * from GrEffectStage. | 56 * param that would be used to initialize GrGLEffectMatrix for the generatin g GrEffect. |
| 42 */ | 57 */ |
| 43 static EffectKey GenKey(const SkMatrix& effectMatrix, | 58 static EffectKey GenKey(const SkMatrix& effectMatrix, |
| 44 const SkMatrix& coordChangeMatrix, | 59 const GrDrawEffect&, |
| 60 CoordsType, | |
| 45 const GrTexture*); | 61 const GrTexture*); |
| 46 | 62 |
| 47 /** | 63 /** |
| 48 * Emits code to implement the matrix in the VS. A varying is added as an ou tput of the VS and | 64 * Emits code to implement the matrix in the VS. A varying is added as an ou tput of the VS and |
| 49 * input to the FS. The varying may be either a vec2f or vec3f depending upo n whether | 65 * input to the FS. The varying may be either a vec2f or vec3f depending upo n whether |
| 50 * perspective interpolation is required or not. The names of the varying in the VS and FS are | 66 * perspective interpolation is required or not. The names of the varying in the VS and FS are |
| 51 * are returned as output parameters and the type of the varying is the retu rn value. The suffix | 67 * are returned as output parameters and the type of the varying is the retu rn value. The suffix |
| 52 * is an optional parameter that can be used to make all variables emitted b y the object | 68 * is an optional parameter that can be used to make all variables emitted b y the object |
| 53 * unique within a stage. It is only necessary if multiple GrGLEffectMatrix objects are used by | 69 * unique within a stage. It is only necessary if multiple GrGLEffectMatrix objects are used by |
| 54 * a GrGLEffect. | 70 * a GrGLEffect. |
| 55 */ | 71 */ |
| 56 GrSLType emitCode(GrGLShaderBuilder*, | 72 GrSLType emitCode(GrGLShaderBuilder*, |
| 57 EffectKey, | 73 EffectKey, |
| 58 const char* vertexCoords, | |
| 59 const char** fsCoordName, /* optional */ | 74 const char** fsCoordName, /* optional */ |
| 60 const char** vsCoordName = NULL, | 75 const char** vsCoordName = NULL, |
| 61 const char* suffix = NULL); | 76 const char* suffix = NULL); |
| 62 | 77 |
| 63 /** | 78 /** |
| 64 * This is similar to emitCode except that it performs perspective division in the FS if the | 79 * This is similar to emitCode except that it performs perspective division in the FS if the |
| 65 * texture coordinates have a w coordinate. The fsCoordName always refers to a vec2f. | 80 * texture coordinates have a w coordinate. The fsCoordName always refers to a vec2f. |
| 66 */ | 81 */ |
| 67 void emitCodeMakeFSCoords2D(GrGLShaderBuilder*, | 82 void emitCodeMakeFSCoords2D(GrGLShaderBuilder*, |
| 68 EffectKey, | 83 EffectKey, |
| 69 const char* vertexCoords, | |
| 70 const char** fsCoordName, /* optional */ | 84 const char** fsCoordName, /* optional */ |
| 71 const char** vsVaryingName = NULL, | 85 const char** vsVaryingName = NULL, |
| 72 GrSLType* vsVaryingType = NULL, | 86 GrSLType* vsVaryingType = NULL, |
| 73 const char* suffix = NULL); | 87 const char* suffix = NULL); |
| 74 /** | 88 /** |
| 75 * Call from a GrGLEffect's subclass to update the texture matrix. The matri x, | 89 * Call from a GrGLEffect's subclass to update the texture matrix. The effec tMatrix and texture |
| 76 * coordChangeMatrix, and texture params should match those used with GenKey . | 90 * params should match those used with GenKey. |
| 77 */ | 91 */ |
| 78 void setData(const GrGLUniformManager& uniformManager, | 92 void setData(const GrGLUniformManager& uniformManager, |
| 79 const SkMatrix& effectMatrix, | 93 const SkMatrix& effectMatrix, |
| 80 const SkMatrix& coordChangeMatrix, | 94 const GrDrawEffect& drawEffect, |
| 81 const GrTexture*); | 95 const GrTexture*); |
| 82 | 96 |
| 83 private: | 97 private: |
| 84 enum { | 98 enum { |
| 85 kIdentity_Key = 0, | 99 kIdentity_Key = 0x0, |
| 86 kTrans_Key = 1, | 100 kTrans_Key = 0x1, |
| 87 kNoPersp_Key = 2, | 101 kNoPersp_Key = 0x2, |
| 88 kGeneral_Key = 3, | 102 kGeneral_Key = 0x3, |
| 103 | |
|
robertphillips
2013/03/19 15:09:38
kMatrixFlagsMask? I misunderstood kMatrixTypeMask
jvanverth1
2013/03/19 15:36:51
Does kGeneral_Key mean (kTrans_Key | kNoPersp_Key)
robertphillips
2013/03/19 15:41:35
How about kMatrixKeys? Jim is right should kGenera
bsalomon
2013/03/19 19:34:43
They aren't meant to be OR'ed together, but rather
| |
| 104 kMatrixTypeMask = 0x3, | |
| 105 | |
| 106 // this bit indicates that the matrix is applied to positions rather tha n local coords | |
| 107 kPositionCoords_Key = 0x4, | |
| 89 }; | 108 }; |
| 90 | 109 |
| 91 GrGLUniformManager::UniformHandle fUni; | 110 GrGLUniformManager::UniformHandle fUni; |
| 92 GrSLType fUniType; | 111 GrSLType fUniType; |
| 93 SkMatrix fPrevMatrix; | 112 SkMatrix fPrevMatrix; |
| 113 CoordsType fCoordsType; | |
| 94 }; | 114 }; |
| 95 | 115 |
| 96 #endif | 116 #endif |
| OLD | NEW |