Index: src/image/SkSurface_Gpu.cpp |
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp |
index 5fb4b718a27b3a664a00cf1d055166ddf4dd70c2..49a668ec3ffaa81a1f6537eb65318baa5817e03d 100644 |
--- a/src/image/SkSurface_Gpu.cpp |
+++ b/src/image/SkSurface_Gpu.cpp |
@@ -7,7 +7,6 @@ |
#include "SkSurface_Gpu.h" |
-#include "GrGpuResourcePriv.h" |
#include "SkCanvas.h" |
#include "SkGpuDevice.h" |
#include "SkImage_Base.h" |
@@ -21,9 +20,12 @@ |
SkSurface_Gpu::SkSurface_Gpu(SkGpuDevice* device) |
: INHERITED(device->width(), device->height(), &device->surfaceProps()) |
, fDevice(SkRef(device)) { |
+ fDevice->setSurface(this); |
} |
SkSurface_Gpu::~SkSurface_Gpu() { |
+ // In case the device outlives this instance, make sure device does not try to access this. |
+ fDevice->setSurface(NULL); |
fDevice->unref(); |
} |
@@ -69,22 +71,7 @@ void SkSurface_Gpu::onCopyOnWrite(ContentChangeMode mode) { |
SkImage* image = this->getCachedImage(kNo_Budgeted); |
SkASSERT(image); |
if (rt->asTexture() == SkTextureImageGetTexture(image)) { |
- GrRenderTarget* oldRT = this->fDevice->accessRenderTarget(); |
- SkSurface::Budgeted budgeted = oldRT->resourcePriv().isBudgeted() ? kYes_Budgeted : |
- kNo_Budgeted; |
- SkAutoTUnref<GrRenderTarget> newRT( |
- SkGpuDevice::CreateRenderTarget(oldRT->getContext(), budgeted, fDevice->imageInfo(), |
- oldRT->numSamples())); |
- |
- if (kRetain_ContentChangeMode == mode && !oldRT->wasDestroyed() && newRT) { |
- oldRT->getContext()->copySurface(newRT, oldRT); |
- } |
- |
- SkASSERT(this->getCachedCanvas()); |
- SkASSERT(this->getCachedCanvas()->getDevice() == fDevice); |
- |
- this->fDevice->swapRenderTarget(newRT); |
- |
+ fDevice->detachBackendRenderTarget(kRetain_ContentChangeMode == mode); |
SkTextureImageApplyBudgetedDecision(image); |
} else if (kDiscard_ContentChangeMode == mode) { |
this->SkSurface_Gpu::onDiscard(); |