OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2012 Google Inc. | |
bsalomon
2013/09/27 19:23:57
2013
Chris Dalton
2013/09/27 23:33:45
This is basically just a rename of GrGLEffectMatri
| |
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 GrGLCoordTransform_DEFINED | |
9 #define GrGLCoordTransform_DEFINED | |
10 | |
11 #include "GrBackendEffectFactory.h" | |
12 #include "GrEffect.h" | |
13 #include "GrGLUniformManager.h" | |
14 #include "SkMatrix.h" | |
15 | |
16 class GrTexture; | |
17 class GrGLShaderBuilder; | |
18 | |
19 /** | |
20 * This is a helper class used by the framework to implement a coordinate transf orm that operates on | |
21 * incoming coords in the vertex shader and writes them to an attribute to be us ed in the fragment | |
22 * shader. Effects should not use this class directly, but instead call GrEffect ::addCoordTransform. | |
23 * When the input coords are local coordinates this class accounts for the coord change matrix | |
24 * communicated via GrDrawEffect. The input coords may also be positions and in this case the coord | |
25 * change matrix is ignored. The GrGLCoordTransform may emit different code base d on the type of | |
26 * matrix and thus must contribute to the effect's key. | |
27 * | |
28 * This class cannot be used to apply a matrix to coordinates that come in the f orm of custom vertex | |
29 * attributes. | |
30 */ | |
31 class GrGLCoordTransform { | |
32 private: | |
bsalomon
2013/09/27 20:04:25
We usually do public / protected / private
Chris Dalton
2013/09/27 23:33:45
This is basically just a rename of GrGLEffectMatri
bsalomon
2013/09/30 13:24:41
Ok.
| |
33 // We specialize the generated code for each of these matrix types. | |
34 enum MatrixTypes { | |
35 kIdentity_MatrixType = 0, | |
36 kTrans_MatrixType = 1, | |
37 kNoPersp_MatrixType = 2, | |
38 kGeneral_MatrixType = 3, | |
39 }; | |
40 // The key for is made up of a matrix type and a bit that indicates the sour ce of the input | |
41 // coords. | |
42 enum { | |
43 kMatrixTypeKeyBits = 2, | |
44 kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1, | |
45 kPositionCoords_Flag = (1 << kMatrixTypeKeyBits), | |
46 kKeyBitsPrivate = kMatrixTypeKeyBits + 1, | |
47 }; | |
48 | |
49 public: | |
50 | |
51 typedef GrBackendEffectFactory::EffectKey EffectKey; | |
52 | |
53 /** | |
54 * A GrGLCoordTransform key is kKeyBits long. The framework will automatical ly include them | |
55 * in their effect's EffectKey. | |
56 */ | |
57 enum { | |
58 kKeyBits = kKeyBitsPrivate, | |
59 kKeyMask = (1 << kKeyBits) - 1, | |
60 }; | |
61 | |
62 GrGLCoordTransform(GrCoordSet coordSet) | |
63 : fCoordSet(coordSet) { | |
64 fPrevMatrix = SkMatrix::InvalidMatrix(); | |
65 } | |
66 | |
67 /** | |
68 * Generates the key for the portion of the code emitted by this class's emi tCode() function. | |
69 */ | |
70 static EffectKey GenKey(const SkMatrix& effectMatrix, | |
71 const GrDrawEffect&, | |
72 GrCoordSet, | |
73 bool reverseY); | |
74 | |
75 /** | |
76 * Stores the name and type of a transformed set of coordinates. This class is passed to | |
77 * GrGLEffect::emitCode. | |
78 */ | |
79 class TransformedCoords { | |
80 public: | |
81 const char* c_str() const { return fName.c_str(); } | |
82 GrSLType type() const { return fType; } | |
83 const SkString& getName() const { return fName; } | |
84 // TODO: Remove the VS name when we have vertexless shaders, and gradien ts are reworked. | |
85 const SkString& getVSName() const { return fVSName; } | |
86 | |
87 private: | |
88 friend class GrGLCoordTransform; | |
89 | |
90 SkString fName; | |
91 GrSLType fType; | |
92 SkString fVSName; | |
93 }; | |
94 | |
95 /** | |
96 * Emits code to implement the matrix in the VS. A varying is added as an ou tput of the VS and | |
97 * input to the FS. The varying may be either a vec2f or vec3f depending upo n whether | |
98 * perspective interpolation is required or not. The names of the varying in the VS and FS as | |
99 * well as its type are written to the TransformedCoords* object. The suffix is an optional | |
100 * parameter that can be used to make all variables emitted by the object un ique within a stage. | |
101 * It is only necessary if multiple GrGLCoordTransform objects are used by a single GrGLEffect. | |
102 */ | |
103 void emitCode(GrGLShaderBuilder*, | |
104 EffectKey, | |
105 TransformedCoords*, | |
106 int suffix = 0); | |
107 | |
108 /** | |
109 * Call from a GrGLEffect's subclass to update the texture matrix. The matri x and reverseY value | |
110 * should match those used with GenKey. | |
111 */ | |
112 void setData(const GrGLUniformManager& uniformManager, | |
113 const SkMatrix& effectMatrix, | |
114 const GrDrawEffect& drawEffect, | |
115 bool reverseY); | |
116 | |
117 GrGLUniformManager::UniformHandle fUni; | |
118 GrSLType fUniType; | |
119 SkMatrix fPrevMatrix; | |
120 GrCoordSet fCoordSet; | |
121 }; | |
122 | |
123 #endif | |
OLD | NEW |