Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index 76547760c9bf25216012ababfee672c81a54deee..9d08f641eb7d8f4322d7615388fe032710e52ef1 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -2403,8 +2403,11 @@ |
GrSurface* src, |
const SkIRect& srcRect, |
const SkIPoint& dstPoint) { |
+ bool inheritedCouldCopy = INHERITED::onCanCopySurface(dst, src, srcRect, dstPoint); |
bool copied = false; |
- if (can_copy_texsubimage(dst, src, this)) { |
+ bool wouldNeedTempFBO = false; |
+ if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && |
+ (!wouldNeedTempFBO || !inheritedCouldCopy)) { |
GrGLuint srcFBO; |
GrGLIRect srcVP; |
srcFBO = this->bindSurfaceAsFBO(src, GR_GL_FRAMEBUFFER, &srcVP); |
@@ -2436,7 +2439,8 @@ |
if (srcFBO) { |
GL_CALL(DeleteFramebuffers(1, &srcFBO)); |
} |
- } else if (can_blit_framebuffer(dst, src, this)) { |
+ } else if (can_blit_framebuffer(dst, src, this, &wouldNeedTempFBO) && |
+ (!wouldNeedTempFBO || !inheritedCouldCopy)) { |
SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, |
srcRect.width(), srcRect.height()); |
bool selfOverlap = false; |
@@ -2499,6 +2503,10 @@ |
copied = true; |
} |
} |
+ if (!copied && inheritedCouldCopy) { |
+ copied = INHERITED::onCopySurface(dst, src, srcRect, dstPoint); |
+ SkASSERT(copied); |
+ } |
return copied; |
} |
@@ -2506,14 +2514,11 @@ |
GrSurface* src, |
const SkIRect& srcRect, |
const SkIPoint& dstPoint) { |
- // This mirrors the logic in onCopySurface. We prefer our base makes the copy if we need to |
- // create a temp fbo |
- // TODO verify this assumption, it may not be true at all |
- bool wouldNeedTempFBO = false; |
- if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTempFBO) { |
+ // This mirrors the logic in onCopySurface. |
+ if (can_copy_texsubimage(dst, src, this)) { |
return true; |
} |
- if (can_blit_framebuffer(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTempFBO) { |
+ if (can_blit_framebuffer(dst, src, this)) { |
if (dst->surfacePriv().isSameAs(src)) { |
SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, |
srcRect.width(), srcRect.height()); |
@@ -2524,7 +2529,7 @@ |
return true; |
} |
} |
- return false; |
+ return INHERITED::onCanCopySurface(dst, src, srcRect, dstPoint); |
} |
void GrGpuGL::didAddGpuTraceMarker() { |