OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrDrawTarget.h" | 9 #include "GrDrawTarget.h" |
10 | 10 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 GrPipelineBuilder::AutoRestoreStencil ars; | 134 GrPipelineBuilder::AutoRestoreStencil ars; |
135 if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &batch->b
ounds())) { | 135 if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &batch->b
ounds())) { |
136 return; | 136 return; |
137 } | 137 } |
138 | 138 |
139 // Batch bounds are tight, so for dev copies | 139 // Batch bounds are tight, so for dev copies |
140 // TODO move this into setupDstReadIfNecessary when paths are in batch | 140 // TODO move this into setupDstReadIfNecessary when paths are in batch |
141 SkRect bounds = batch->bounds(); | 141 SkRect bounds = batch->bounds(); |
142 bounds.outset(0.5f, 0.5f); | 142 bounds.outset(0.5f, 0.5f); |
143 | 143 |
144 GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, batc
h, &bounds, | 144 GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, bat
ch, &bounds, |
145 this); | 145 this); |
146 if (pipelineInfo.mustSkipDraw()) { | 146 if (!pipelineInfo.valid()) { |
147 return; | 147 return; |
148 } | 148 } |
149 | 149 if (!batch->installPipeline(pipelineInfo.pipelineCreateArgs())) { |
150 this->onDrawBatch(batch, pipelineInfo); | 150 return; |
| 151 } |
| 152 this->onDrawBatch(batch); |
151 } | 153 } |
152 | 154 |
153 static const GrStencilSettings& winding_path_stencil_settings() { | 155 static const GrStencilSettings& winding_path_stencil_settings() { |
154 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | 156 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, |
155 kIncClamp_StencilOp, | 157 kIncClamp_StencilOp, |
156 kIncClamp_StencilOp, | 158 kIncClamp_StencilOp, |
157 kAlwaysIfInClip_StencilFunc, | 159 kAlwaysIfInClip_StencilFunc, |
158 0xFFFF, 0xFFFF, 0xFFFF); | 160 0xFFFF, 0xFFFF, 0xFFFF); |
159 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | 161 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
160 } | 162 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &devBound
s)) { | 230 if (!this->setupClip(pipelineBuilder, &arfps, &ars, &scissorState, &devBound
s)) { |
229 return; | 231 return; |
230 } | 232 } |
231 | 233 |
232 // set stencil settings for path | 234 // set stencil settings for path |
233 GrStencilSettings stencilSettings; | 235 GrStencilSettings stencilSettings; |
234 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 236 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
235 GrStencilAttachment* sb = rt->renderTargetPriv().attachStencilAttachment(); | 237 GrStencilAttachment* sb = rt->renderTargetPriv().attachStencilAttachment(); |
236 this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); | 238 this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); |
237 | 239 |
238 GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, path
Proc, &devBounds, | 240 GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, pat
hProc, &devBounds, |
239 this); | 241 this); |
240 if (pipelineInfo.mustSkipDraw()) { | 242 if (!pipelineInfo.valid()) { |
241 return; | 243 return; |
242 } | 244 } |
243 | 245 |
244 this->onDrawPath(pathProc, path, stencilSettings, pipelineInfo); | 246 this->onDrawPath(pathProc, path, stencilSettings, pipelineInfo); |
245 } | 247 } |
246 | 248 |
247 void GrDrawTarget::drawPaths(const GrPipelineBuilder& pipelineBuilder, | 249 void GrDrawTarget::drawPaths(const GrPipelineBuilder& pipelineBuilder, |
248 const GrPathProcessor* pathProc, | 250 const GrPathProcessor* pathProc, |
249 const GrPathRange* pathRange, | 251 const GrPathRange* pathRange, |
250 const void* indices, | 252 const void* indices, |
(...skipping 20 matching lines...) Expand all Loading... |
271 // set stencil settings for path | 273 // set stencil settings for path |
272 GrStencilSettings stencilSettings; | 274 GrStencilSettings stencilSettings; |
273 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 275 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
274 GrStencilAttachment* sb = rt->renderTargetPriv().attachStencilAttachment(); | 276 GrStencilAttachment* sb = rt->renderTargetPriv().attachStencilAttachment(); |
275 this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); | 277 this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); |
276 | 278 |
277 // Don't compute a bounding box for dst copy texture, we'll opt | 279 // Don't compute a bounding box for dst copy texture, we'll opt |
278 // instead for it to just copy the entire dst. Realistically this is a moot | 280 // instead for it to just copy the entire dst. Realistically this is a moot |
279 // point, because any context that supports NV_path_rendering will also | 281 // point, because any context that supports NV_path_rendering will also |
280 // support NV_blend_equation_advanced. | 282 // support NV_blend_equation_advanced. |
281 GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, path
Proc, NULL, this); | 283 GrDrawTarget::PipelineInfo pipelineInfo(&pipelineBuilder, &scissorState, pat
hProc, NULL, this); |
282 if (pipelineInfo.mustSkipDraw()) { | 284 if (!pipelineInfo.valid()) { |
283 return; | 285 return; |
284 } | 286 } |
285 | 287 |
286 this->onDrawPaths(pathProc, pathRange, indices, indexType, transformValues, | 288 this->onDrawPaths(pathProc, pathRange, indices, indexType, transformValues, |
287 transformType, count, stencilSettings, pipelineInfo); | 289 transformType, count, stencilSettings, pipelineInfo); |
288 } | 290 } |
289 | 291 |
290 void GrDrawTarget::drawBWRect(const GrPipelineBuilder& pipelineBuilder, | 292 void GrDrawTarget::drawBWRect(const GrPipelineBuilder& pipelineBuilder, |
291 GrColor color, | 293 GrColor color, |
292 const SkMatrix& viewMatrix, | 294 const SkMatrix& viewMatrix, |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 srcRect, | 453 srcRect, |
452 dstPoint, | 454 dstPoint, |
453 &clippedSrcRect, | 455 &clippedSrcRect, |
454 &clippedDstPoint)) { | 456 &clippedDstPoint)) { |
455 return; | 457 return; |
456 } | 458 } |
457 | 459 |
458 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); | 460 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
459 } | 461 } |
460 | 462 |
461 const GrPipeline* GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, | |
462 void* pipelineAddr, | |
463 GrPipelineOptimizations* optimizat
ions) { | |
464 return GrPipeline::CreateAt(pipelineAddr, *pipelineInfo.fPipelineBuilder, | |
465 pipelineInfo.fColorPOI, | |
466 pipelineInfo.fCoveragePOI, | |
467 *this->caps(), | |
468 *pipelineInfo.fScissor, | |
469 &pipelineInfo.fDstTexture, | |
470 optimizations); | |
471 } | |
472 | |
473 /////////////////////////////////////////////////////////////////////////////// | 463 /////////////////////////////////////////////////////////////////////////////// |
474 | 464 |
475 GrDrawTarget::PipelineInfo::PipelineInfo(const GrPipelineBuilder& pipelineBuilde
r, | 465 GrDrawTarget::PipelineInfo::PipelineInfo(const GrPipelineBuilder* pipelineBuilde
r, |
476 GrScissorState* scissor, | 466 const GrScissorState* scissor, |
477 const GrPrimitiveProcessor* primProc, | 467 const GrPrimitiveProcessor* primProc, |
478 const SkRect* devBounds, | 468 const SkRect* devBounds, |
479 GrDrawTarget* target) | 469 GrDrawTarget* target) { |
480 : fPipelineBuilder(&pipelineBuilder) | 470 fArgs.fPipelineBuilder = pipelineBuilder; |
481 , fScissor(scissor) { | 471 fArgs.fCaps = target->caps(); |
482 fColorPOI = fPipelineBuilder->colorProcInfo(primProc); | 472 fArgs.fScissor = scissor; |
483 fCoveragePOI = fPipelineBuilder->coverageProcInfo(primProc); | 473 fArgs.fColorPOI = fArgs.fPipelineBuilder->colorProcInfo(primProc); |
484 if (!target->setupDstReadIfNecessary(*fPipelineBuilder, fColorPOI, fCoverage
POI, | 474 fArgs.fCoveragePOI = fArgs.fPipelineBuilder->coverageProcInfo(primProc); |
485 &fDstTexture, devBounds)) { | 475 if (!target->setupDstReadIfNecessary(*fArgs.fPipelineBuilder, fArgs.fColorPO
I, |
486 fPipelineBuilder = NULL; | 476 fArgs.fCoveragePOI, &fArgs.fDstTexture,
devBounds)) { |
| 477 fArgs.fPipelineBuilder = NULL; |
487 } | 478 } |
488 } | 479 } |
489 | 480 |
490 GrDrawTarget::PipelineInfo::PipelineInfo(const GrPipelineBuilder& pipelineBuilde
r, | 481 GrDrawTarget::PipelineInfo::PipelineInfo(const GrPipelineBuilder* pipelineBuilde
r, |
491 GrScissorState* scissor, | 482 const GrScissorState* scissor, |
492 const GrBatch* batch, | 483 const GrBatch* batch, |
493 const SkRect* devBounds, | 484 const SkRect* devBounds, |
494 GrDrawTarget* target) | 485 GrDrawTarget* target) { |
495 : fPipelineBuilder(&pipelineBuilder) | 486 fArgs.fPipelineBuilder = pipelineBuilder; |
496 , fScissor(scissor) { | 487 fArgs.fCaps = target->caps(); |
497 fColorPOI = fPipelineBuilder->colorProcInfo(batch); | 488 fArgs.fScissor = scissor; |
498 fCoveragePOI = fPipelineBuilder->coverageProcInfo(batch); | 489 fArgs.fColorPOI = fArgs.fPipelineBuilder->colorProcInfo(batch); |
499 if (!target->setupDstReadIfNecessary(*fPipelineBuilder, fColorPOI, fCoverage
POI, | 490 fArgs.fCoveragePOI = fArgs.fPipelineBuilder->coverageProcInfo(batch); |
500 &fDstTexture, devBounds)) { | 491 if (!target->setupDstReadIfNecessary(*fArgs.fPipelineBuilder, fArgs.fColorPO
I, |
501 fPipelineBuilder = NULL; | 492 fArgs.fCoveragePOI, &fArgs.fDstTexture,
devBounds)) { |
| 493 fArgs.fPipelineBuilder = NULL; |
502 } | 494 } |
503 } | 495 } |
504 | 496 |
505 /////////////////////////////////////////////////////////////////////////////// | 497 /////////////////////////////////////////////////////////////////////////////// |
506 GrClipTarget::GrClipTarget(GrContext* context) | 498 GrClipTarget::GrClipTarget(GrContext* context) |
507 : INHERITED(context->getGpu(), context->resourceProvider()) | 499 : INHERITED(context->getGpu(), context->resourceProvider()) |
508 , fContext(context) { | 500 , fContext(context) { |
509 fClipMaskManager.reset(SkNEW_ARGS(GrClipMaskManager, (this))); | 501 fClipMaskManager.reset(SkNEW_ARGS(GrClipMaskManager, (this))); |
510 } | 502 } |
511 | 503 |
512 | 504 |
513 bool GrClipTarget::setupClip(const GrPipelineBuilder& pipelineBuilder, | 505 bool GrClipTarget::setupClip(const GrPipelineBuilder& pipelineBuilder, |
514 GrPipelineBuilder::AutoRestoreFragmentProcessorStat
e* arfps, | 506 GrPipelineBuilder::AutoRestoreFragmentProcessorStat
e* arfps, |
515 GrPipelineBuilder::AutoRestoreStencil* ars, | 507 GrPipelineBuilder::AutoRestoreStencil* ars, |
516 GrScissorState* scissorState, | 508 GrScissorState* scissorState, |
517 const SkRect* devBounds) { | 509 const SkRect* devBounds) { |
518 return fClipMaskManager->setupClipping(pipelineBuilder, | 510 return fClipMaskManager->setupClipping(pipelineBuilder, |
519 arfps, | 511 arfps, |
520 ars, | 512 ars, |
521 scissorState, | 513 scissorState, |
522 devBounds); | 514 devBounds); |
523 } | 515 } |
524 | 516 |
525 void GrClipTarget::purgeResources() { | 517 void GrClipTarget::purgeResources() { |
526 // The clip mask manager can rebuild all its clip masks so just | 518 // The clip mask manager can rebuild all its clip masks so just |
527 // get rid of them all. | 519 // get rid of them all. |
528 fClipMaskManager->purgeResources(); | 520 fClipMaskManager->purgeResources(); |
529 }; | 521 }; |
OLD | NEW |