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 "GrGpuGL.h" | 8 #include "GrGpuGL.h" |
9 | 9 |
10 #include "GrEffect.h" | 10 #include "GrEffect.h" |
11 #include "GrGLEffect.h" | 11 #include "GrGLEffect.h" |
| 12 #include "GrGLPathRendering.h" |
| 13 #include "GrOptDrawState.h" |
12 #include "SkRTConf.h" | 14 #include "SkRTConf.h" |
13 #include "GrGLPathRendering.h" | |
14 #include "SkTSearch.h" | 15 #include "SkTSearch.h" |
15 | 16 |
16 #ifdef PROGRAM_CACHE_STATS | 17 #ifdef PROGRAM_CACHE_STATS |
17 SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, | 18 SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, |
18 "Display program cache usage."); | 19 "Display program cache usage."); |
19 #endif | 20 #endif |
20 | 21 |
21 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 22 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
22 | 23 |
23 struct GrGpuGL::ProgramCache::Entry { | 24 struct GrGpuGL::ProgramCache::Entry { |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 } | 198 } |
198 ++fCurrLRUStamp; | 199 ++fCurrLRUStamp; |
199 return entry->fProgram; | 200 return entry->fProgram; |
200 } | 201 } |
201 | 202 |
202 //////////////////////////////////////////////////////////////////////////////// | 203 //////////////////////////////////////////////////////////////////////////////// |
203 | 204 |
204 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) | 205 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) |
205 | 206 |
206 bool GrGpuGL::flushGraphicsState(DrawType type, const GrDeviceCoordTexture* dstC
opy) { | 207 bool GrGpuGL::flushGraphicsState(DrawType type, const GrDeviceCoordTexture* dstC
opy) { |
207 const GrDrawState& drawState = this->getDrawState(); | 208 SkAutoTUnref<GrOptDrawState> optState(this->getDrawState().createOptState())
; |
208 | 209 |
209 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. | 210 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. |
210 SkASSERT(drawState.getRenderTarget()); | 211 SkASSERT(optState->getRenderTarget()); |
211 | 212 |
212 if (kStencilPath_DrawType == type) { | 213 if (kStencilPath_DrawType == type) { |
213 const GrRenderTarget* rt = this->getDrawState().getRenderTarget(); | 214 const GrRenderTarget* rt = optState->getRenderTarget(); |
214 SkISize size; | 215 SkISize size; |
215 size.set(rt->width(), rt->height()); | 216 size.set(rt->width(), rt->height()); |
216 this->glPathRendering()->setProjectionMatrix(drawState.getViewMatrix(),
size, rt->origin()); | 217 this->glPathRendering()->setProjectionMatrix(optState->getViewMatrix(),
size, rt->origin()); |
217 } else { | 218 } else { |
218 this->flushMiscFixedFunctionState(); | 219 this->flushMiscFixedFunctionState(); |
219 | 220 |
220 GrBlendCoeff srcCoeff; | 221 GrBlendCoeff srcCoeff = optState->getSrcBlendCoeff(); |
221 GrBlendCoeff dstCoeff; | 222 GrBlendCoeff dstCoeff = optState->getDstBlendCoeff(); |
222 GrDrawState::BlendOptFlags blendOpts = drawState.getBlendOpts(false, &sr
cCoeff, &dstCoeff); | 223 |
223 if (GrDrawState::kSkipDraw_BlendOptFlag & blendOpts) { | 224 // In these blend coeff's we end up drawing nothing so we can skip draw
all together |
| 225 if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff && |
| 226 !optState->getStencil().doesWrite()) { |
224 return false; | 227 return false; |
225 } | 228 } |
226 | 229 |
227 const GrEffectStage* geometryProcessor = NULL; | 230 const GrEffectStage* geometryProcessor = NULL; |
228 SkSTArray<8, const GrEffectStage*, true> colorStages; | 231 SkSTArray<8, const GrEffectStage*, true> colorStages; |
229 SkSTArray<8, const GrEffectStage*, true> coverageStages; | 232 SkSTArray<8, const GrEffectStage*, true> coverageStages; |
230 GrGLProgramDesc desc; | 233 GrGLProgramDesc desc; |
231 if (!GrGLProgramDesc::Build(this->getDrawState(), | 234 if (!GrGLProgramDesc::Build(*optState.get(), |
232 type, | 235 type, |
233 blendOpts, | |
234 srcCoeff, | 236 srcCoeff, |
235 dstCoeff, | 237 dstCoeff, |
236 this, | 238 this, |
237 dstCopy, | 239 dstCopy, |
238 &geometryProcessor, | 240 &geometryProcessor, |
239 &colorStages, | 241 &colorStages, |
240 &coverageStages, | 242 &coverageStages, |
241 &desc)) { | 243 &desc)) { |
242 SkDEBUGFAIL("Failed to generate GL program descriptor"); | 244 SkDEBUGFAIL("Failed to generate GL program descriptor"); |
243 return false; | 245 return false; |
(...skipping 12 matching lines...) Expand all Loading... |
256 | 258 |
257 GrGLuint programID = fCurrentProgram->programID(); | 259 GrGLuint programID = fCurrentProgram->programID(); |
258 if (fHWProgramID != programID) { | 260 if (fHWProgramID != programID) { |
259 GL_CALL(UseProgram(programID)); | 261 GL_CALL(UseProgram(programID)); |
260 fHWProgramID = programID; | 262 fHWProgramID = programID; |
261 } | 263 } |
262 | 264 |
263 fCurrentProgram->overrideBlend(&srcCoeff, &dstCoeff); | 265 fCurrentProgram->overrideBlend(&srcCoeff, &dstCoeff); |
264 this->flushBlend(kDrawLines_DrawType == type, srcCoeff, dstCoeff); | 266 this->flushBlend(kDrawLines_DrawType == type, srcCoeff, dstCoeff); |
265 | 267 |
266 fCurrentProgram->setData(type, | 268 fCurrentProgram->setData(*optState.get(), |
267 blendOpts, | 269 type, |
268 geometryProcessor, | 270 geometryProcessor, |
269 colorStages.begin(), | 271 colorStages.begin(), |
270 coverageStages.begin(), | 272 coverageStages.begin(), |
271 dstCopy, | 273 dstCopy, |
272 &fSharedGLProgramState); | 274 &fSharedGLProgramState); |
273 } | 275 } |
274 | 276 |
275 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(drawState.getRenderT
arget()); | 277 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState->getRenderT
arget()); |
276 this->flushStencil(type); | 278 this->flushStencil(type); |
277 this->flushScissor(glRT->getViewport(), glRT->origin()); | 279 this->flushScissor(glRT->getViewport(), glRT->origin()); |
278 this->flushAAState(type); | 280 this->flushAAState(type); |
279 | 281 |
280 SkIRect* devRect = NULL; | 282 SkIRect* devRect = NULL; |
281 SkIRect devClipBounds; | 283 SkIRect devClipBounds; |
282 if (drawState.isClipState()) { | 284 if (optState->isClipState()) { |
283 this->getClip()->getConservativeBounds(drawState.getRenderTarget(), &dev
ClipBounds); | 285 this->getClip()->getConservativeBounds(optState->getRenderTarget(), &dev
ClipBounds); |
284 devRect = &devClipBounds; | 286 devRect = &devClipBounds; |
285 } | 287 } |
286 // This must come after textures are flushed because a texture may need | 288 // This must come after textures are flushed because a texture may need |
287 // to be msaa-resolved (which will modify bound FBO state). | 289 // to be msaa-resolved (which will modify bound FBO state). |
288 this->flushRenderTarget(glRT, devRect); | 290 this->flushRenderTarget(glRT, devRect); |
289 | 291 |
290 return true; | 292 return true; |
291 } | 293 } |
292 | 294 |
293 void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) { | 295 void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) { |
| 296 SkAutoTUnref<GrOptDrawState> optState(this->getDrawState().createOptState())
; |
294 | 297 |
295 GrGLsizei stride = static_cast<GrGLsizei>(this->getDrawState().getVertexStri
de()); | 298 GrGLsizei stride = static_cast<GrGLsizei>(optState->getVertexStride()); |
296 | 299 |
297 size_t vertexOffsetInBytes = stride * info.startVertex(); | 300 size_t vertexOffsetInBytes = stride * info.startVertex(); |
298 | 301 |
299 const GeometryPoolState& geoPoolState = this->getGeomPoolState(); | 302 const GeometryPoolState& geoPoolState = this->getGeomPoolState(); |
300 | 303 |
301 GrGLVertexBuffer* vbuf; | 304 GrGLVertexBuffer* vbuf; |
302 switch (this->getGeomSrc().fVertexSrc) { | 305 switch (this->getGeomSrc().fVertexSrc) { |
303 case kBuffer_GeometrySrcType: | 306 case kBuffer_GeometrySrcType: |
304 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; | 307 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; |
305 break; | 308 break; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 } | 342 } |
340 | 343 |
341 SkASSERT(ibuf); | 344 SkASSERT(ibuf); |
342 SkASSERT(!ibuf->isMapped()); | 345 SkASSERT(!ibuf->isMapped()); |
343 *indexOffsetInBytes += ibuf->baseOffset(); | 346 *indexOffsetInBytes += ibuf->baseOffset(); |
344 } | 347 } |
345 GrGLAttribArrayState* attribState = | 348 GrGLAttribArrayState* attribState = |
346 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); | 349 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); |
347 | 350 |
348 if (fCurrentProgram->hasVertexShader()) { | 351 if (fCurrentProgram->hasVertexShader()) { |
349 int vertexAttribCount = this->getDrawState().getVertexAttribCount(); | 352 int vertexAttribCount = optState->getVertexAttribCount(); |
350 uint32_t usedAttribArraysMask = 0; | 353 uint32_t usedAttribArraysMask = 0; |
351 const GrVertexAttrib* vertexAttrib = this->getDrawState().getVertexAttri
bs(); | 354 const GrVertexAttrib* vertexAttrib = optState->getVertexAttribs(); |
352 | |
353 bool canIgnoreColorAttrib = this->getDrawState().canIgnoreColorAttribute
(); | |
354 | 355 |
355 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; | 356 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; |
356 ++vertexAttribIndex, ++vertexAttrib) { | 357 ++vertexAttribIndex, ++vertexAttrib) { |
357 | |
358 if (kColor_GrVertexAttribBinding != vertexAttrib->fBinding || !canIg
noreColorAttrib) { | |
359 usedAttribArraysMask |= (1 << vertexAttribIndex); | 358 usedAttribArraysMask |= (1 << vertexAttribIndex); |
360 GrVertexAttribType attribType = vertexAttrib->fType; | 359 GrVertexAttribType attribType = vertexAttrib->fType; |
361 attribState->set(this, | 360 attribState->set(this, |
362 vertexAttribIndex, | 361 vertexAttribIndex, |
363 vbuf, | 362 vbuf, |
364 GrGLAttribTypeToLayout(attribType).fCount, | 363 GrGLAttribTypeToLayout(attribType).fCount, |
365 GrGLAttribTypeToLayout(attribType).fType, | 364 GrGLAttribTypeToLayout(attribType).fType, |
366 GrGLAttribTypeToLayout(attribType).fNormalized, | 365 GrGLAttribTypeToLayout(attribType).fNormalized, |
367 stride, | 366 stride, |
368 reinterpret_cast<GrGLvoid*>( | 367 reinterpret_cast<GrGLvoid*>( |
369 vertexOffsetInBytes + vertexAttrib->fOffset)); | 368 vertexOffsetInBytes + vertexAttrib->fOffset)); |
370 } | |
371 } | 369 } |
372 attribState->disableUnusedArrays(this, usedAttribArraysMask); | 370 attribState->disableUnusedArrays(this, usedAttribArraysMask); |
373 } | 371 } |
374 } | 372 } |
OLD | NEW |