Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index 7b881d60a298e31005aefd375d6428b55df6b70f..fda57984677eced76ba3cfeda87a30da99438aaf 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -16,6 +16,7 @@ |
#include "GrContext.h" |
#include "GrBitmapTextContext.h" |
#include "GrDistanceFieldTextContext.h" |
+#include "GrGpuResourcePriv.h" |
#include "GrLayerHoister.h" |
#include "GrRecordReplaceDraw.h" |
#include "GrStrokeInfo.h" |
@@ -45,6 +46,7 @@ |
#include "SkXfermode.h" |
#include "SkErrorInternals.h" |
+ |
#if SK_SUPPORT_GPU |
enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; |
@@ -149,6 +151,7 @@ static SkSurfaceProps copy_or_default_props(const SkSurfaceProps* props) { |
SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, const SkSurfaceProps* props, unsigned flags) |
: INHERITED(surfaceprops_to_deviceprops(props)) |
, fSurfaceProps(copy_or_default_props(props)) |
+ , fSurface(NULL) |
{ |
fDrawProcs = NULL; |
@@ -233,12 +236,17 @@ SkGpuDevice::~SkGpuDevice() { |
fContext->setClip(NULL); |
} |
- fRenderTarget->unref(); |
fContext->unref(); |
} |
/////////////////////////////////////////////////////////////////////////////// |
+void SkGpuDevice::discard() { |
+ if (fSurface) { |
+ fSurface->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); |
+ } |
+} |
+ |
bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, |
int x, int y) { |
DO_DEFERRED_CLEAR(); |
@@ -297,6 +305,9 @@ void SkGpuDevice::onDetachFromCanvas() { |
// and not the state from some other canvas/device |
void SkGpuDevice::prepareDraw(const SkDraw& draw) { |
SkASSERT(fClipData.fClipStack); |
+ if (fSurface) { |
+ fSurface->aboutToDraw(SkSurface::kRetain_ContentChangeMode); |
+ } |
fContext->setRenderTarget(fRenderTarget); |
@@ -322,16 +333,33 @@ void SkGpuDevice::clearAll() { |
fNeedClear = false; |
} |
-void SkGpuDevice::swapRenderTarget(GrRenderTarget* newRenderTarget) { |
+void SkGpuDevice::detachBackendRenderTarget(bool retainContent) { |
SkASSERT(!fNeedClear); |
if (fContext->getRenderTarget() == fRenderTarget) { |
fContext->setRenderTarget(NULL); |
} |
- SkRefCnt_SafeAssign(fRenderTarget, newRenderTarget); |
- SkASSERT(newRenderTarget->surfacePriv().info() == fLegacyBitmap.info()); |
- SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (newRenderTarget->surfacePriv().info(), |
- newRenderTarget)); |
- fLegacyBitmap.setPixelRef(pr)->unref(); |
+ |
+ GrRenderTarget* oldRT = fRenderTarget; |
+ SkSurface::Budgeted budgeted = oldRT->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgeted : |
+ SkSurface::kNo_Budgeted; |
+ |
+ GrRenderTarget* newRT = CreateRenderTarget(oldRT->getContext(), budgeted, this->imageInfo(), |
+ oldRT->numSamples()); |
+ if (newRT) { |
+ if (retainContent && !oldRT->wasDestroyed()) { |
+ oldRT->getContext()->copySurface(newRT, oldRT); |
+ } |
+ |
+ if (fRenderTarget != newRT) { |
+ fRenderTarget->unref(); |
+ fRenderTarget = newRT; |
+ } |
+ |
+ SkASSERT(newRT->surfacePriv().info() == fLegacyBitmap.info()); |
+ SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (newRT->surfacePriv().info(), |
+ newRT)); |
+ fLegacyBitmap.setPixelRef(pr)->unref(); |
+ } |
} |
/////////////////////////////////////////////////////////////////////////////// |