| Index: src/gpu/GrRenderTargetOpList.cpp
|
| diff --git a/src/gpu/GrRenderTargetOpList.cpp b/src/gpu/GrRenderTargetOpList.cpp
|
| index b4e6870585af770a9deb80ec0755934343fcbbbd..3d410c79d07bf86129005dbfca834128f684cc69 100644
|
| --- a/src/gpu/GrRenderTargetOpList.cpp
|
| +++ b/src/gpu/GrRenderTargetOpList.cpp
|
| @@ -19,6 +19,7 @@
|
| #include "GrPipelineBuilder.h"
|
| #include "GrRenderTarget.h"
|
| #include "GrResourceProvider.h"
|
| +#include "GrRenderTargetContextPriv.h"
|
| #include "GrRenderTargetPriv.h"
|
| #include "GrStencilAttachment.h"
|
| #include "GrSurfacePriv.h"
|
| @@ -98,7 +99,7 @@ void GrRenderTargetOpList::dump() const {
|
| #endif
|
|
|
| bool GrRenderTargetOpList::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder,
|
| - GrRenderTarget* rt,
|
| + GrRenderTargetContext* rtc,
|
| const GrClip& clip,
|
| const GrPipelineOptimizations& optimizations,
|
| GrXferProcessor::DstTexture* dstTexture,
|
| @@ -110,6 +111,12 @@ bool GrRenderTargetOpList::setupDstReadIfNecessary(const GrPipelineBuilder& pipe
|
| return true;
|
| }
|
|
|
| + GrContext* context = rtc->priv().context();
|
| + GrRenderTarget* rt = rtc->priv().accessRTP()->instantiate(context->textureProvider());
|
| + if (!rt) {
|
| + return false;
|
| + }
|
| +
|
| 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
|
| @@ -184,24 +191,24 @@ bool GrRenderTargetOpList::drawBatches(GrBatchFlushState* flushState) {
|
| }
|
| // Draw all the generated geometry.
|
| SkRandom random;
|
| - GrRenderTarget* currentRT = nullptr;
|
| + GrRenderTargetProxy* currentRTP = nullptr;
|
| std::unique_ptr<GrGpuCommandBuffer> commandBuffer;
|
| for (int i = 0; i < fRecordedBatches.count(); ++i) {
|
| if (!fRecordedBatches[i].fBatch) {
|
| continue;
|
| }
|
| - if (fRecordedBatches[i].fBatch->renderTarget() != currentRT) {
|
| + if (fRecordedBatches[i].fBatch->rtp() != currentRTP) {
|
| if (commandBuffer) {
|
| commandBuffer->end();
|
| commandBuffer->submit();
|
| commandBuffer.reset();
|
| }
|
| - currentRT = fRecordedBatches[i].fBatch->renderTarget();
|
| - if (currentRT) {
|
| + currentRTP = fRecordedBatches[i].fBatch->rtp();
|
| + if (currentRTP) {
|
| static const GrGpuCommandBuffer::LoadAndStoreInfo kBasicLoadStoreInfo
|
| { GrGpuCommandBuffer::LoadOp::kLoad,GrGpuCommandBuffer::StoreOp::kStore,
|
| GrColor_ILLEGAL };
|
| - commandBuffer.reset(fGpu->createCommandBuffer(currentRT,
|
| + commandBuffer.reset(fGpu->createCommandBuffer(nullptr, //currentRT,
|
| kBasicLoadStoreInfo, // Color
|
| kBasicLoadStoreInfo)); // Stencil
|
| }
|
| @@ -211,11 +218,13 @@ bool GrRenderTargetOpList::drawBatches(GrBatchFlushState* flushState) {
|
| const SkRect& bounds = fRecordedBatches[i].fClippedBounds;
|
| SkIRect ibounds;
|
| bounds.roundOut(&ibounds);
|
| +#if 0
|
| // In multi-draw buffer all the batches use the same render target and we won't need to
|
| // get the batchs bounds.
|
| if (GrRenderTarget* rt = fRecordedBatches[i].fBatch->renderTarget()) {
|
| fGpu->drawDebugWireRect(rt, ibounds, 0xFF000000 | random.nextU());
|
| }
|
| +#endif
|
| }
|
| fRecordedBatches[i].fBatch->draw(flushState, fRecordedBatches[i].fClippedBounds);
|
| }
|
| @@ -338,7 +347,7 @@ void GrRenderTargetOpList::drawBatch(const GrPipelineBuilder& pipelineBuilder,
|
| args.fScissor = &appliedClip.scissorState();
|
| args.fWindowRectsState = &appliedClip.windowRectsState();
|
| args.fHasStencilClip = appliedClip.hasStencilClip();
|
| - if (!this->setupDstReadIfNecessary(pipelineBuilder, renderTargetContext->accessRenderTarget(),
|
| + if (!this->setupDstReadIfNecessary(pipelineBuilder, renderTargetContext,
|
| clip, args.fOpts,
|
| &args.fDstTexture, batch->bounds())) {
|
| return;
|
| @@ -392,7 +401,7 @@ void GrRenderTargetOpList::stencilPath(GrRenderTargetContext* renderTargetContex
|
| appliedClip.hasStencilClip(),
|
| stencilAttachment->bits(),
|
| appliedClip.scissorState(),
|
| - renderTargetContext->accessRenderTarget(),
|
| + fRenderTargetProxy,
|
| path);
|
| this->recordBatch(batch, appliedClip.clippedDrawBounds());
|
| batch->unref();
|
| @@ -402,29 +411,29 @@ void GrRenderTargetOpList::addBatch(sk_sp<GrBatch> batch) {
|
| this->recordBatch(batch.get(), batch->bounds());
|
| }
|
|
|
| -void GrRenderTargetOpList::fullClear(GrRenderTarget* renderTarget, GrColor color) {
|
| +void GrRenderTargetOpList::fullClear(GrRenderTargetProxy* rtp, GrColor color) {
|
| // Currently this just inserts or updates the last clear batch. However, once in MDB this can
|
| // remove all the previously recorded batches and change the load op to clear with supplied
|
| // color.
|
| if (fLastFullClearBatch &&
|
| - fLastFullClearBatch->renderTargetUniqueID() == renderTarget->uniqueID()) {
|
| + fLastFullClearBatch->renderTargetUniqueID() == rtp->uniqueID()) {
|
| // As currently implemented, fLastFullClearBatch should be the last batch because we would
|
| // have cleared it when another batch was recorded.
|
| SkASSERT(fRecordedBatches.back().fBatch.get() == fLastFullClearBatch);
|
| fLastFullClearBatch->setColor(color);
|
| return;
|
| }
|
| - sk_sp<GrClearBatch> batch(GrClearBatch::Make(GrFixedClip::Disabled(), color, renderTarget));
|
| + sk_sp<GrClearBatch> batch(GrClearBatch::Make(GrFixedClip::Disabled(), color, rtp));
|
| if (batch.get() == this->recordBatch(batch.get(), batch->bounds())) {
|
| fLastFullClearBatch = batch.get();
|
| }
|
| }
|
|
|
| -void GrRenderTargetOpList::discard(GrRenderTarget* renderTarget) {
|
| +void GrRenderTargetOpList::discard(GrRenderTargetProxy* rtp) {
|
| // Currently this just inserts a discard batch. However, once in MDB this can remove all the
|
| // previously recorded batches and change the load op to discard.
|
| if (this->caps()->discardRenderTargetSupport()) {
|
| - GrBatch* batch = new GrDiscardBatch(renderTarget);
|
| + GrBatch* batch = new GrDiscardBatch(rtp);
|
| this->recordBatch(batch, batch->bounds());
|
| batch->unref();
|
| }
|
| @@ -574,8 +583,8 @@ void GrRenderTargetOpList::forwardCombine() {
|
|
|
| void GrRenderTargetOpList::clearStencilClip(const GrFixedClip& clip,
|
| bool insideStencilMask,
|
| - GrRenderTarget* rt) {
|
| - GrBatch* batch = new GrClearStencilClipBatch(clip, insideStencilMask, rt);
|
| + GrRenderTargetProxy* rtp) {
|
| + GrBatch* batch = new GrClearStencilClipBatch(clip, insideStencilMask, rtp);
|
| this->recordBatch(batch, batch->bounds());
|
| batch->unref();
|
| }
|
|
|