OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 | 8 |
9 #ifndef GrGLProgram_DEFINED | 9 #ifndef GrGLProgram_DEFINED |
10 #define GrGLProgram_DEFINED | 10 #define GrGLProgram_DEFINED |
(...skipping 20 matching lines...) Expand all Loading... |
31 * because we will bind a texture slot to it and never change it | 31 * because we will bind a texture slot to it and never change it |
32 * Uniforms are program-local so we can't rely on fHWState to hold the | 32 * Uniforms are program-local so we can't rely on fHWState to hold the |
33 * previous uniform state after a program change. | 33 * previous uniform state after a program change. |
34 */ | 34 */ |
35 class GrGLProgram : public GrRefCnt { | 35 class GrGLProgram : public GrRefCnt { |
36 public: | 36 public: |
37 SK_DECLARE_INST_COUNT(GrGLProgram) | 37 SK_DECLARE_INST_COUNT(GrGLProgram) |
38 | 38 |
39 static GrGLProgram* Create(const GrGLContext& gl, | 39 static GrGLProgram* Create(const GrGLContext& gl, |
40 const GrGLProgramDesc& desc, | 40 const GrGLProgramDesc& desc, |
41 const GrEffectStage* stages[]); | 41 const GrEffectStage* colorStages[], |
| 42 const GrEffectStage* coverageStages[]); |
42 | 43 |
43 virtual ~GrGLProgram(); | 44 virtual ~GrGLProgram(); |
44 | 45 |
45 /** | 46 /** |
46 * Call to abandon GL objects owned by this program. | 47 * Call to abandon GL objects owned by this program. |
47 */ | 48 */ |
48 void abandon(); | 49 void abandon(); |
49 | 50 |
50 /** | 51 /** |
51 * The shader may modify the blend coefficients. Params are in/out. | 52 * The shader may modify the blend coefficients. Params are in/out. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 fViewMatrix = SkMatrix::InvalidMatrix(); | 97 fViewMatrix = SkMatrix::InvalidMatrix(); |
97 fRenderTargetSize.fWidth = -1; | 98 fRenderTargetSize.fWidth = -1; |
98 fRenderTargetSize.fHeight = -1; | 99 fRenderTargetSize.fHeight = -1; |
99 fRenderTargetOrigin = (GrSurfaceOrigin) -1; | 100 fRenderTargetOrigin = (GrSurfaceOrigin) -1; |
100 } | 101 } |
101 }; | 102 }; |
102 | 103 |
103 /** | 104 /** |
104 * This function uploads uniforms and calls each GrGLEffect's setData. It is
called before a | 105 * This function uploads uniforms and calls each GrGLEffect's setData. It is
called before a |
105 * draw occurs using the program after the program has already been bound. I
t also uses the | 106 * draw occurs using the program after the program has already been bound. I
t also uses the |
106 * GrGpuGL object to bind the textures required by the GrGLEffects. | 107 * GrGpuGL object to bind the textures required by the GrGLEffects. The colo
r and coverage |
| 108 * stages come from GrGLProgramDesc::Build(). |
107 */ | 109 */ |
108 void setData(GrGpuGL*, | 110 void setData(GrGpuGL*, |
109 GrDrawState::BlendOptFlags, | 111 GrDrawState::BlendOptFlags, |
110 const GrEffectStage* stages[], // output of GrGLProgramDe
sc:Build() | 112 const GrEffectStage* colorStages[], |
| 113 const GrEffectStage* coverageStages[], |
111 const GrDeviceCoordTexture* dstCopy, // can be NULL | 114 const GrDeviceCoordTexture* dstCopy, // can be NULL |
112 SharedGLState*); | 115 SharedGLState*); |
113 | 116 |
114 private: | 117 private: |
115 GrGLProgram(const GrGLContext& gl, | |
116 const GrGLProgramDesc& desc, | |
117 const GrEffectStage* stages[]); | |
118 | |
119 bool succeeded() const { return 0 != fProgramID; } | |
120 | |
121 /** | |
122 * This is the heavy initialization routine for building a GLProgram. stages
is all the enabled | |
123 * color stages followed by all the enabled coverage stages as output by | |
124 * GrGLProgramDesc::Build() | |
125 */ | |
126 bool genProgram(const GrEffectStage* stages[]); | |
127 | |
128 GrSLConstantVec genInputColor(GrGLShaderBuilder* builder, SkString* inColor)
; | |
129 | |
130 GrSLConstantVec genInputCoverage(GrGLShaderBuilder* builder, SkString* inCov
erage); | |
131 | |
132 void genGeometryShader(GrGLShaderBuilder* segments) const; | |
133 | |
134 typedef GrGLUniformManager::UniformHandle UniformHandle; | 118 typedef GrGLUniformManager::UniformHandle UniformHandle; |
135 | 119 |
136 // Creates a GL program ID, binds shader attributes to GL vertex attrs, and
links the program | |
137 bool bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& builder, | |
138 bool bindColorOut, | |
139 bool bindDualSrcOut); | |
140 | |
141 // Sets the texture units for samplers | |
142 void initSamplerUniforms(); | |
143 | |
144 bool compileShaders(const GrGLShaderBuilder& builder); | |
145 | |
146 const char* adjustInColor(const SkString& inColor) const; | |
147 | |
148 // Helper for setData(). Makes GL calls to specify the initial color when th
ere is not | |
149 // per-vertex colors. | |
150 void setColor(const GrDrawState&, GrColor color, SharedGLState*); | |
151 | |
152 // Helper for setData(). Makes GL calls to specify the initial coverage when
there is not | |
153 // per-vertex coverages. | |
154 void setCoverage(const GrDrawState&, GrColor coverage, SharedGLState*); | |
155 | |
156 // Helper for setData() that sets the view matrix and loads the render targe
t height uniform | |
157 void setMatrixAndRenderTargetHeight(const GrDrawState&); | |
158 | |
159 // handles for uniforms (aside from per-effect samplers) | 120 // handles for uniforms (aside from per-effect samplers) |
160 struct UniformHandles { | 121 struct UniformHandles { |
161 UniformHandle fViewMatrixUni; | 122 UniformHandle fViewMatrixUni; |
162 UniformHandle fColorUni; | 123 UniformHandle fColorUni; |
163 UniformHandle fCoverageUni; | 124 UniformHandle fCoverageUni; |
164 UniformHandle fColorFilterUni; | 125 UniformHandle fColorFilterUni; |
165 | 126 |
166 // We use the render target height to provide a y-down frag coord when s
pecifying | 127 // We use the render target height to provide a y-down frag coord when s
pecifying |
167 // origin_upper_left is not supported. | 128 // origin_upper_left is not supported. |
168 UniformHandle fRTHeightUni; | 129 UniformHandle fRTHeightUni; |
(...skipping 19 matching lines...) Expand all Loading... |
188 typedef SkSTArray<4, int, true> TextureUnitSArray; | 149 typedef SkSTArray<4, int, true> TextureUnitSArray; |
189 | 150 |
190 struct EffectAndSamplers { | 151 struct EffectAndSamplers { |
191 EffectAndSamplers() : fGLEffect(NULL) {} | 152 EffectAndSamplers() : fGLEffect(NULL) {} |
192 ~EffectAndSamplers() { delete fGLEffect; } | 153 ~EffectAndSamplers() { delete fGLEffect; } |
193 GrGLEffect* fGLEffect; | 154 GrGLEffect* fGLEffect; |
194 SamplerUniSArray fSamplerUnis; // sampler uni handles for effect's G
rTextureAccess | 155 SamplerUniSArray fSamplerUnis; // sampler uni handles for effect's G
rTextureAccess |
195 TextureUnitSArray fTextureUnits; // texture unit used for each entry o
f fSamplerUnis | 156 TextureUnitSArray fTextureUnits; // texture unit used for each entry o
f fSamplerUnis |
196 }; | 157 }; |
197 | 158 |
| 159 GrGLProgram(const GrGLContext& gl, |
| 160 const GrGLProgramDesc& desc, |
| 161 const GrEffectStage* colorStages[], |
| 162 const GrEffectStage* coverageStages[]); |
| 163 |
| 164 bool succeeded() const { return 0 != fProgramID; } |
| 165 |
| 166 /** |
| 167 * This is the heavy initialization routine for building a GLProgram. colorS
tages and |
| 168 * coverageStages correspond to the output of GrGLProgramDesc::Build(). |
| 169 */ |
| 170 bool genProgram(const GrEffectStage* colorStages[], const GrEffectStage* cov
erageStages[]); |
| 171 |
| 172 GrSLConstantVec genInputColor(GrGLShaderBuilder* builder, SkString* inColor)
; |
| 173 |
| 174 GrSLConstantVec genInputCoverage(GrGLShaderBuilder* builder, SkString* inCov
erage); |
| 175 |
| 176 void genGeometryShader(GrGLShaderBuilder* segments) const; |
| 177 |
| 178 // Creates a GL program ID, binds shader attributes to GL vertex attrs, and
links the program |
| 179 bool bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& builder, |
| 180 bool bindColorOut, |
| 181 bool bindDualSrcOut); |
| 182 |
| 183 // Sets the texture units for samplers |
| 184 void initSamplerUniforms(); |
| 185 void initEffectSamplerUniforms(EffectAndSamplers* effect, int* texUnitIdx); |
| 186 |
| 187 bool compileShaders(const GrGLShaderBuilder& builder); |
| 188 |
| 189 const char* adjustInColor(const SkString& inColor) const; |
| 190 |
| 191 // Helper for setData(). |
| 192 void setEffectData(GrGpuGL* gpu, const GrEffectStage& stage, const EffectAnd
Samplers& effect); |
| 193 |
| 194 // Helper for setData(). Makes GL calls to specify the initial color when th
ere is not |
| 195 // per-vertex colors. |
| 196 void setColor(const GrDrawState&, GrColor color, SharedGLState*); |
| 197 |
| 198 // Helper for setData(). Makes GL calls to specify the initial coverage when
there is not |
| 199 // per-vertex coverages. |
| 200 void setCoverage(const GrDrawState&, GrColor coverage, SharedGLState*); |
| 201 |
| 202 // Helper for setData() that sets the view matrix and loads the render targe
t height uniform |
| 203 void setMatrixAndRenderTargetHeight(const GrDrawState&); |
| 204 |
198 // GL IDs | 205 // GL IDs |
199 GrGLuint fVShaderID; | 206 GrGLuint fVShaderID; |
200 GrGLuint fGShaderID; | 207 GrGLuint fGShaderID; |
201 GrGLuint fFShaderID; | 208 GrGLuint fFShaderID; |
202 GrGLuint fProgramID; | 209 GrGLuint fProgramID; |
203 | 210 |
204 // these reflect the current values of uniforms (GL uniform values travel wi
th program) | 211 // these reflect the current values of uniforms (GL uniform values travel wi
th program) |
205 MatrixState fMatrixState; | 212 MatrixState fMatrixState; |
206 GrColor fColor; | 213 GrColor fColor; |
207 GrColor fCoverage; | 214 GrColor fCoverage; |
208 GrColor fColorFilterColor; | 215 GrColor fColorFilterColor; |
209 int fDstCopyTexUnit; | 216 int fDstCopyTexUnit; |
210 | 217 |
211 SkTArray<EffectAndSamplers> fEffectStates; | 218 SkTArray<EffectAndSamplers> fColorEffects; |
| 219 SkTArray<EffectAndSamplers> fCoverageEffects; |
212 | 220 |
213 GrGLProgramDesc fDesc; | 221 GrGLProgramDesc fDesc; |
214 const GrGLContext& fContext; | 222 const GrGLContext& fContext; |
215 | 223 |
216 GrGLUniformManager fUniformManager; | 224 GrGLUniformManager fUniformManager; |
217 UniformHandles fUniformHandles; | 225 UniformHandles fUniformHandles; |
218 | 226 |
219 typedef GrRefCnt INHERITED; | 227 typedef GrRefCnt INHERITED; |
220 }; | 228 }; |
221 | 229 |
222 #endif | 230 #endif |
OLD | NEW |