Index: src/image/SkSurface_Gpu.cpp |
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp |
index a1c31f31379ad022735e69dd5a64636f6149fca4..5fb4b718a27b3a664a00cf1d055166ddf4dd70c2 100644 |
--- a/src/image/SkSurface_Gpu.cpp |
+++ b/src/image/SkSurface_Gpu.cpp |
@@ -24,7 +24,7 @@ SkSurface_Gpu::SkSurface_Gpu(SkGpuDevice* device) |
} |
SkSurface_Gpu::~SkSurface_Gpu() { |
- SkSafeUnref(fDevice); |
+ fDevice->unref(); |
} |
SkCanvas* SkSurface_Gpu::onNewCanvas() { |
@@ -59,8 +59,8 @@ void SkSurface_Gpu::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, |
canvas->drawBitmap(fDevice->accessBitmap(false), x, y, paint); |
} |
-// Create a new SkGpuDevice and, if necessary, copy the contents of the old |
-// device into it. Note that this flushes the SkGpuDevice but |
+// Create a new render target and, if necessary, copy the contents of the old |
+// render target into it. Note that this flushes the SkGpuDevice but |
// doesn't force an OpenGL flush. |
void SkSurface_Gpu::onCopyOnWrite(ContentChangeMode mode) { |
GrRenderTarget* rt = fDevice->accessRenderTarget(); |
@@ -71,19 +71,19 @@ void SkSurface_Gpu::onCopyOnWrite(ContentChangeMode mode) { |
if (rt->asTexture() == SkTextureImageGetTexture(image)) { |
GrRenderTarget* oldRT = this->fDevice->accessRenderTarget(); |
SkSurface::Budgeted budgeted = oldRT->resourcePriv().isBudgeted() ? kYes_Budgeted : |
- kNo_Budgeted; |
- SkAutoTUnref<SkGpuDevice> newDevice( |
- SkGpuDevice::Create(oldRT->getContext(), budgeted, fDevice->imageInfo(), |
- oldRT->numSamples(), &this->props(), 0)); |
- if (kRetain_ContentChangeMode == mode && !oldRT->wasDestroyed() && newDevice) { |
- oldRT->getContext()->copySurface(newDevice->accessRenderTarget(), oldRT); |
+ 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->getCachedCanvas()->setRootDevice(newDevice); |
- SkRefCnt_SafeAssign(fDevice, newDevice.get()); |
+ this->fDevice->swapRenderTarget(newRT); |
SkTextureImageApplyBudgetedDecision(image); |
} else if (kDiscard_ContentChangeMode == mode) { |
@@ -95,6 +95,7 @@ void SkSurface_Gpu::onDiscard() { |
fDevice->accessRenderTarget()->discard(); |
} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
SkSurface* SkSurface::NewRenderTargetDirect(GrRenderTarget* target, const SkSurfaceProps* props) { |
@@ -107,9 +108,13 @@ SkSurface* SkSurface::NewRenderTargetDirect(GrRenderTarget* target, const SkSurf |
SkSurface* SkSurface::NewRenderTarget(GrContext* ctx, Budgeted budgeted, const SkImageInfo& info, |
int sampleCount, const SkSurfaceProps* props) { |
- SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(ctx, budgeted, info, sampleCount, props, |
- SkGpuDevice::kNeedClear_Flag)); |
- if (!device) { |
+ SkAutoTUnref<GrRenderTarget> rt(SkGpuDevice::CreateRenderTarget(ctx, budgeted, info, |
bsalomon
2015/02/18 14:29:37
It seems a tad unfortunate to require this two ste
Kimmo Kinnunen
2015/02/18 15:06:46
Yeah.. Once the texture creation succeeds, the SkG
Kimmo Kinnunen
2015/02/19 15:52:18
Done.
|
+ sampleCount)); |
+ if (NULL == rt) { |
+ return NULL; |
+ } |
+ SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(rt, props, SkGpuDevice::kNeedClear_Flag)); |
+ if (NULL == device) { |
return NULL; |
} |
return SkNEW_ARGS(SkSurface_Gpu, (device)); |