| Index: src/image/SkSurface_Gpu.cpp
|
| ===================================================================
|
| --- src/image/SkSurface_Gpu.cpp (revision 8614)
|
| +++ src/image/SkSurface_Gpu.cpp (working copy)
|
| @@ -83,31 +83,24 @@
|
| canvas->drawBitmap(fDevice->accessBitmap(false), x, y, paint);
|
| }
|
|
|
| -// Copy the contents of the SkGpuDevice into a new texture and give that
|
| -// texture to the SkImage. Note that this flushes the SkGpuDevice but
|
| +// Create a new SkGpuDevice and, if necessary, copy the contents of the old
|
| +// device into it. Note that this flushes the SkGpuDevice but
|
| // doesn't force an OpenGL flush.
|
| -void SkSurface_Gpu::onCopyOnWrite(SkImage* image, SkCanvas*) {
|
| +void SkSurface_Gpu::onCopyOnWrite(SkImage* image, SkCanvas* canvas) {
|
| GrRenderTarget* rt = (GrRenderTarget*) fDevice->accessRenderTarget();
|
|
|
| // are we sharing our render target with the image?
|
| if (rt->asTexture() == SkTextureImageGetTexture(image)) {
|
| - GrTextureDesc desc;
|
| - // copyTexture requires a render target as the destination
|
| - desc.fFlags = kRenderTarget_GrTextureFlagBit;
|
| - desc.fWidth = fDevice->width();
|
| - desc.fHeight = fDevice->height();
|
| - desc.fConfig = SkBitmapConfig2GrPixelConfig(fDevice->config());
|
| - desc.fSampleCnt = 0;
|
| -
|
| - SkAutoTUnref<GrTexture> tex(fDevice->context()->createUncachedTexture(desc, NULL, 0));
|
| - if (NULL == tex) {
|
| - SkTextureImageSetTexture(image, NULL);
|
| - return;
|
| - }
|
| -
|
| - fDevice->context()->copyTexture(rt->asTexture(), tex->asRenderTarget());
|
| -
|
| - SkTextureImageSetTexture(image, tex);
|
| + SkGpuDevice* newDevice = static_cast<SkGpuDevice*>(
|
| + fDevice->createCompatibleDevice(fDevice->config(), fDevice->width(),
|
| + fDevice->height(), fDevice->isOpaque()));
|
| + SkAutoTUnref<SkGpuDevice> aurd(newDevice);
|
| + fDevice->context()->copyTexture(rt->asTexture(),
|
| + (GrRenderTarget*)newDevice->accessRenderTarget());
|
| + SkASSERT(NULL != canvas);
|
| + SkASSERT(canvas->getDevice() == fDevice);
|
| + canvas->setDevice(newDevice);
|
| + SkRefCnt_SafeAssign(fDevice, newDevice);
|
| }
|
| }
|
|
|
|
|