From 941d1446e0247b3af5d607def3ae87ee66031381 Mon Sep 17 00:00:00 2001 From: Robert Phillips Date: Wed, 14 Jun 2017 16:37:02 -0400 Subject: Prevent onFlushCB created opLists from being grouped with the normal ones (new) Change-Id: I8ee04bb40a51f5b432b4c896a0c3e50559977463 Reviewed-on: https://skia-review.googlesource.com/19902 Commit-Queue: Robert Phillips Reviewed-by: Chris Dalton --- src/gpu/GrDrawingManager.cpp | 12 ++++++++---- src/gpu/GrDrawingManager.h | 7 +++++-- src/gpu/GrOnFlushResourceProvider.cpp | 4 ++-- src/gpu/GrRenderTargetContext.cpp | 8 +++++--- src/gpu/GrRenderTargetContext.h | 3 ++- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp index cb052ef666..99a097ac3c 100644 --- a/src/gpu/GrDrawingManager.cpp +++ b/src/gpu/GrDrawingManager.cpp @@ -224,7 +224,8 @@ void GrDrawingManager::addOnFlushCallbackObject(GrOnFlushCallbackObject* onFlush fOnFlushCBObjects.push_back(onFlushCBObject); } -sk_sp GrDrawingManager::newRTOpList(GrRenderTargetProxy* rtp) { +sk_sp GrDrawingManager::newRTOpList(GrRenderTargetProxy* rtp, + bool managedOpList) { SkASSERT(fContext); // This is a temporary fix for the partial-MDB world. In that world we're not reordering @@ -239,7 +240,9 @@ sk_sp GrDrawingManager::newRTOpList(GrRenderTargetProxy* r fContext->getAuditTrail())); SkASSERT(rtp->getLastOpList() == opList.get()); - fOpLists.push_back() = opList; + if (managedOpList) { + fOpLists.push_back() = opList; + } return opList; } @@ -306,7 +309,8 @@ GrPathRenderer* GrDrawingManager::getPathRenderer(const GrPathRenderer::CanDrawP sk_sp GrDrawingManager::makeRenderTargetContext( sk_sp sProxy, sk_sp colorSpace, - const SkSurfaceProps* surfaceProps) { + const SkSurfaceProps* surfaceProps, + bool managedOpList) { if (this->wasAbandoned() || !sProxy->asRenderTargetProxy()) { return nullptr; } @@ -347,7 +351,7 @@ sk_sp GrDrawingManager::makeRenderTargetContext( std::move(colorSpace), surfaceProps, fContext->getAuditTrail(), - fSingleOwner)); + fSingleOwner, managedOpList)); } sk_sp GrDrawingManager::makeTextureContext(sk_sp sProxy, diff --git a/src/gpu/GrDrawingManager.h b/src/gpu/GrDrawingManager.h index 15211eff5b..51c698ddfb 100644 --- a/src/gpu/GrDrawingManager.h +++ b/src/gpu/GrDrawingManager.h @@ -42,12 +42,15 @@ public: sk_sp makeRenderTargetContext(sk_sp, sk_sp, - const SkSurfaceProps*); + const SkSurfaceProps*, + bool managedOpList = true); sk_sp makeTextureContext(sk_sp, sk_sp); // The caller automatically gets a ref on the returned opList. It must // be balanced by an unref call. - sk_sp newRTOpList(GrRenderTargetProxy* rtp); + // A managed opList is controlled by the drawing manager (i.e., sorted & flushed with the + // other). An unmanaged one is created and used by the onFlushCallback. + sk_sp newRTOpList(GrRenderTargetProxy* rtp, bool managedOpList); sk_sp newTextureOpList(GrTextureProxy* textureProxy); GrContext* getContext() { return fContext; } diff --git a/src/gpu/GrOnFlushResourceProvider.cpp b/src/gpu/GrOnFlushResourceProvider.cpp index 8b031f4e32..7ecf63a54f 100644 --- a/src/gpu/GrOnFlushResourceProvider.cpp +++ b/src/gpu/GrOnFlushResourceProvider.cpp @@ -33,7 +33,7 @@ sk_sp GrOnFlushResourceProvider::makeRenderTargetContext( sk_sp renderTargetContext( fDrawingMgr->makeRenderTargetContext(std::move(proxy), std::move(colorSpace), - props)); + props, false)); if (!renderTargetContext) { return nullptr; @@ -53,7 +53,7 @@ sk_sp GrOnFlushResourceProvider::makeRenderTargetContext( sk_sp renderTargetContext( fDrawingMgr->makeRenderTargetContext(std::move(proxy), std::move(colorSpace), - props)); + props, false)); if (!renderTargetContext) { return nullptr; diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp index 601d16b841..7d752b43c7 100644 --- a/src/gpu/GrRenderTargetContext.cpp +++ b/src/gpu/GrRenderTargetContext.cpp @@ -106,13 +106,15 @@ GrRenderTargetContext::GrRenderTargetContext(GrContext* context, sk_sp colorSpace, const SkSurfaceProps* surfaceProps, GrAuditTrail* auditTrail, - GrSingleOwner* singleOwner) + GrSingleOwner* singleOwner, + bool managedOpList) : GrSurfaceContext(context, drawingMgr, std::move(colorSpace), auditTrail, singleOwner) , fRenderTargetProxy(std::move(rtp)) , fOpList(sk_ref_sp(fRenderTargetProxy->getLastRenderTargetOpList())) , fInstancedPipelineInfo(fRenderTargetProxy.get()) , fColorXformFromSRGB(nullptr) - , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) { + , fSurfaceProps(SkSurfacePropsCopyOrDefault(surfaceProps)) + , fManagedOpList(managedOpList) { if (fColorSpace) { // sRGB sources are very common (SkColor, etc...), so we cache that gamut transformation auto srgbColorSpace = SkColorSpace::MakeSRGB(); @@ -154,7 +156,7 @@ GrRenderTargetOpList* GrRenderTargetContext::getOpList() { SkDEBUGCODE(this->validate();) if (!fOpList || fOpList->isClosed()) { - fOpList = this->drawingManager()->newRTOpList(fRenderTargetProxy.get()); + fOpList = this->drawingManager()->newRTOpList(fRenderTargetProxy.get(), fManagedOpList); } return fOpList.get(); diff --git a/src/gpu/GrRenderTargetContext.h b/src/gpu/GrRenderTargetContext.h index 922482cdea..c471eacdde 100644 --- a/src/gpu/GrRenderTargetContext.h +++ b/src/gpu/GrRenderTargetContext.h @@ -351,7 +351,7 @@ public: protected: GrRenderTargetContext(GrContext*, GrDrawingManager*, sk_sp, sk_sp, const SkSurfaceProps*, GrAuditTrail*, - GrSingleOwner*); + GrSingleOwner*, bool managedOpList = true); SkDEBUGCODE(void validate() const;) @@ -431,6 +431,7 @@ private: sk_sp fColorXformFromSRGB; SkSurfaceProps fSurfaceProps; + bool fManagedOpList; typedef GrSurfaceContext INHERITED; }; -- cgit v1.2.3