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 #include "GrGLProgram.h" | 8 #include "GrGLProgram.h" |
9 | 9 |
10 #include "GrAllocator.h" | 10 #include "GrAllocator.h" |
11 #include "GrEffect.h" | 11 #include "GrEffect.h" |
12 #include "GrCoordTransform.h" | 12 #include "GrCoordTransform.h" |
13 #include "GrDrawEffect.h" | 13 #include "GrDrawEffect.h" |
14 #include "GrGLEffect.h" | 14 #include "GrGLEffect.h" |
15 #include "GrGpuGL.h" | 15 #include "GrGpuGL.h" |
16 #include "GrGLShaderVar.h" | 16 #include "GrGLShaderVar.h" |
17 #include "GrGLSL.h" | 17 #include "GrGLSL.h" |
18 #include "SkXfermode.h" | 18 #include "SkXfermode.h" |
19 | 19 |
20 #define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X) | 20 #define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X) |
21 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X) | 21 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X) |
22 | 22 |
23 GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, | 23 GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, |
24 const GrGLProgramDesc& desc, | 24 const GrGLProgramDesc& desc, |
25 const GrEffectStage* colorStages[], | 25 const GrEffectStage* colorStages[], |
26 const GrEffectStage* coverageStages[]) { | 26 const GrEffectStage* coverageStages[]) { |
27 GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gpu, desc, colorStages, cove
rageStages)); | 27 GrGLShaderBuilder::GenProgramOutput output; |
28 if (!program->succeeded()) { | 28 SkAutoTUnref<GrGLUniformManager> uman(SkNEW_ARGS(GrGLUniformManager, (gpu)))
; |
29 delete program; | 29 if (GrGLShaderBuilder::GenProgram(gpu, uman, desc, colorStages, coverageStag
es, |
30 program = NULL; | 30 &output)) { |
| 31 SkASSERT(0 != output.fProgramID); |
| 32 return SkNEW_ARGS(GrGLProgram, (gpu, desc, uman, output)); |
31 } | 33 } |
32 return program; | 34 return NULL; |
33 } | 35 } |
34 | 36 |
35 GrGLProgram::GrGLProgram(GrGpuGL* gpu, | 37 GrGLProgram::GrGLProgram(GrGpuGL* gpu, |
36 const GrGLProgramDesc& desc, | 38 const GrGLProgramDesc& desc, |
37 const GrEffectStage* colorStages[], | 39 GrGLUniformManager* uman, |
38 const GrEffectStage* coverageStages[]) | 40 const GrGLShaderBuilder::GenProgramOutput& builderOutpu
t) |
39 : fGpu(gpu) | 41 : fProgramID(builderOutput.fProgramID) |
40 , fUniformManager(gpu) | 42 , fColor(GrColor_ILLEGAL) |
41 , fHasVertexShader(false) | 43 , fCoverage(GrColor_ILLEGAL) |
42 , fNumTexCoordSets(0) { | 44 , fDstCopyTexUnit(-1) |
43 fDesc = desc; | 45 , fColorEffects(builderOutput.fColorEffects) |
44 fProgramID = 0; | 46 , fCoverageEffects(builderOutput.fCoverageEffects) |
45 | 47 , fDesc(desc) |
46 fDstCopyTexUnit = -1; | 48 , fGpu(gpu) |
47 | 49 , fUniformManager(SkRef(uman)) |
48 fColor = GrColor_ILLEGAL; | 50 , fUniformHandles(builderOutput.fUniformHandles) |
49 | 51 , fHasVertexShader(builderOutput.fHasVS) |
50 GrGLShaderBuilder::GenProgramOutput output; | 52 , fNumTexCoordSets(builderOutput.fNumTexCoordSets) { |
51 | 53 this->initSamplerUniforms(); |
52 if (GrGLShaderBuilder::GenProgram(gpu, fUniformManager, desc, colorStages, c
overageStages, | |
53 &output)) { | |
54 fProgramID = output.fProgramID; | |
55 fUniformHandles = output.fUniformHandles; | |
56 fColorEffects.reset(output.fColorEffects); | |
57 fCoverageEffects.reset(output.fCoverageEffects); | |
58 fHasVertexShader = output.fHasVS; | |
59 fNumTexCoordSets = output.fNumTexCoordSets; | |
60 fGpu = gpu; | |
61 this->initSamplerUniforms(); | |
62 } | |
63 } | 54 } |
64 | 55 |
65 GrGLProgram::~GrGLProgram() { | 56 GrGLProgram::~GrGLProgram() { |
66 if (fProgramID) { | 57 if (fProgramID) { |
67 GL_CALL(DeleteProgram(fProgramID)); | 58 GL_CALL(DeleteProgram(fProgramID)); |
68 } | 59 } |
69 } | 60 } |
70 | 61 |
71 void GrGLProgram::abandon() { | 62 void GrGLProgram::abandon() { |
72 fProgramID = 0; | 63 fProgramID = 0; |
(...skipping 18 matching lines...) Expand all Loading... |
91 default: | 82 default: |
92 SkFAIL("Unexpected coverage output"); | 83 SkFAIL("Unexpected coverage output"); |
93 break; | 84 break; |
94 } | 85 } |
95 } | 86 } |
96 | 87 |
97 void GrGLProgram::initSamplerUniforms() { | 88 void GrGLProgram::initSamplerUniforms() { |
98 GL_CALL(UseProgram(fProgramID)); | 89 GL_CALL(UseProgram(fProgramID)); |
99 GrGLint texUnitIdx = 0; | 90 GrGLint texUnitIdx = 0; |
100 if (fUniformHandles.fDstCopySamplerUni.isValid()) { | 91 if (fUniformHandles.fDstCopySamplerUni.isValid()) { |
101 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId
x); | 92 fUniformManager->setSampler(fUniformHandles.fDstCopySamplerUni, texUnitI
dx); |
102 fDstCopyTexUnit = texUnitIdx++; | 93 fDstCopyTexUnit = texUnitIdx++; |
103 } | 94 } |
104 fColorEffects->initSamplers(fUniformManager, &texUnitIdx); | 95 fColorEffects->initSamplers(*fUniformManager, &texUnitIdx); |
105 fCoverageEffects->initSamplers(fUniformManager, &texUnitIdx); | 96 fCoverageEffects->initSamplers(*fUniformManager, &texUnitIdx); |
106 } | 97 } |
107 | 98 |
108 /////////////////////////////////////////////////////////////////////////////// | 99 /////////////////////////////////////////////////////////////////////////////// |
109 | 100 |
110 void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, | 101 void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, |
111 const GrEffectStage* colorStages[], | 102 const GrEffectStage* colorStages[], |
112 const GrEffectStage* coverageStages[], | 103 const GrEffectStage* coverageStages[], |
113 const GrDeviceCoordTexture* dstCopy, | 104 const GrDeviceCoordTexture* dstCopy, |
114 SharedGLState* sharedState) { | 105 SharedGLState* sharedState) { |
115 const GrDrawState& drawState = fGpu->getDrawState(); | 106 const GrDrawState& drawState = fGpu->getDrawState(); |
(...skipping 10 matching lines...) Expand all Loading... |
126 color = drawState.getColor(); | 117 color = drawState.getColor(); |
127 coverage = drawState.getCoverageColor(); | 118 coverage = drawState.getCoverageColor(); |
128 } | 119 } |
129 | 120 |
130 this->setColor(drawState, color, sharedState); | 121 this->setColor(drawState, color, sharedState); |
131 this->setCoverage(drawState, coverage, sharedState); | 122 this->setCoverage(drawState, coverage, sharedState); |
132 this->setMatrixAndRenderTargetHeight(drawState); | 123 this->setMatrixAndRenderTargetHeight(drawState); |
133 | 124 |
134 if (NULL != dstCopy) { | 125 if (NULL != dstCopy) { |
135 if (fUniformHandles.fDstCopyTopLeftUni.isValid()) { | 126 if (fUniformHandles.fDstCopyTopLeftUni.isValid()) { |
136 fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, | 127 fUniformManager->set2f(fUniformHandles.fDstCopyTopLeftUni, |
137 static_cast<GrGLfloat>(dstCopy->offset().fX), | 128 static_cast<GrGLfloat>(dstCopy->offset().fX), |
138 static_cast<GrGLfloat>(dstCopy->offset().fY)); | 129 static_cast<GrGLfloat>(dstCopy->offset().fY))
; |
139 fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, | 130 fUniformManager->set2f(fUniformHandles.fDstCopyScaleUni, |
140 1.f / dstCopy->texture()->width(), | 131 1.f / dstCopy->texture()->width(), |
141 1.f / dstCopy->texture()->height()); | 132 1.f / dstCopy->texture()->height()); |
142 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture())
; | 133 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture())
; |
143 static GrTextureParams kParams; // the default is clamp, nearest fil
tering. | 134 static GrTextureParams kParams; // the default is clamp, nearest fil
tering. |
144 fGpu->bindTexture(fDstCopyTexUnit, kParams, texture); | 135 fGpu->bindTexture(fDstCopyTexUnit, kParams, texture); |
145 } else { | 136 } else { |
146 SkASSERT(!fUniformHandles.fDstCopyScaleUni.isValid()); | 137 SkASSERT(!fUniformHandles.fDstCopyScaleUni.isValid()); |
147 SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid()); | 138 SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid()); |
148 } | 139 } |
149 } else { | 140 } else { |
150 SkASSERT(!fUniformHandles.fDstCopyTopLeftUni.isValid()); | 141 SkASSERT(!fUniformHandles.fDstCopyTopLeftUni.isValid()); |
151 SkASSERT(!fUniformHandles.fDstCopyScaleUni.isValid()); | 142 SkASSERT(!fUniformHandles.fDstCopyScaleUni.isValid()); |
152 SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid()); | 143 SkASSERT(!fUniformHandles.fDstCopySamplerUni.isValid()); |
153 } | 144 } |
154 | 145 |
155 fColorEffects->setData(fGpu, fUniformManager, colorStages); | 146 fColorEffects->setData(fGpu, *fUniformManager, colorStages); |
156 fCoverageEffects->setData(fGpu, fUniformManager, coverageStages); | 147 fCoverageEffects->setData(fGpu, *fUniformManager, coverageStages); |
157 | 148 |
158 | 149 |
159 // PathTexGen state applies to the the fixed function vertex shader. For | 150 // PathTexGen state applies to the the fixed function vertex shader. For |
160 // custom shaders, it's ignored, so we don't need to change the texgen | 151 // custom shaders, it's ignored, so we don't need to change the texgen |
161 // settings in that case. | 152 // settings in that case. |
162 if (!fHasVertexShader) { | 153 if (!fHasVertexShader) { |
163 fGpu->flushPathTexGenSettings(fNumTexCoordSets); | 154 fGpu->flushPathTexGenSettings(fNumTexCoordSets); |
164 } | 155 } |
165 } | 156 } |
166 | 157 |
(...skipping 13 matching lines...) Expand all Loading... |
180 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); | 171 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); |
181 sharedState->fConstAttribColor = color; | 172 sharedState->fConstAttribColor = color; |
182 sharedState->fConstAttribColorIndex = header.fColorAttribute
Index; | 173 sharedState->fConstAttribColorIndex = header.fColorAttribute
Index; |
183 } | 174 } |
184 break; | 175 break; |
185 case GrGLProgramDesc::kUniform_ColorInput: | 176 case GrGLProgramDesc::kUniform_ColorInput: |
186 if (fColor != color && fUniformHandles.fColorUni.isValid()) { | 177 if (fColor != color && fUniformHandles.fColorUni.isValid()) { |
187 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform | 178 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform |
188 GrGLfloat c[4]; | 179 GrGLfloat c[4]; |
189 GrColorToRGBAFloat(color, c); | 180 GrColorToRGBAFloat(color, c); |
190 fUniformManager.set4fv(fUniformHandles.fColorUni, 1, c); | 181 fUniformManager->set4fv(fUniformHandles.fColorUni, 1, c); |
191 fColor = color; | 182 fColor = color; |
192 } | 183 } |
193 sharedState->fConstAttribColorIndex = -1; | 184 sharedState->fConstAttribColorIndex = -1; |
194 break; | 185 break; |
195 case GrGLProgramDesc::kSolidWhite_ColorInput: | 186 case GrGLProgramDesc::kSolidWhite_ColorInput: |
196 case GrGLProgramDesc::kTransBlack_ColorInput: | 187 case GrGLProgramDesc::kTransBlack_ColorInput: |
197 sharedState->fConstAttribColorIndex = -1; | 188 sharedState->fConstAttribColorIndex = -1; |
198 break; | 189 break; |
199 default: | 190 default: |
200 SkFAIL("Unknown color type."); | 191 SkFAIL("Unknown color type."); |
(...skipping 18 matching lines...) Expand all Loading... |
219 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); | 210 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); |
220 sharedState->fConstAttribCoverage = coverage; | 211 sharedState->fConstAttribCoverage = coverage; |
221 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt
ributeIndex; | 212 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt
ributeIndex; |
222 } | 213 } |
223 break; | 214 break; |
224 case GrGLProgramDesc::kUniform_ColorInput: | 215 case GrGLProgramDesc::kUniform_ColorInput: |
225 if (fCoverage != coverage) { | 216 if (fCoverage != coverage) { |
226 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform | 217 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform |
227 GrGLfloat c[4]; | 218 GrGLfloat c[4]; |
228 GrColorToRGBAFloat(coverage, c); | 219 GrColorToRGBAFloat(coverage, c); |
229 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 1, c); | 220 fUniformManager->set4fv(fUniformHandles.fCoverageUni, 1, c); |
230 fCoverage = coverage; | 221 fCoverage = coverage; |
231 } | 222 } |
232 sharedState->fConstAttribCoverageIndex = -1; | 223 sharedState->fConstAttribCoverageIndex = -1; |
233 break; | 224 break; |
234 case GrGLProgramDesc::kSolidWhite_ColorInput: | 225 case GrGLProgramDesc::kSolidWhite_ColorInput: |
235 case GrGLProgramDesc::kTransBlack_ColorInput: | 226 case GrGLProgramDesc::kTransBlack_ColorInput: |
236 sharedState->fConstAttribCoverageIndex = -1; | 227 sharedState->fConstAttribCoverageIndex = -1; |
237 break; | 228 break; |
238 default: | 229 default: |
239 SkFAIL("Unknown coverage type."); | 230 SkFAIL("Unknown coverage type."); |
240 } | 231 } |
241 } else { | 232 } else { |
242 sharedState->fConstAttribCoverageIndex = -1; | 233 sharedState->fConstAttribCoverageIndex = -1; |
243 } | 234 } |
244 } | 235 } |
245 | 236 |
246 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { | 237 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { |
247 const GrRenderTarget* rt = drawState.getRenderTarget(); | 238 const GrRenderTarget* rt = drawState.getRenderTarget(); |
248 SkISize size; | 239 SkISize size; |
249 size.set(rt->width(), rt->height()); | 240 size.set(rt->width(), rt->height()); |
250 | 241 |
251 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. | 242 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. |
252 if (fUniformHandles.fRTHeightUni.isValid() && | 243 if (fUniformHandles.fRTHeightUni.isValid() && |
253 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { | 244 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { |
254 fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.f
Height)); | 245 fUniformManager->set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.
fHeight)); |
255 } | 246 } |
256 | 247 |
257 if (!fHasVertexShader) { | 248 if (!fHasVertexShader) { |
258 SkASSERT(!fUniformHandles.fViewMatrixUni.isValid()); | 249 SkASSERT(!fUniformHandles.fViewMatrixUni.isValid()); |
259 SkASSERT(!fUniformHandles.fRTAdjustmentUni.isValid()); | 250 SkASSERT(!fUniformHandles.fRTAdjustmentUni.isValid()); |
260 fGpu->setProjectionMatrix(drawState.getViewMatrix(), size, rt->origin())
; | 251 fGpu->setProjectionMatrix(drawState.getViewMatrix(), size, rt->origin())
; |
261 } else if (fMatrixState.fRenderTargetOrigin != rt->origin() || | 252 } else if (fMatrixState.fRenderTargetOrigin != rt->origin() || |
262 fMatrixState.fRenderTargetSize != size || | 253 fMatrixState.fRenderTargetSize != size || |
263 !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix())
) { | 254 !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix())
) { |
264 SkASSERT(fUniformHandles.fViewMatrixUni.isValid()); | 255 SkASSERT(fUniformHandles.fViewMatrixUni.isValid()); |
265 | 256 |
266 fMatrixState.fViewMatrix = drawState.getViewMatrix(); | 257 fMatrixState.fViewMatrix = drawState.getViewMatrix(); |
267 fMatrixState.fRenderTargetSize = size; | 258 fMatrixState.fRenderTargetSize = size; |
268 fMatrixState.fRenderTargetOrigin = rt->origin(); | 259 fMatrixState.fRenderTargetOrigin = rt->origin(); |
269 | 260 |
270 GrGLfloat viewMatrix[3 * 3]; | 261 GrGLfloat viewMatrix[3 * 3]; |
271 fMatrixState.getGLMatrix<3>(viewMatrix); | 262 fMatrixState.getGLMatrix<3>(viewMatrix); |
272 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix); | 263 fUniformManager->setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix)
; |
273 | 264 |
274 GrGLfloat rtAdjustmentVec[4]; | 265 GrGLfloat rtAdjustmentVec[4]; |
275 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); | 266 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); |
276 fUniformManager.set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustment
Vec); | 267 fUniformManager->set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustmen
tVec); |
277 } | 268 } |
278 } | 269 } |
OLD | NEW |