diff options
author | Robert Phillips <robertphillips@google.com> | 2017-05-15 14:56:51 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-17 12:17:03 +0000 |
commit | 87f7f1c3ce519115141b40f1d8faede437c8f357 (patch) | |
tree | e35d12c8ae40e0192e8af889ca848d3c5f60eed9 | |
parent | 1314918f903f0a1b40c2695f2b27737e9a8b443a (diff) |
Convert DstTexture to DstProxy
The last GrTexture-based TextureSampler::reset call must be removed before the TextureSamplers can become purely GrTextureProxy-backed
Split out of: https://skia-review.googlesource.com/c/10484/ (Omnibus: Push instantiation of GrTextures later (post TextureSampler))
Change-Id: Ic1435177d8b5d9bd3fc38b4903c9baae8205cfb0
Reviewed-on: https://skia-review.googlesource.com/16908
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
-rw-r--r-- | src/gpu/GrOpFlushState.h | 6 | ||||
-rw-r--r-- | src/gpu/GrPipeline.cpp | 16 | ||||
-rw-r--r-- | src/gpu/GrPipeline.h | 14 | ||||
-rw-r--r-- | src/gpu/GrProcessor.cpp | 12 | ||||
-rw-r--r-- | src/gpu/GrProcessor.h | 6 | ||||
-rw-r--r-- | src/gpu/GrProgramDesc.cpp | 4 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.cpp | 36 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.h | 8 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetOpList.cpp | 20 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetOpList.h | 18 | ||||
-rw-r--r-- | src/gpu/GrXferProcessor.h | 44 | ||||
-rw-r--r-- | src/gpu/gl/GrGLProgram.cpp | 7 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLProgramBuilder.cpp | 5 | ||||
-rw-r--r-- | src/gpu/instanced/InstancedOp.cpp | 3 | ||||
-rw-r--r-- | src/gpu/ops/GrDrawPathOp.cpp | 3 | ||||
-rw-r--r-- | src/gpu/ops/GrSimpleMeshDrawOpHelper.h | 3 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpuCommandBuffer.cpp | 3 | ||||
-rw-r--r-- | src/gpu/vk/GrVkPipelineState.cpp | 12 | ||||
-rw-r--r-- | tests/GrPorterDuffTest.cpp | 11 |
19 files changed, 117 insertions, 114 deletions
diff --git a/src/gpu/GrOpFlushState.h b/src/gpu/GrOpFlushState.h index 0fc7b7f834..438a7bdf5a 100644 --- a/src/gpu/GrOpFlushState.h +++ b/src/gpu/GrOpFlushState.h @@ -102,7 +102,7 @@ public: struct DrawOpArgs { GrRenderTarget* fRenderTarget; const GrAppliedClip* fAppliedClip; - GrXferProcessor::DstTexture fDstTexture; + GrXferProcessor::DstProxy fDstProxy; }; void setDrawOpArgs(DrawOpArgs* opArgs) { fOpArgs = opArgs; } @@ -224,8 +224,8 @@ public: const GrAppliedClip* clip() const { return this->state()->drawOpArgs().fAppliedClip; } - const GrXferProcessor::DstTexture& dstTexture() const { - return this->state()->drawOpArgs().fDstTexture; + const GrXferProcessor::DstProxy& dstProxy() const { + return this->state()->drawOpArgs().fDstProxy; } template <typename... Args> diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp index 7c0338c77c..73ae9c659a 100644 --- a/src/gpu/GrPipeline.cpp +++ b/src/gpu/GrPipeline.cpp @@ -44,9 +44,13 @@ void GrPipeline::init(const InitArgs& args) { fXferProcessor = args.fProcessors->refXferProcessor(); - if (args.fDstTexture.texture()) { - fDstTexture.reset(args.fDstTexture.texture()); - fDstTextureOffset = args.fDstTexture.offset(); + if (args.fDstProxy.proxy()) { + if (!args.fDstProxy.proxy()->instantiate(args.fResourceProvider)) { + this->markAsBad(); + } + + fDstTextureProxy.reset(args.fDstProxy.proxy()); + fDstTextureOffset = args.fDstProxy.offset(); } // Copy GrFragmentProcessors from GrPipelineBuilder to Pipeline, possibly removing some of the @@ -91,7 +95,7 @@ static void add_dependencies_for_processor(const GrFragmentProcessor* proc, GrFragmentProcessor::TextureAccessIter iter(proc); while (const GrResourceIOProcessor::TextureSampler* sampler = iter.next()) { SkASSERT(rtp->getLastOpList()); - rtp->getLastOpList()->addDependency(sampler->texture()); + rtp->getLastOpList()->addDependency(sampler->proxy()); } } #endif @@ -104,8 +108,8 @@ void GrPipeline::addDependenciesTo(GrRenderTargetProxy* rtp) const { } #endif - if (fDstTexture) { - //SkASSERT(rtp->getLastOpList()); + if (fDstTextureProxy) { + SkASSERT(rtp->getLastOpList()); // MDB TODO: re-enable when TextureSamplers store texture proxies //rtp->getLastOpList()->addDependency(fDstTexture.get()); } diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h index 67e137c82a..fa78f34629 100644 --- a/src/gpu/GrPipeline.h +++ b/src/gpu/GrPipeline.h @@ -75,7 +75,8 @@ public: const GrAppliedClip* fAppliedClip = nullptr; GrRenderTarget* fRenderTarget = nullptr; const GrCaps* fCaps = nullptr; - GrXferProcessor::DstTexture fDstTexture; + GrResourceProvider* fResourceProvider = nullptr; + GrXferProcessor::DstProxy fDstProxy; }; /** @@ -157,11 +158,11 @@ public: * If the GrXferProcessor uses a texture to access the dst color, then this returns that * texture and the offset to the dst contents within that texture. */ - GrTexture* dstTexture(SkIPoint* offset = nullptr) const { + GrTextureProxy* dstTextureProxy(SkIPoint* offset = nullptr) const { if (offset) { *offset = fDstTextureOffset; } - return fDstTexture.get(); + return fDstTextureProxy.get(); } const GrFragmentProcessor& getColorFragmentProcessor(int idx) const { @@ -215,7 +216,8 @@ public: bool isBad() const { return SkToBool(fFlags & kIsBad_Flag); } GrXferBarrierType xferBarrierType(const GrCaps& caps) const { - if (fDstTexture.get() && fDstTexture.get() == fRenderTarget.get()->asTexture()) { + if (fDstTextureProxy.get() && + fDstTextureProxy.get()->priv().peekTexture() == fRenderTarget.get()->asTexture()) { return kTexture_GrXferBarrierType; } return this->getXferProcessor().xferBarrierType(caps); @@ -233,11 +235,11 @@ private: }; using RenderTarget = GrPendingIOResource<GrRenderTarget, kWrite_GrIOType>; - using DstTexture = GrPendingIOResource<GrTexture, kRead_GrIOType>; + using DstTextureProxy = GrPendingIOResource<GrTextureProxy, kRead_GrIOType>; using PendingFragmentProcessor = GrPendingProgramElement<const GrFragmentProcessor>; using FragmentProcessorArray = SkAutoSTArray<8, PendingFragmentProcessor>; - DstTexture fDstTexture; + DstTextureProxy fDstTextureProxy; SkIPoint fDstTextureOffset; RenderTarget fRenderTarget; GrScissorState fScissorState; diff --git a/src/gpu/GrProcessor.cpp b/src/gpu/GrProcessor.cpp index 1533257bad..4789e3ec4a 100644 --- a/src/gpu/GrProcessor.cpp +++ b/src/gpu/GrProcessor.cpp @@ -230,18 +230,6 @@ GrResourceIOProcessor::TextureSampler::TextureSampler(GrResourceProvider* resour this->reset(resourceProvider, std::move(proxy), filterMode, tileXAndY, visibility); } -// MDB TODO: remove this! -void GrResourceIOProcessor::TextureSampler::reset(GrTexture* texture, - GrSamplerParams::FilterMode filterMode, - SkShader::TileMode tileXAndY, - GrShaderFlags visibility) { - SkASSERT(texture); - fTexture.set(SkRef(texture), kRead_GrIOType); - filterMode = SkTMin(filterMode, texture->texturePriv().highestFilterMode()); - fParams.reset(tileXAndY, filterMode); - fVisibility = visibility; -} - void GrResourceIOProcessor::TextureSampler::reset(GrResourceProvider* resourceProvider, sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params, diff --git a/src/gpu/GrProcessor.h b/src/gpu/GrProcessor.h index 027a34e334..c1669ef753 100644 --- a/src/gpu/GrProcessor.h +++ b/src/gpu/GrProcessor.h @@ -222,12 +222,6 @@ public: */ TextureSampler(); - // MDB TODO: this is the last GrTexture-based reset call! - void reset(GrTexture*, - GrSamplerParams::FilterMode = GrSamplerParams::kNone_FilterMode, - SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode, - GrShaderFlags visibility = kFragment_GrShaderFlag); - // MDB TODO: ultimately we shouldn't need the resource provider parameter TextureSampler(GrResourceProvider*, sk_sp<GrTextureProxy>, const GrSamplerParams&); explicit TextureSampler(GrResourceProvider*, sk_sp<GrTextureProxy>, diff --git a/src/gpu/GrProgramDesc.cpp b/src/gpu/GrProgramDesc.cpp index 41993e190d..8362e110c6 100644 --- a/src/gpu/GrProgramDesc.cpp +++ b/src/gpu/GrProgramDesc.cpp @@ -198,8 +198,8 @@ bool GrProgramDesc::Build(GrProgramDesc* desc, const GrXferProcessor& xp = pipeline.getXferProcessor(); const GrSurfaceOrigin* originIfDstTexture = nullptr; GrSurfaceOrigin origin; - if (pipeline.dstTexture()) { - origin = pipeline.dstTexture()->origin(); + if (pipeline.dstTextureProxy()) { + origin = pipeline.dstTextureProxy()->origin(); originIfDstTexture = &origin; } xp.getGLSLProcessorKey(shaderCaps, &b, originIfDstTexture); diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp index 0076812845..1c92d37316 100644 --- a/src/gpu/GrRenderTargetContext.cpp +++ b/src/gpu/GrRenderTargetContext.cpp @@ -1598,15 +1598,15 @@ uint32_t GrRenderTargetContext::addDrawOp(const GrClip& clip, std::unique_ptr<Gr } } - GrXferProcessor::DstTexture dstTexture; + GrXferProcessor::DstProxy dstProxy; if (op->xpRequiresDstTexture(*this->caps(), &appliedClip)) { - if (!this->setupDstTexture(fRenderTargetProxy.get(), clip, op->bounds(), &dstTexture)) { + if (!this->setupDstProxy(this->asRenderTargetProxy(), clip, op->bounds(), &dstProxy)) { return SK_InvalidUniqueID; } } op->setClippedBounds(bounds); - return this->getOpList()->addOp(std::move(op), this, std::move(appliedClip), dstTexture); + return this->getOpList()->addOp(std::move(op), this, std::move(appliedClip), dstProxy); } uint32_t GrRenderTargetContext::addLegacyMeshDrawOp(GrPipelineBuilder&& pipelineBuilder, @@ -1656,9 +1656,10 @@ uint32_t GrRenderTargetContext::addLegacyMeshDrawOp(GrPipelineBuilder&& pipeline args.fAppliedClip = &appliedClip; args.fRenderTarget = rt; args.fCaps = this->caps(); + args.fResourceProvider = fContext->resourceProvider(); if (analysis.requiresDstTexture()) { - if (!this->setupDstTexture(fRenderTargetProxy.get(), clip, bounds, &args.fDstTexture)) { + if (!this->setupDstProxy(this->asRenderTargetProxy(), clip, bounds, &args.fDstProxy)) { return SK_InvalidUniqueID; } } @@ -1671,22 +1672,15 @@ uint32_t GrRenderTargetContext::addLegacyMeshDrawOp(GrPipelineBuilder&& pipeline return this->getOpList()->addOp(std::move(op), this); } -bool GrRenderTargetContext::setupDstTexture(GrRenderTargetProxy* rtProxy, const GrClip& clip, +bool GrRenderTargetContext::setupDstProxy(GrRenderTargetProxy* rtProxy, const GrClip& clip, const SkRect& opBounds, - GrXferProcessor::DstTexture* dstTexture) { + GrXferProcessor::DstProxy* dstProxy) { if (this->caps()->textureBarrierSupport()) { if (GrTextureProxy* texProxy = rtProxy->asTextureProxy()) { - // MDB TODO: remove this instantiation. Blocked on making DstTexture be proxy-based - sk_sp<GrTexture> tex(sk_ref_sp(texProxy->instantiate(fContext->resourceProvider()))); - if (!tex) { - SkDebugf("setupDstTexture: instantiation of src texture failed.\n"); - return false; // We have bigger problems now - } - // 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(std::move(tex)); - dstTexture->setOffset(0, 0); + dstProxy->setProxy(sk_ref_sp(texProxy)); + dstProxy->setOffset(0, 0); return true; } } @@ -1752,15 +1746,7 @@ bool GrRenderTargetContext::setupDstTexture(GrRenderTargetProxy* rtProxy, const return false; } - GrTextureProxy* copyProxy = sContext->asTextureProxy(); - // MDB TODO: remove this instantiation once DstTexture is proxy-backed - sk_sp<GrTexture> copy(sk_ref_sp(copyProxy->instantiate(fContext->resourceProvider()))); - if (!copy) { - SkDebugf("setupDstTexture: instantiation of copied texture failed.\n"); - return false; - } - - dstTexture->setTexture(std::move(copy)); - dstTexture->setOffset(dstOffset); + dstProxy->setProxy(sContext->asTextureProxyRef()); + dstProxy->setOffset(dstOffset); return true; } diff --git a/src/gpu/GrRenderTargetContext.h b/src/gpu/GrRenderTargetContext.h index a749046d24..2666d5c370 100644 --- a/src/gpu/GrRenderTargetContext.h +++ b/src/gpu/GrRenderTargetContext.h @@ -458,10 +458,10 @@ private: // Makes a copy of the proxy if it is necessary for the draw and places the texture that should // be used by GrXferProcessor to access the destination color in 'result'. If the return // value is false then a texture copy could not be made. - bool SK_WARN_UNUSED_RESULT setupDstTexture(GrRenderTargetProxy*, - const GrClip&, - const SkRect& opBounds, - GrXferProcessor::DstTexture* result); + bool SK_WARN_UNUSED_RESULT setupDstProxy(GrRenderTargetProxy*, + const GrClip&, + const SkRect& opBounds, + GrXferProcessor::DstProxy* result); GrRenderTargetOpList* getOpList(); diff --git a/src/gpu/GrRenderTargetOpList.cpp b/src/gpu/GrRenderTargetOpList.cpp index fe87bdeef0..acd79b864e 100644 --- a/src/gpu/GrRenderTargetOpList.cpp +++ b/src/gpu/GrRenderTargetOpList.cpp @@ -88,7 +88,7 @@ void GrRenderTargetOpList::prepareOps(GrOpFlushState* flushState) { opArgs = { fRecordedOps[i].fRenderTarget.get(), fRecordedOps[i].fAppliedClip, - fRecordedOps[i].fDstTexture + fRecordedOps[i].fDstProxy }; } flushState->setDrawOpArgs(&opArgs); @@ -167,7 +167,7 @@ bool GrRenderTargetOpList::executeOps(GrOpFlushState* flushState) { GrOpFlushState::DrawOpArgs opArgs { fRecordedOps[i].fRenderTarget.get(), fRecordedOps[i].fAppliedClip, - fRecordedOps[i].fDstTexture + fRecordedOps[i].fDstProxy }; flushState->setDrawOpArgs(&opArgs); @@ -273,7 +273,7 @@ static inline bool can_reorder(const SkRect& a, const SkRect& b) { return !GrRec bool GrRenderTargetOpList::combineIfPossible(const RecordedOp& a, GrOp* b, const GrAppliedClip* bClip, - const DstTexture* bDstTexture, + const DstProxy* bDstProxy, const GrCaps& caps) { if (a.fAppliedClip) { if (!bClip) { @@ -285,11 +285,11 @@ bool GrRenderTargetOpList::combineIfPossible(const RecordedOp& a, GrOp* b, } else if (bClip) { return false; } - if (bDstTexture) { - if (a.fDstTexture != *bDstTexture) { + if (bDstProxy) { + if (a.fDstProxy != *bDstProxy) { return false; } - } else if (a.fDstTexture.texture()) { + } else if (a.fDstProxy.proxy()) { return false; } return a.fOp->combineIfPossible(b, caps); @@ -298,7 +298,7 @@ bool GrRenderTargetOpList::combineIfPossible(const RecordedOp& a, GrOp* b, GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op, GrRenderTargetContext* renderTargetContext, GrAppliedClip* clip, - const DstTexture* dstTexture) { + const DstProxy* dstProxy) { GrRenderTarget* renderTarget = renderTargetContext->accessRenderTarget(); if (!renderTarget) { SkASSERT(false); @@ -345,7 +345,7 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op, candidate.fOp->uniqueID()); break; } - if (this->combineIfPossible(candidate, op.get(), clip, dstTexture, *caps)) { + if (this->combineIfPossible(candidate, op.get(), clip, dstProxy, *caps)) { GrOP_INFO("\t\tBackward: Combining with (%s, opID: %u)\n", candidate.fOp->name(), candidate.fOp->uniqueID()); GrOP_INFO("\t\t\tBackward: Combined op info:\n"); @@ -373,7 +373,7 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op, clip = fClipAllocator.make<GrAppliedClip>(std::move(*clip)); SkDEBUGCODE(fNumClips++;) } - fRecordedOps.emplace_back(std::move(op), renderTarget, clip, dstTexture); + fRecordedOps.emplace_back(std::move(op), renderTarget, clip, dstProxy); fRecordedOps.back().fOp->wasRecorded(this); fLastFullClearOp = nullptr; fLastFullClearResourceID.makeInvalid(); @@ -404,7 +404,7 @@ void GrRenderTargetOpList::forwardCombine(const GrCaps& caps) { break; } if (this->combineIfPossible(fRecordedOps[i], candidate.fOp.get(), - candidate.fAppliedClip, &candidate.fDstTexture, caps)) { + candidate.fAppliedClip, &candidate.fDstProxy, caps)) { GrOP_INFO("\t\tForward: Combining with (%s, opID: %u)\n", candidate.fOp->name(), candidate.fOp->uniqueID()); GR_AUDIT_TRAIL_OPS_RESULT_COMBINED(fAuditTrail, op, candidate.fOp.get()); diff --git a/src/gpu/GrRenderTargetOpList.h b/src/gpu/GrRenderTargetOpList.h index aa8c6c69f8..9556bfb237 100644 --- a/src/gpu/GrRenderTargetOpList.h +++ b/src/gpu/GrRenderTargetOpList.h @@ -30,7 +30,7 @@ class GrRenderTargetProxy; class GrRenderTargetOpList final : public GrOpList { private: - using DstTexture = GrXferProcessor::DstTexture; + using DstProxy = GrXferProcessor::DstProxy; public: GrRenderTargetOpList(GrRenderTargetProxy*, GrGpu*, GrAuditTrail*); @@ -70,9 +70,9 @@ public: return this->uniqueID(); } uint32_t addOp(std::unique_ptr<GrOp> op, GrRenderTargetContext* renderTargetContext, - GrAppliedClip&& clip, const DstTexture& dstTexture) { + GrAppliedClip&& clip, const DstProxy& dstProxy) { this->recordOp(std::move(op), renderTargetContext, clip.doesClip() ? &clip : nullptr, - &dstTexture); + &dstProxy); return this->uniqueID(); } @@ -116,31 +116,31 @@ private: RecordedOp(std::unique_ptr<GrOp> op, GrRenderTarget* rt, const GrAppliedClip* appliedClip, - const DstTexture* dstTexture) + const DstProxy* dstProxy) : fOp(std::move(op)) , fRenderTarget(rt) , fAppliedClip(appliedClip) { - if (dstTexture) { - fDstTexture = *dstTexture; + if (dstProxy) { + fDstProxy = *dstProxy; } } std::unique_ptr<GrOp> fOp; // TODO: These ops will all to target the same render target and this won't be needed. GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget; - DstTexture fDstTexture; + DstProxy fDstProxy; const GrAppliedClip* fAppliedClip; }; // If the input op is combined with an earlier op, this returns the combined op. Otherwise, it // returns the input op. GrOp* recordOp(std::unique_ptr<GrOp>, GrRenderTargetContext*, GrAppliedClip* = nullptr, - const DstTexture* = nullptr); + const DstProxy* = nullptr); void forwardCombine(const GrCaps&); // If this returns true then b has been merged into a's op. bool combineIfPossible(const RecordedOp& a, GrOp* b, const GrAppliedClip* bClip, - const DstTexture* bDstTexture, const GrCaps&); + const DstProxy* bDstTexture, const GrCaps&); GrClearOp* fLastFullClearOp = nullptr; GrGpuResource::UniqueID fLastFullClearResourceID = GrGpuResource::UniqueID::InvalidID(); diff --git a/src/gpu/GrXferProcessor.h b/src/gpu/GrXferProcessor.h index a739c8b29e..a848a96d0a 100644 --- a/src/gpu/GrXferProcessor.h +++ b/src/gpu/GrXferProcessor.h @@ -55,45 +55,55 @@ public: * to the space of the texture. Depending on GPU capabilities a DstTexture may be used by a * GrXferProcessor for blending in the fragment shader. */ - class DstTexture { + class DstProxy { public: - DstTexture() { fOffset.set(0, 0); } + DstProxy() { fOffset.set(0, 0); } - DstTexture(const DstTexture& other) { + DstProxy(const DstProxy& other) { *this = other; } - DstTexture(GrTexture* texture, const SkIPoint& offset) - : fTexture(SkSafeRef(texture)), fOffset(texture ? offset : SkIPoint{0, 0}) {} + DstProxy(sk_sp<GrTextureProxy> proxy, const SkIPoint& offset) + : fProxy(std::move(proxy)) { + if (fProxy) { + fOffset = offset; + } else { + fOffset.set(0, 0); + } + } - DstTexture& operator=(const DstTexture& other) { - fTexture = other.fTexture; + DstProxy& operator=(const DstProxy& other) { + fProxy = other.fProxy; fOffset = other.fOffset; return *this; } - bool operator==(const DstTexture& that) const { - return fTexture == that.fTexture && fOffset == that.fOffset; + bool operator==(const DstProxy& that) const { + return fProxy == that.fProxy && fOffset == that.fOffset; } - bool operator!=(const DstTexture& that) const { return !(*this == that); } + bool operator!=(const DstProxy& that) const { return !(*this == that); } const SkIPoint& offset() const { return fOffset; } void setOffset(const SkIPoint& offset) { fOffset = offset; } void setOffset(int ox, int oy) { fOffset.set(ox, oy); } - GrTexture* texture() const { return fTexture.get(); } + GrTextureProxy* proxy() const { return fProxy.get(); } - void setTexture(sk_sp<GrTexture> texture) { - fTexture = std::move(texture); - if (!fTexture) { + void setProxy(sk_sp<GrTextureProxy> proxy) { + fProxy = std::move(proxy); + if (!fProxy) { fOffset = {0, 0}; } } + bool instantiate(GrResourceProvider* resourceProvider) { + return SkToBool(fProxy->instantiate(resourceProvider)); + } + private: - sk_sp<GrTexture> fTexture; - SkIPoint fOffset; + sk_sp<GrTextureProxy> fProxy; + SkIPoint fOffset; }; /** @@ -234,7 +244,7 @@ private: #endif class GrXPFactory { public: - typedef GrXferProcessor::DstTexture DstTexture; + typedef GrXferProcessor::DstProxy DstProxy; enum class AnalysisProperties : unsigned { kNone = 0x0, diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index ec08bf4634..8277d6eb4e 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -92,7 +92,12 @@ void GrGLProgram::setData(const GrPrimitiveProcessor& primProc, const GrPipeline const GrXferProcessor& xp = pipeline.getXferProcessor(); SkIPoint offset; - GrTexture* dstTexture = pipeline.dstTexture(&offset); + GrTextureProxy* dstProxy = pipeline.dstTextureProxy(&offset); + GrTexture* dstTexture = nullptr; + if (dstProxy) { + dstTexture = dstProxy->priv().peekTexture(); + } + fXferProcessor->setData(fProgramDataManager, xp, dstTexture, offset); if (dstTexture) { fGpu->bindTexture(nextTexSamplerIdx++, GrSamplerParams::ClampNoFilter(), true, diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.cpp b/src/gpu/glsl/GrGLSLProgramBuilder.cpp index 96b3359d4e..2a895125e8 100644 --- a/src/gpu/glsl/GrGLSLProgramBuilder.cpp +++ b/src/gpu/glsl/GrGLSLProgramBuilder.cpp @@ -237,7 +237,10 @@ void GrGLSLProgramBuilder::emitAndInstallXferProc(const SkString& colorIn, SamplerHandle dstTextureSamplerHandle; GrSurfaceOrigin dstTextureOrigin = kTopLeft_GrSurfaceOrigin; - if (GrTexture* dstTexture = fPipeline.dstTexture()) { + + if (GrTextureProxy* dstTextureProxy = fPipeline.dstTextureProxy()) { + GrTexture* dstTexture = dstTextureProxy->priv().peekTexture(); + // GrProcessor::TextureSampler sampler(dstTexture); SkString name("DstTextureSampler"); dstTextureSamplerHandle = diff --git a/src/gpu/instanced/InstancedOp.cpp b/src/gpu/instanced/InstancedOp.cpp index 83a10da410..f0f1cc0d2d 100644 --- a/src/gpu/instanced/InstancedOp.cpp +++ b/src/gpu/instanced/InstancedOp.cpp @@ -229,6 +229,7 @@ void InstancedOp::onExecute(GrOpFlushState* state) { GrPipeline::InitArgs args; args.fAppliedClip = state->drawOpArgs().fAppliedClip; args.fCaps = &state->caps(); + args.fResourceProvider = state->resourceProvider(); args.fProcessors = &fProcessors; args.fFlags = GrAATypeIsHW(fInfo.aaType()) ? GrPipeline::kHWAntialias_Flag : 0; if (fAllowsSRGBInputs) { @@ -238,7 +239,7 @@ void InstancedOp::onExecute(GrOpFlushState* state) { args.fFlags |= GrPipeline::kDisableOutputConversionToSRGB_Flag; } args.fRenderTarget = state->drawOpArgs().fRenderTarget; - args.fDstTexture = state->drawOpArgs().fDstTexture; + args.fDstProxy = state->drawOpArgs().fDstProxy; pipeline.init(args); if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*state->gpu()->caps())) { diff --git a/src/gpu/ops/GrDrawPathOp.cpp b/src/gpu/ops/GrDrawPathOp.cpp index ccb12bfe9c..c33af39365 100644 --- a/src/gpu/ops/GrDrawPathOp.cpp +++ b/src/gpu/ops/GrDrawPathOp.cpp @@ -48,7 +48,8 @@ void GrDrawPathOpBase::initPipeline(const GrOpFlushState& state, GrPipeline* pip args.fAppliedClip = state.drawOpArgs().fAppliedClip; args.fRenderTarget = state.drawOpArgs().fRenderTarget; args.fCaps = &state.caps(); - args.fDstTexture = state.drawOpArgs().fDstTexture; + args.fResourceProvider = state.resourceProvider(); + args.fDstProxy = state.drawOpArgs().fDstProxy; return pipeline->init(args); } diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h index 427543bc98..c230257c1c 100644 --- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h +++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h @@ -137,8 +137,9 @@ protected: args.fProcessors = &this->processors(); args.fRenderTarget = target->renderTarget(); args.fAppliedClip = target->clip(); - args.fDstTexture = target->dstTexture(); + args.fDstProxy = target->dstProxy(); args.fCaps = &target->caps(); + args.fResourceProvider = target->resourceProvider(); return args; } diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp index 124802d3b2..b3aa7c001a 100644 --- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp +++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp @@ -533,7 +533,8 @@ void GrVkGpuCommandBuffer::onDraw(const GrPipeline& pipeline, while (const GrFragmentProcessor* fp = iter.next()) { prepare_sampled_images(*fp, fGpu); } - if (GrVkTexture* dstTexture = static_cast<GrVkTexture*>(pipeline.dstTexture())) { + if (GrTextureProxy* dstTextureProxy = pipeline.dstTextureProxy()) { + GrVkTexture* dstTexture = static_cast<GrVkTexture*>(dstTextureProxy->priv().peekTexture()); set_texture_layout(dstTexture, fGpu); } diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp index c4d723f9c2..3948fa87d2 100644 --- a/src/gpu/vk/GrVkPipelineState.cpp +++ b/src/gpu/vk/GrVkPipelineState.cpp @@ -7,6 +7,7 @@ #include "GrVkPipelineState.h" +#include "GrContext.h" #include "GrPipeline.h" #include "GrTexturePriv.h" #include "GrVkBufferView.h" @@ -258,12 +259,17 @@ void GrVkPipelineState::setData(GrVkGpu* gpu, SkASSERT(!fp && !glslFP); SkIPoint offset; - GrTexture* dstTexture = pipeline.dstTexture(&offset); + GrTextureProxy* dstTextureProxy = nullptr; + GrTexture* dstTexture = nullptr; + if (dstTextureProxy = pipeline.dstTextureProxy(&offset)) { + dstTexture = dstTextureProxy->priv().peekTexture(); + } + fXferProcessor->setData(fDataManager, pipeline.getXferProcessor(), dstTexture, offset); GrResourceIOProcessor::TextureSampler dstTextureSampler; - if (dstTexture) { + if (dstTextureProxy) { // MDB TODO: this is the last usage of a GrTexture-based TextureSampler reset method - dstTextureSampler.reset(dstTexture); + dstTextureSampler.reset(gpu->getContext()->resourceProvider(), sk_ref_sp(dstTextureProxy)); textureBindings.push_back(&dstTextureSampler); } diff --git a/tests/GrPorterDuffTest.cpp b/tests/GrPorterDuffTest.cpp index 780573d34f..e43347e641 100644 --- a/tests/GrPorterDuffTest.cpp +++ b/tests/GrPorterDuffTest.cpp @@ -1044,11 +1044,12 @@ DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) { kRGBA_8888_GrPixelConfig, backendTexHandle); - GrXferProcessor::DstTexture fakeDstTexture; - fakeDstTexture.setTexture( - ctx->resourceProvider()->wrapBackendTexture(backendTex, kTopLeft_GrSurfaceOrigin, - kNone_GrBackendTextureFlag, 0, - kBorrow_GrWrapOwnership)); + GrXferProcessor::DstProxy fakeDstProxy; + { + sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrappedBackend(ctx, backendTex, + kTopLeft_GrSurfaceOrigin); + fakeDstProxy.setProxy(std::move(proxy)); + } static const GrProcessorAnalysisColor colorInputs[] = { GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes, |