Index: src/gpu/GrRenderTarget.cpp |
diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp |
index ad56cf761fff6e62afc5380d2532d9c82af48708..e547021227724d03e11ab0bb4c9053989eb8288e 100644 |
--- a/src/gpu/GrRenderTarget.cpp |
+++ b/src/gpu/GrRenderTarget.cpp |
@@ -16,6 +16,13 @@ |
#include "GrRenderTargetPriv.h" |
#include "GrStencilAttachment.h" |
+GrRenderTarget::~GrRenderTarget() { |
+ if (fLastDrawTarget) { |
+ fLastDrawTarget->clearRT(); |
+ } |
+ SkSafeUnref(fLastDrawTarget); |
+} |
+ |
void GrRenderTarget::discard() { |
// go through context so that all necessary flushing occurs |
GrContext* context = this->getContext(); |
@@ -57,24 +64,30 @@ void GrRenderTarget::overrideResolveRect(const SkIRect rect) { |
void GrRenderTarget::onRelease() { |
SkSafeSetNull(fStencilAttachment); |
- fLastDrawTarget = nullptr; |
INHERITED::onRelease(); |
} |
void GrRenderTarget::onAbandon() { |
SkSafeSetNull(fStencilAttachment); |
- fLastDrawTarget = nullptr; |
+ |
+ // The contents of this renderTarget are gone/invalid. It isn't useful to point back |
+ // the creating drawTarget. |
+ this->setLastDrawTarget(nullptr); |
INHERITED::onAbandon(); |
} |
void GrRenderTarget::setLastDrawTarget(GrDrawTarget* dt) { |
if (fLastDrawTarget) { |
+ // The non-MDB world never closes so we can't check this condition |
+#ifdef ENABLE_MDB |
SkASSERT(fLastDrawTarget->isClosed()); |
+#endif |
+ fLastDrawTarget->clearRT(); |
} |
- fLastDrawTarget = dt; |
+ SkRefCnt_SafeAssign(fLastDrawTarget, dt); |
} |
/////////////////////////////////////////////////////////////////////////////// |