| 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() {
|
|
|