| 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 |
| 11 #include "GrBatch.h" | 11 #include "GrBatch.h" |
| 12 #include "GrBufferAllocPool.h" |
| 12 #include "GrContext.h" | 13 #include "GrContext.h" |
| 13 #include "GrDrawTargetCaps.h" | 14 #include "GrDrawTargetCaps.h" |
| 14 #include "GrPath.h" | 15 #include "GrPath.h" |
| 15 #include "GrPipeline.h" | 16 #include "GrPipeline.h" |
| 16 #include "GrMemoryPool.h" | 17 #include "GrMemoryPool.h" |
| 17 #include "GrRenderTarget.h" | 18 #include "GrRenderTarget.h" |
| 18 #include "GrRenderTargetPriv.h" | 19 #include "GrRenderTargetPriv.h" |
| 19 #include "GrSurfacePriv.h" | 20 #include "GrSurfacePriv.h" |
| 20 #include "GrTemplates.h" | 21 #include "GrTemplates.h" |
| 21 #include "GrTexture.h" | 22 #include "GrTexture.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 48 this->setIndexBuffer(di.indexBuffer()); | 49 this->setIndexBuffer(di.indexBuffer()); |
| 49 | 50 |
| 50 return *this; | 51 return *this; |
| 51 } | 52 } |
| 52 | 53 |
| 53 //////////////////////////////////////////////////////////////////////////////// | 54 //////////////////////////////////////////////////////////////////////////////// |
| 54 | 55 |
| 55 #define DEBUG_INVAL_BUFFER 0xdeadcafe | 56 #define DEBUG_INVAL_BUFFER 0xdeadcafe |
| 56 #define DEBUG_INVAL_START_IDX -1 | 57 #define DEBUG_INVAL_START_IDX -1 |
| 57 | 58 |
| 58 GrDrawTarget::GrDrawTarget(GrContext* context) | 59 GrDrawTarget::GrDrawTarget(GrContext* context, |
| 60 GrVertexBufferAllocPool* vpool, |
| 61 GrIndexBufferAllocPool* ipool) |
| 59 : fContext(context) | 62 : fContext(context) |
| 60 , fGpuTraceMarkerCount(0) { | 63 , fCaps(SkRef(context->getGpu()->caps())) |
| 64 , fGpuTraceMarkerCount(0) |
| 65 , fVertexPool(vpool) |
| 66 , fIndexPool(ipool) |
| 67 , fFlushing(false) { |
| 61 SkASSERT(context); | 68 SkASSERT(context); |
| 62 } | 69 } |
| 63 | 70 |
| 64 //////////////////////////////////////////////////////////////////////////////// | 71 //////////////////////////////////////////////////////////////////////////////// |
| 65 | 72 |
| 66 bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil
der, | 73 bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil
der, |
| 67 const GrProcOptInfo& colorPOI, | 74 const GrProcOptInfo& colorPOI, |
| 68 const GrProcOptInfo& coveragePOI, | 75 const GrProcOptInfo& coveragePOI, |
| 69 GrDeviceCoordTexture* dstCopy, | 76 GrDeviceCoordTexture* dstCopy, |
| 70 const SkRect* drawBounds) { | 77 const SkRect* drawBounds) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 86 } | 93 } |
| 87 } else { | 94 } else { |
| 88 #ifdef SK_DEBUG | 95 #ifdef SK_DEBUG |
| 89 //SkDebugf("No dev bounds when dst copy is made.\n"); | 96 //SkDebugf("No dev bounds when dst copy is made.\n"); |
| 90 #endif | 97 #endif |
| 91 } | 98 } |
| 92 | 99 |
| 93 // MSAA consideration: When there is support for reading MSAA samples in the
shader we could | 100 // MSAA consideration: When there is support for reading MSAA samples in the
shader we could |
| 94 // have per-sample dst values by making the copy multisampled. | 101 // have per-sample dst values by making the copy multisampled. |
| 95 GrSurfaceDesc desc; | 102 GrSurfaceDesc desc; |
| 96 this->initCopySurfaceDstDesc(rt, &desc); | 103 if (!this->getGpu()->initCopySurfaceDstDesc(rt, &desc)) { |
| 104 desc.fOrigin = kDefault_GrSurfaceOrigin; |
| 105 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 106 desc.fConfig = rt->config(); |
| 107 } |
| 108 |
| 109 |
| 97 desc.fWidth = copyRect.width(); | 110 desc.fWidth = copyRect.width(); |
| 98 desc.fHeight = copyRect.height(); | 111 desc.fHeight = copyRect.height(); |
| 99 | 112 |
| 100 SkAutoTUnref<GrTexture> copy( | 113 SkAutoTUnref<GrTexture> copy( |
| 101 fContext->refScratchTexture(desc, GrContext::kApprox_ScratchTexMatch)); | 114 fContext->refScratchTexture(desc, GrContext::kApprox_ScratchTexMatch)); |
| 102 | 115 |
| 103 if (!copy) { | 116 if (!copy) { |
| 104 SkDebugf("Failed to create temporary copy of destination texture.\n"); | 117 SkDebugf("Failed to create temporary copy of destination texture.\n"); |
| 105 return false; | 118 return false; |
| 106 } | 119 } |
| 107 SkIPoint dstPoint = {0, 0}; | 120 SkIPoint dstPoint = {0, 0}; |
| 108 if (this->copySurface(copy, rt, copyRect, dstPoint)) { | 121 if (this->copySurface(copy, rt, copyRect, dstPoint)) { |
| 109 dstCopy->setTexture(copy); | 122 dstCopy->setTexture(copy); |
| 110 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); | 123 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); |
| 111 return true; | 124 return true; |
| 112 } else { | 125 } else { |
| 113 return false; | 126 return false; |
| 114 } | 127 } |
| 115 } | 128 } |
| 116 | 129 |
| 130 void GrDrawTarget::reset() { |
| 131 fVertexPool->reset(); |
| 132 fIndexPool->reset(); |
| 133 |
| 134 this->onReset(); |
| 135 } |
| 136 |
| 137 void GrDrawTarget::flush() { |
| 138 if (fFlushing) { |
| 139 return; |
| 140 } |
| 141 fFlushing = true; |
| 142 |
| 143 this->getGpu()->saveActiveTraceMarkers(); |
| 144 |
| 145 this->onFlush(); |
| 146 |
| 147 this->getGpu()->restoreActiveTraceMarkers(); |
| 148 |
| 149 fFlushing = false; |
| 150 this->reset(); |
| 151 } |
| 152 |
| 117 void GrDrawTarget::drawBatch(GrPipelineBuilder* pipelineBuilder, | 153 void GrDrawTarget::drawBatch(GrPipelineBuilder* pipelineBuilder, |
| 118 GrBatch* batch, | 154 GrBatch* batch, |
| 119 const SkRect* devBounds) { | 155 const SkRect* devBounds) { |
| 120 SkASSERT(pipelineBuilder); | 156 SkASSERT(pipelineBuilder); |
| 121 // TODO some kind of checkdraw, but not at this level | 157 // TODO some kind of checkdraw, but not at this level |
| 122 | 158 |
| 123 // Setup clip | 159 // Setup clip |
| 124 GrScissorState scissorState; | 160 GrScissorState scissorState; |
| 125 GrPipelineBuilder::AutoRestoreFragmentProcessors arfp; | 161 GrPipelineBuilder::AutoRestoreFragmentProcessors arfp; |
| 126 GrPipelineBuilder::AutoRestoreStencil ars; | 162 GrPipelineBuilder::AutoRestoreStencil ars; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 // If the rect is outside the src or dst then we've already succeeded. | 442 // If the rect is outside the src or dst then we've already succeeded. |
| 407 if (!clip_srcrect_and_dstpoint(dst, | 443 if (!clip_srcrect_and_dstpoint(dst, |
| 408 src, | 444 src, |
| 409 srcRect, | 445 srcRect, |
| 410 dstPoint, | 446 dstPoint, |
| 411 &clippedSrcRect, | 447 &clippedSrcRect, |
| 412 &clippedDstPoint)) { | 448 &clippedDstPoint)) { |
| 413 return true; | 449 return true; |
| 414 } | 450 } |
| 415 | 451 |
| 416 if (this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint)) { | 452 if (this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint
)) { |
| 453 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
| 417 return true; | 454 return true; |
| 418 } | 455 } |
| 419 | 456 |
| 420 GrRenderTarget* rt = dst->asRenderTarget(); | 457 GrRenderTarget* rt = dst->asRenderTarget(); |
| 421 GrTexture* tex = src->asTexture(); | 458 GrTexture* tex = src->asTexture(); |
| 422 | 459 |
| 423 if ((dst == src) || !rt || !tex) { | 460 if ((dst == src) || !rt || !tex) { |
| 424 return false; | 461 return false; |
| 425 } | 462 } |
| 426 | 463 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 450 SkIPoint clippedDstPoint; | 487 SkIPoint clippedDstPoint; |
| 451 // If the rect is outside the src or dst then we're guaranteed success | 488 // If the rect is outside the src or dst then we're guaranteed success |
| 452 if (!clip_srcrect_and_dstpoint(dst, | 489 if (!clip_srcrect_and_dstpoint(dst, |
| 453 src, | 490 src, |
| 454 srcRect, | 491 srcRect, |
| 455 dstPoint, | 492 dstPoint, |
| 456 &clippedSrcRect, | 493 &clippedSrcRect, |
| 457 &clippedDstPoint)) { | 494 &clippedDstPoint)) { |
| 458 return true; | 495 return true; |
| 459 } | 496 } |
| 460 return this->internalCanCopySurface(dst, src, clippedSrcRect, clippedDstPoin
t); | |
| 461 } | |
| 462 | |
| 463 bool GrDrawTarget::internalCanCopySurface(const GrSurface* dst, | |
| 464 const GrSurface* src, | |
| 465 const SkIRect& clippedSrcRect, | |
| 466 const SkIPoint& clippedDstPoint) { | |
| 467 // Check that the read/write rects are contained within the src/dst bounds. | |
| 468 SkASSERT(!clippedSrcRect.isEmpty()); | |
| 469 SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(clippedSrcRec
t)); | |
| 470 SkASSERT(clippedDstPoint.fX >= 0 && clippedDstPoint.fY >= 0); | |
| 471 SkASSERT(clippedDstPoint.fX + clippedSrcRect.width() <= dst->width() && | |
| 472 clippedDstPoint.fY + clippedSrcRect.height() <= dst->height()); | |
| 473 | |
| 474 // The base class can do it as a draw or the subclass may be able to handle
it. | |
| 475 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) || | 497 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) || |
| 476 this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); | 498 this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPo
int); |
| 477 } | 499 } |
| 478 | 500 |
| 479 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, | 501 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, |
| 480 GrPipeline* pipeline) { | 502 GrPipeline* pipeline) { |
| 481 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, | 503 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, |
| 482 pipelineInfo.fColorPOI, | 504 pipelineInfo.fColorPOI, |
| 483 pipelineInfo.fCoveragePOI, | 505 pipelineInfo.fCoveragePOI, |
| 484 *this->caps(), | 506 *this->caps(), |
| 485 *pipelineInfo.fScissor, | 507 *pipelineInfo.fScissor, |
| 486 &pipelineInfo.fDstCopy)); | 508 &pipelineInfo.fDstCopy)); |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 GrPipelineBuilder::AutoRestoreFragmentProcessors* a
rfp, | 756 GrPipelineBuilder::AutoRestoreFragmentProcessors* a
rfp, |
| 735 GrPipelineBuilder::AutoRestoreStencil* ars, | 757 GrPipelineBuilder::AutoRestoreStencil* ars, |
| 736 GrScissorState* scissorState, | 758 GrScissorState* scissorState, |
| 737 const SkRect* devBounds) { | 759 const SkRect* devBounds) { |
| 738 return fClipMaskManager.setupClipping(pipelineBuilder, | 760 return fClipMaskManager.setupClipping(pipelineBuilder, |
| 739 arfp, | 761 arfp, |
| 740 ars, | 762 ars, |
| 741 scissorState, | 763 scissorState, |
| 742 devBounds); | 764 devBounds); |
| 743 } | 765 } |
| OLD | NEW |