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 #include "GrGLProgram.h" | 8 #include "GrGLProgram.h" |
8 | 9 |
9 #include "GrAllocator.h" | 10 #include "GrAllocator.h" |
10 #include "GrEffect.h" | 11 #include "GrEffect.h" |
11 #include "GrCoordTransform.h" | 12 #include "GrCoordTransform.h" |
12 #include "GrDrawEffect.h" | 13 #include "GrDrawEffect.h" |
13 #include "GrGLEffect.h" | 14 #include "GrGLEffect.h" |
14 #include "GrGpuGL.h" | 15 #include "GrGpuGL.h" |
15 #include "GrGLPathRendering.h" | 16 #include "GrGLPathRendering.h" |
16 #include "GrGLShaderVar.h" | 17 #include "GrGLShaderVar.h" |
17 #include "GrGLSL.h" | 18 #include "GrGLSL.h" |
18 #include "GrOptDrawState.h" | |
19 #include "SkXfermode.h" | 19 #include "SkXfermode.h" |
20 | 20 |
21 #define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X) | 21 #define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X) |
22 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X) | 22 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X) |
23 | 23 |
24 GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, | 24 GrGLProgram* GrGLProgram::Create(GrGpuGL* gpu, |
25 const GrGLProgramDesc& desc, | 25 const GrGLProgramDesc& desc, |
26 const GrEffectStage* geometryProcessor, | 26 const GrEffectStage* geometryProcessor, |
27 const GrEffectStage* colorStages[], | 27 const GrEffectStage* colorStages[], |
28 const GrEffectStage* coverageStages[]) { | 28 const GrEffectStage* coverageStages[]) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 } | 102 } |
103 if (fGeometryProcessor.get()) { | 103 if (fGeometryProcessor.get()) { |
104 fGeometryProcessor->initSamplers(fProgramDataManager, &texUnitIdx); | 104 fGeometryProcessor->initSamplers(fProgramDataManager, &texUnitIdx); |
105 } | 105 } |
106 fColorEffects->initSamplers(fProgramDataManager, &texUnitIdx); | 106 fColorEffects->initSamplers(fProgramDataManager, &texUnitIdx); |
107 fCoverageEffects->initSamplers(fProgramDataManager, &texUnitIdx); | 107 fCoverageEffects->initSamplers(fProgramDataManager, &texUnitIdx); |
108 } | 108 } |
109 | 109 |
110 /////////////////////////////////////////////////////////////////////////////// | 110 /////////////////////////////////////////////////////////////////////////////// |
111 | 111 |
112 void GrGLProgram::setData(const GrOptDrawState& optState, | 112 void GrGLProgram::setData(GrGpu::DrawType drawType, |
113 GrGpu::DrawType drawType, | 113 GrDrawState::BlendOptFlags blendOpts, |
114 const GrEffectStage* geometryProcessor, | 114 const GrEffectStage* geometryProcessor, |
115 const GrEffectStage* colorStages[], | 115 const GrEffectStage* colorStages[], |
116 const GrEffectStage* coverageStages[], | 116 const GrEffectStage* coverageStages[], |
117 const GrDeviceCoordTexture* dstCopy, | 117 const GrDeviceCoordTexture* dstCopy, |
118 SharedGLState* sharedState) { | 118 SharedGLState* sharedState) { |
119 GrColor color = optState.getColor(); | 119 const GrDrawState& drawState = fGpu->getDrawState(); |
120 GrColor coverage = optState.getCoverageColor(); | |
121 | 120 |
122 this->setColor(optState, color, sharedState); | 121 GrColor color; |
123 this->setCoverage(optState, coverage, sharedState); | 122 GrColor coverage; |
124 this->setMatrixAndRenderTargetHeight(drawType, optState); | 123 if (blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag) { |
| 124 color = 0; |
| 125 coverage = 0; |
| 126 } else if (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) { |
| 127 color = 0xffffffff; |
| 128 coverage = drawState.getCoverageColor(); |
| 129 } else { |
| 130 color = drawState.getColor(); |
| 131 coverage = drawState.getCoverageColor(); |
| 132 } |
| 133 |
| 134 this->setColor(drawState, color, sharedState); |
| 135 this->setCoverage(drawState, coverage, sharedState); |
| 136 this->setMatrixAndRenderTargetHeight(drawType, drawState); |
125 | 137 |
126 if (dstCopy) { | 138 if (dstCopy) { |
127 if (fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid()) { | 139 if (fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid()) { |
128 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyTopLeftUni, | 140 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyTopLeftUni, |
129 static_cast<GrGLfloat>(dstCopy->offset().
fX), | 141 static_cast<GrGLfloat>(dstCopy->offset().
fX), |
130 static_cast<GrGLfloat>(dstCopy->offset().
fY)); | 142 static_cast<GrGLfloat>(dstCopy->offset().
fY)); |
131 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyScaleUni, | 143 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyScaleUni, |
132 1.f / dstCopy->texture()->width(), | 144 1.f / dstCopy->texture()->width(), |
133 1.f / dstCopy->texture()->height()); | 145 1.f / dstCopy->texture()->height()); |
134 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture())
; | 146 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture())
; |
(...skipping 17 matching lines...) Expand all Loading... |
152 fCoverageEffects->setData(fGpu, drawType,fProgramDataManager, coverageStages
); | 164 fCoverageEffects->setData(fGpu, drawType,fProgramDataManager, coverageStages
); |
153 | 165 |
154 // PathTexGen state applies to the the fixed function vertex shader. For | 166 // PathTexGen state applies to the the fixed function vertex shader. For |
155 // custom shaders, it's ignored, so we don't need to change the texgen | 167 // custom shaders, it's ignored, so we don't need to change the texgen |
156 // settings in that case. | 168 // settings in that case. |
157 if (!fHasVertexShader) { | 169 if (!fHasVertexShader) { |
158 fGpu->glPathRendering()->flushPathTexGenSettings(fTexCoordSetCnt); | 170 fGpu->glPathRendering()->flushPathTexGenSettings(fTexCoordSetCnt); |
159 } | 171 } |
160 } | 172 } |
161 | 173 |
162 void GrGLProgram::setColor(const GrOptDrawState& optState, | 174 void GrGLProgram::setColor(const GrDrawState& drawState, |
163 GrColor color, | 175 GrColor color, |
164 SharedGLState* sharedState) { | 176 SharedGLState* sharedState) { |
165 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); | 177 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
166 if (!optState.hasColorVertexAttribute()) { | 178 if (!drawState.hasColorVertexAttribute() || drawState.canIgnoreColorAttribut
e()) { |
167 switch (header.fColorInput) { | 179 switch (header.fColorInput) { |
168 case GrGLProgramDesc::kAttribute_ColorInput: | 180 case GrGLProgramDesc::kAttribute_ColorInput: |
169 SkASSERT(-1 != header.fColorAttributeIndex); | 181 SkASSERT(-1 != header.fColorAttributeIndex); |
170 if (sharedState->fConstAttribColor != color || | 182 if (sharedState->fConstAttribColor != color || |
171 sharedState->fConstAttribColorIndex != header.fColorAttribut
eIndex) { | 183 sharedState->fConstAttribColorIndex != header.fColorAttribut
eIndex) { |
172 // OpenGL ES only supports the float varieties of glVertexAt
trib | 184 // OpenGL ES only supports the float varieties of glVertexAt
trib |
173 GrGLfloat c[4]; | 185 GrGLfloat c[4]; |
174 GrColorToRGBAFloat(color, c); | 186 GrColorToRGBAFloat(color, c); |
175 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); | 187 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); |
176 sharedState->fConstAttribColor = color; | 188 sharedState->fConstAttribColor = color; |
(...skipping 14 matching lines...) Expand all Loading... |
191 sharedState->fConstAttribColorIndex = -1; | 203 sharedState->fConstAttribColorIndex = -1; |
192 break; | 204 break; |
193 default: | 205 default: |
194 SkFAIL("Unexpected color type."); | 206 SkFAIL("Unexpected color type."); |
195 } | 207 } |
196 } else { | 208 } else { |
197 sharedState->fConstAttribColorIndex = -1; | 209 sharedState->fConstAttribColorIndex = -1; |
198 } | 210 } |
199 } | 211 } |
200 | 212 |
201 void GrGLProgram::setCoverage(const GrOptDrawState& optState, | 213 void GrGLProgram::setCoverage(const GrDrawState& drawState, |
202 GrColor coverage, | 214 GrColor coverage, |
203 SharedGLState* sharedState) { | 215 SharedGLState* sharedState) { |
204 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); | 216 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); |
205 if (!optState.hasCoverageVertexAttribute()) { | 217 if (!drawState.hasCoverageVertexAttribute()) { |
206 switch (header.fCoverageInput) { | 218 switch (header.fCoverageInput) { |
207 case GrGLProgramDesc::kAttribute_ColorInput: | 219 case GrGLProgramDesc::kAttribute_ColorInput: |
208 if (sharedState->fConstAttribCoverage != coverage || | 220 if (sharedState->fConstAttribCoverage != coverage || |
209 sharedState->fConstAttribCoverageIndex != header.fCoverageAt
tributeIndex) { | 221 sharedState->fConstAttribCoverageIndex != header.fCoverageAt
tributeIndex) { |
210 // OpenGL ES only supports the float varieties of glVertexA
ttrib | 222 // OpenGL ES only supports the float varieties of glVertexA
ttrib |
211 GrGLfloat c[4]; | 223 GrGLfloat c[4]; |
212 GrColorToRGBAFloat(coverage, c); | 224 GrColorToRGBAFloat(coverage, c); |
213 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); | 225 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); |
214 sharedState->fConstAttribCoverage = coverage; | 226 sharedState->fConstAttribCoverage = coverage; |
215 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt
ributeIndex; | 227 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt
ributeIndex; |
(...skipping 14 matching lines...) Expand all Loading... |
230 break; | 242 break; |
231 default: | 243 default: |
232 SkFAIL("Unexpected coverage type."); | 244 SkFAIL("Unexpected coverage type."); |
233 } | 245 } |
234 } else { | 246 } else { |
235 sharedState->fConstAttribCoverageIndex = -1; | 247 sharedState->fConstAttribCoverageIndex = -1; |
236 } | 248 } |
237 } | 249 } |
238 | 250 |
239 void GrGLProgram::setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType, | 251 void GrGLProgram::setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType, |
240 const GrOptDrawState& optState)
{ | 252 const GrDrawState& drawState) { |
241 const GrRenderTarget* rt = optState.getRenderTarget(); | 253 const GrRenderTarget* rt = drawState.getRenderTarget(); |
242 SkISize size; | 254 SkISize size; |
243 size.set(rt->width(), rt->height()); | 255 size.set(rt->width(), rt->height()); |
244 | 256 |
245 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. | 257 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. |
246 if (fBuiltinUniformHandles.fRTHeightUni.isValid() && | 258 if (fBuiltinUniformHandles.fRTHeightUni.isValid() && |
247 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { | 259 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { |
248 fProgramDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, | 260 fProgramDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, |
249 SkIntToScalar(size.fHeight)); | 261 SkIntToScalar(size.fHeight)); |
250 } | 262 } |
251 | 263 |
252 if (GrGpu::IsPathRenderingDrawType(drawType)) { | 264 if (GrGpu::IsPathRenderingDrawType(drawType)) { |
253 fGpu->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s
ize, rt->origin()); | 265 fGpu->glPathRendering()->setProjectionMatrix(drawState.getViewMatrix(),
size, rt->origin()); |
254 } else if (fMatrixState.fRenderTargetOrigin != rt->origin() || | 266 } else if (fMatrixState.fRenderTargetOrigin != rt->origin() || |
255 fMatrixState.fRenderTargetSize != size || | 267 fMatrixState.fRenderTargetSize != size || |
256 !fMatrixState.fViewMatrix.cheapEqualTo(optState.getViewMatrix()))
{ | 268 !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix())
) { |
257 SkASSERT(fBuiltinUniformHandles.fViewMatrixUni.isValid()); | 269 SkASSERT(fBuiltinUniformHandles.fViewMatrixUni.isValid()); |
258 | 270 |
259 fMatrixState.fViewMatrix = optState.getViewMatrix(); | 271 fMatrixState.fViewMatrix = drawState.getViewMatrix(); |
260 fMatrixState.fRenderTargetSize = size; | 272 fMatrixState.fRenderTargetSize = size; |
261 fMatrixState.fRenderTargetOrigin = rt->origin(); | 273 fMatrixState.fRenderTargetOrigin = rt->origin(); |
262 | 274 |
263 GrGLfloat viewMatrix[3 * 3]; | 275 GrGLfloat viewMatrix[3 * 3]; |
264 fMatrixState.getGLMatrix<3>(viewMatrix); | 276 fMatrixState.getGLMatrix<3>(viewMatrix); |
265 fProgramDataManager.setMatrix3f(fBuiltinUniformHandles.fViewMatrixUni, v
iewMatrix); | 277 fProgramDataManager.setMatrix3f(fBuiltinUniformHandles.fViewMatrixUni, v
iewMatrix); |
266 | 278 |
267 GrGLfloat rtAdjustmentVec[4]; | 279 GrGLfloat rtAdjustmentVec[4]; |
268 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); | 280 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); |
269 fProgramDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, r
tAdjustmentVec); | 281 fProgramDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, r
tAdjustmentVec); |
270 } | 282 } |
271 } | 283 } |
OLD | NEW |