| Index: src/gpu/gl/GrGLGpu.cpp
 | 
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
 | 
| index 838ad5881f1b50317e9a7423584142734791cef7..266f3a8419a253902aa3943fe3836cf5245b4e50 100644
 | 
| --- a/src/gpu/gl/GrGLGpu.cpp
 | 
| +++ b/src/gpu/gl/GrGLGpu.cpp
 | 
| @@ -2293,31 +2293,50 @@ bool GrGLGpu::readPixelsSupported(GrRenderTarget* target, GrPixelConfig readConf
 | 
|          this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkIRect::EmptyIRect());
 | 
|          return true;
 | 
|      };
 | 
| +    auto unbindRenderTarget = []{};
 | 
|      auto getIntegerv = [this](GrGLenum query, GrGLint* value) {
 | 
|          GR_GL_GetIntegerv(this->glInterface(), query, value);
 | 
|      };
 | 
|      GrPixelConfig rtConfig = target->config();
 | 
| -    return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv, bindRenderTarget);
 | 
| +    return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv, bindRenderTarget,
 | 
| +                                              unbindRenderTarget);
 | 
|  }
 | 
|  
 | 
|  bool GrGLGpu::readPixelsSupported(GrPixelConfig rtConfig, GrPixelConfig readConfig) {
 | 
| -    auto bindRenderTarget = [this, rtConfig]() -> bool {
 | 
| +    sk_sp<GrTexture> temp;
 | 
| +    auto bindRenderTarget = [this, rtConfig, &temp]() -> bool {
 | 
|          GrTextureDesc desc;
 | 
|          desc.fConfig = rtConfig;
 | 
|          desc.fWidth = desc.fHeight = 16;
 | 
| -        desc.fFlags = kRenderTarget_GrSurfaceFlag;
 | 
| -        sk_sp<GrTexture> temp(this->createTexture(desc, SkBudgeted::kNo));
 | 
| -        if (!temp) {
 | 
| -            return false;
 | 
| +        if (this->glCaps().isConfigRenderable(rtConfig, false)) {
 | 
| +            desc.fFlags = kRenderTarget_GrSurfaceFlag;
 | 
| +            temp.reset(this->createTexture(desc, SkBudgeted::kNo));
 | 
| +            if (!temp) {
 | 
| +                return false;
 | 
| +            }
 | 
| +            GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(temp->asRenderTarget());
 | 
| +            this->flushRenderTarget(glrt, &SkIRect::EmptyIRect());
 | 
| +            return true;
 | 
| +        } else if (this->glCaps().canConfigBeFBOColorAttachment(rtConfig)) {
 | 
| +            temp.reset(this->createTexture(desc, SkBudgeted::kNo));
 | 
| +            if (!temp) {
 | 
| +                return false;
 | 
| +            }
 | 
| +            GrGLIRect vp;
 | 
| +            this->bindSurfaceFBOForPixelOps(temp.get(), GR_GL_FRAMEBUFFER, &vp, kDst_TempFBOTarget);
 | 
| +            fHWBoundRenderTargetUniqueID = 0;
 | 
| +            return true;
 | 
|          }
 | 
| -        GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(temp->asRenderTarget());
 | 
| -        this->flushRenderTarget(glrt, &SkIRect::EmptyIRect());
 | 
| -        return true;
 | 
| +        return false;
 | 
| +    };
 | 
| +    auto unbindRenderTarget = [this, &temp]() {
 | 
| +        this->unbindTextureFBOForPixelOps(GR_GL_FRAMEBUFFER, temp.get());
 | 
|      };
 | 
|      auto getIntegerv = [this](GrGLenum query, GrGLint* value) {
 | 
|          GR_GL_GetIntegerv(this->glInterface(), query, value);
 | 
|      };
 | 
| -    return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv, bindRenderTarget);
 | 
| +    return this->glCaps().readPixelsSupported(rtConfig, readConfig, getIntegerv, bindRenderTarget,
 | 
| +                                              unbindRenderTarget);
 | 
|  }
 | 
|  
 | 
|  bool GrGLGpu::readPixelsSupported(GrSurface* surfaceForConfig, GrPixelConfig readConfig) {
 | 
| 
 |