• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrGLEffectMatrix_DEFINED
9 #define GrGLEffectMatrix_DEFINED
10 
11 #include "GrGLEffect.h"
12 #include "SkMatrix.h"
13 
14 class GrTexture;
15 class SkRandom;
16 
17 /**
18  * This is a helper to implement a texture matrix in a GrGLEffect.
19  */
20 class GrGLEffectMatrix {
21 public:
22     typedef GrGLEffect::EffectKey EffectKey;
23     /**
24      * The matrix uses kKeyBits of the effect's EffectKey. A GrGLEffect may place these bits at an
25      * arbitrary shift in its final key. However, when GrGLEffectMatrix::emitCode*() code is called
26      * the relevant bits must be in the lower kKeyBits of the key parameter.
27      */
28     enum {
29         kKeyBits = 2,
30         kKeyMask = (1 << kKeyBits) - 1,
31     };
32 
GrGLEffectMatrix()33     GrGLEffectMatrix() : fUni(GrGLUniformManager::kInvalidUniformHandle) {
34         fPrevMatrix = SkMatrix::InvalidMatrix();
35     }
36 
37     /**
38      * Generates the key for the portion of the code emitted by this class's emitCode() function.
39      * Pass a texture to make GrGLEffectMatrix automatically adjust for the texture's origin. Pass
40      * NULL when not using the EffectMatrix for a texture lookups, or if the GrGLEffect subclass
41      * wants to handle origin adjustments in some other manner. coordChangeMatrix is the matrix
42      * from GrEffectStage.
43      */
44     static EffectKey GenKey(const SkMatrix& effectMatrix,
45                             const SkMatrix& coordChangeMatrix,
46                             const GrTexture*);
47 
48     /**
49      * Emits code to implement the matrix in the VS. A varying is added as an output of the VS and
50      * input to the FS. The varying may be either a vec2f or vec3f depending upon whether
51      * perspective interpolation is required or not. The names of the varying in the VS and FS are
52      * are returned as output parameters and the type of the varying is the return value. The suffix
53      * is an optional parameter that can be used to make all variables emitted by the object
54      * unique within a stage. It is only necessary if multiple GrGLEffectMatrix objects are used by
55      * a GrGLEffect.
56      */
57     GrSLType emitCode(GrGLShaderBuilder*,
58                       EffectKey,
59                       const char* vertexCoords,
60                       const char** fsCoordName, /* optional */
61                       const char** vsCoordName = NULL,
62                       const char* suffix = NULL);
63 
64     /**
65      * This is similar to emitCode except that it performs perspective division in the FS if the
66      * texture coordinates have a w coordinate. The fsCoordName always refers to a vec2f.
67      */
68     void emitCodeMakeFSCoords2D(GrGLShaderBuilder*,
69                                 EffectKey,
70                                 const char* vertexCoords,
71                                 const char** fsCoordName, /* optional */
72                                 const char** vsVaryingName = NULL,
73                                 GrSLType* vsVaryingType = NULL,
74                                 const char* suffix = NULL);
75     /**
76      * Call from a GrGLEffect's subclass to update the texture matrix. The matrix,
77      * coordChangeMatrix, and texture params should match those used with GenKey.
78      */
79     void setData(const GrGLUniformManager& uniformManager,
80                  const SkMatrix& effectMatrix,
81                  const SkMatrix& coordChangeMatrix,
82                  const GrTexture*);
83 
84 private:
85     enum {
86         kIdentity_Key   = 0,
87         kTrans_Key      = 1,
88         kNoPersp_Key    = 2,
89         kGeneral_Key    = 3,
90     };
91 
92     GrGLUniformManager::UniformHandle fUni;
93     GrSLType                          fUniType;
94     SkMatrix                          fPrevMatrix;
95 };
96 
97 #endif
98