diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrRenderTargetOpList.cpp | 33 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetOpList.h | 16 |
2 files changed, 21 insertions, 28 deletions
diff --git a/src/gpu/GrRenderTargetOpList.cpp b/src/gpu/GrRenderTargetOpList.cpp index 98fdc7fc6a..ce2f3a982c 100644 --- a/src/gpu/GrRenderTargetOpList.cpp +++ b/src/gpu/GrRenderTargetOpList.cpp @@ -96,26 +96,20 @@ void GrRenderTargetOpList::dump() const { } #endif -bool GrRenderTargetOpList::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder, - GrRenderTarget* rt, - const GrClip& clip, - const GrPipelineOptimizations& optimizations, - GrXferProcessor::DstTexture* dstTexture, - const SkRect& batchBounds) { +void GrRenderTargetOpList::setupDstTexture(GrRenderTarget* rt, + const GrClip& clip, + const SkRect& batchBounds, + GrXferProcessor::DstTexture* dstTexture) { SkRect bounds = batchBounds; bounds.outset(0.5f, 0.5f); - if (!pipelineBuilder.willXPNeedDstTexture(*this->caps(), optimizations)) { - return true; - } - if (this->caps()->textureBarrierSupport()) { if (GrTexture* rtTex = rt->asTexture()) { // The render target is a texture, so we can read from it directly in the shader. The XP // will be responsible to detect this situation and request a texture barrier. dstTexture->setTexture(sk_ref_sp(rtTex)); dstTexture->setOffset(0, 0); - return true; + return; } } @@ -127,9 +121,9 @@ bool GrRenderTargetOpList::setupDstReadIfNecessary(const GrPipelineBuilder& pipe if (!copyRect.intersect(drawIBounds)) { #ifdef SK_DEBUG GrCapsDebugf(this->caps(), "Missed an early reject. " - "Bailing on draw from setupDstReadIfNecessary.\n"); + "Bailing on draw from setupDstTexture.\n"); #endif - return false; + return; } // MSAA consideration: When there is support for reading MSAA samples in the shader we could @@ -149,13 +143,12 @@ bool GrRenderTargetOpList::setupDstReadIfNecessary(const GrPipelineBuilder& pipe if (!copy) { SkDebugf("Failed to create temporary copy of destination texture.\n"); - return false; + return; } SkIPoint dstPoint = {0, 0}; this->copySurface(copy.get(), rt, copyRect, dstPoint); dstTexture->setTexture(std::move(copy)); dstTexture->setOffset(copyRect.fLeft, copyRect.fTop); - return true; } void GrRenderTargetOpList::prepareBatches(GrBatchFlushState* flushState) { @@ -337,10 +330,12 @@ void GrRenderTargetOpList::drawBatch(const GrPipelineBuilder& pipelineBuilder, return; } - if (!this->setupDstReadIfNecessary(pipelineBuilder, renderTargetContext->accessRenderTarget(), - clip, args.fOpts, - &args.fDstTexture, batch->bounds())) { - return; + if (pipelineBuilder.willXPNeedDstTexture(*this->caps(), args.fOpts)) { + this->setupDstTexture(renderTargetContext->accessRenderTarget(), clip, batch->bounds(), + &args.fDstTexture); + if (!args.fDstTexture.texture()) { + return; + } } if (!batch->installPipeline(args)) { diff --git a/src/gpu/GrRenderTargetOpList.h b/src/gpu/GrRenderTargetOpList.h index 238a048413..c4c492802b 100644 --- a/src/gpu/GrRenderTargetOpList.h +++ b/src/gpu/GrRenderTargetOpList.h @@ -137,15 +137,13 @@ private: GrOp* recordBatch(GrOp*, const SkRect& clippedBounds); void forwardCombine(); - // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required - // but couldn't be made. Otherwise, returns true. This method needs to be protected because it - // needs to be accessed by GLPrograms to setup a correct drawstate - bool setupDstReadIfNecessary(const GrPipelineBuilder&, - GrRenderTarget*, - const GrClip&, - const GrPipelineOptimizations& optimizations, - GrXferProcessor::DstTexture*, - const SkRect& batchBounds); + // Makes a copy of the dst if it is necessary for the draw and returns the texture that should + // be used by GrXferProcessor to access the destination color. If the texture is nullptr then + // a texture copy could not be made. + void setupDstTexture(GrRenderTarget*, + const GrClip&, + const SkRect& batchBounds, + GrXferProcessor::DstTexture*); // Used only via GrRenderTargetContextPriv. void clearStencilClip(const GrFixedClip&, bool insideStencilMask, GrRenderTarget*); |