Manual revert of https://code.google.com/p/skia/source/detail?r=13353 due to perf...
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 4 Mar 2014 22:37:29 +0000 (22:37 +0000)
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 4 Mar 2014 22:37:29 +0000 (22:37 +0000)
BUG=344020
R=reed@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/187023002

git-svn-id: http://skia.googlecode.com/svn/trunk@13662 2bbb7eff-a529-9590-31e7-b0007b416f81

src/image/SkSurface_Gpu.cpp

index 746bb06..ae05ea8 100644 (file)
@@ -72,19 +72,20 @@ void SkSurface_Gpu::onCopyOnWrite(ContentChangeMode mode) {
     // are we sharing our render target with the image?
     SkASSERT(NULL != this->getCachedImage());
     if (rt->asTexture() == SkTextureImageGetTexture(this->getCachedImage())) {
-        SkAutoTUnref<SkGpuDevice> newDevice(SkGpuDevice::Create(fDevice->context(),
-                                                     fDevice->imageInfo(),
-                                                     rt->numSamples()));
-        SkASSERT(newDevice.get());
-
+        // We call createCompatibleDevice because it uses the texture cache. This isn't
+        // necessarily correct (http://skbug.com/2252), but never using the cache causes
+        // a Chromium regression. (http://crbug.com/344020)
+        SkGpuDevice* newDevice = static_cast<SkGpuDevice*>(
+            fDevice->createCompatibleDevice(fDevice->imageInfo()));
+        SkAutoTUnref<SkGpuDevice> aurd(newDevice);
         if (kRetain_ContentChangeMode == mode) {
-            fDevice->context()->copyTexture(rt->asTexture(),
-                reinterpret_cast<GrRenderTarget*>(newDevice->accessRenderTarget()));
+            fDevice->context()->copyTexture(rt->asTexture(), newDevice->accessRenderTarget());
         }
         SkASSERT(NULL != this->getCachedCanvas());
         SkASSERT(this->getCachedCanvas()->getDevice() == fDevice);
+
         this->getCachedCanvas()->setRootDevice(newDevice);
-        SkRefCnt_SafeAssign(fDevice, newDevice.get());
+        SkRefCnt_SafeAssign(fDevice, newDevice);
     }
 }