| Index: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
 | 
| diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
 | 
| index 21d3da230dc7f2d3f92a359faf98267abc2f4685..19d3be5113c8cc0bcd30e5d7f020e8242380facb 100644
 | 
| --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
 | 
| +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
 | 
| @@ -217,6 +217,7 @@ bool Canvas2DLayerBridge::prepareIOSurfaceMailboxFromImage(SkImage* image, WebEx
 | 
|      if (imageInfo.empty())
 | 
|          return false;
 | 
|  
 | 
| +    gpu::gles2::GLES2Interface* gl = contextGL();
 | 
|      GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextureHandle(true))->fID;
 | 
|      context()->copySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE);
 | 
|  
 | 
| @@ -226,14 +227,14 @@ bool Canvas2DLayerBridge::prepareIOSurfaceMailboxFromImage(SkImage* image, WebEx
 | 
|      context()->produceTextureDirectCHROMIUM(imageInfo.m_textureId, info.m_mailbox.textureTarget, info.m_mailbox.name);
 | 
|      info.m_mailbox.allowOverlay = true;
 | 
|  
 | 
| -    const WGC3Duint64 fenceSync = context()->insertFenceSyncCHROMIUM();
 | 
| +    const WGC3Duint64 fenceSync = gl->InsertFenceSyncCHROMIUM();
 | 
|      context()->flush();
 | 
|      info.m_mailbox.validSyncToken = context()->genSyncTokenCHROMIUM(fenceSync, info.m_mailbox.syncToken);
 | 
|  
 | 
|      info.m_imageInfo = imageInfo;
 | 
|      *outMailbox = info.m_mailbox;
 | 
|  
 | 
| -    context()->bindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0);
 | 
| +    gl->BindTexture(GC3D_TEXTURE_RECTANGLE_ARB, 0);
 | 
|  
 | 
|      // Because we are changing the texture binding without going through skia,
 | 
|      // we must dirty the context.
 | 
| @@ -251,6 +252,7 @@ Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture
 | 
|      }
 | 
|  
 | 
|      WebGraphicsContext3D* webContext = context();
 | 
| +    gpu::gles2::GLES2Interface* gl = contextGL();
 | 
|      GLuint imageId = webContext->createGpuMemoryBufferImageCHROMIUM(m_size.width(), m_size.height(), GL_BGRA_EXT, GC3D_SCANOUT_CHROMIUM);
 | 
|      if (!imageId)
 | 
|          return Canvas2DLayerBridge::ImageInfo();
 | 
| @@ -262,7 +264,7 @@ Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture
 | 
|      }
 | 
|  
 | 
|      GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
 | 
| -    webContext->bindTexture(target, textureId);
 | 
| +    gl->BindTexture(target, textureId);
 | 
|      webContext->texParameteri(target, GL_TEXTURE_MAG_FILTER, getGLFilter());
 | 
|      webContext->texParameteri(target, GL_TEXTURE_MIN_FILTER, getGLFilter());
 | 
|      webContext->texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | 
| @@ -274,16 +276,17 @@ Canvas2DLayerBridge::ImageInfo Canvas2DLayerBridge::createIOSurfaceBackedTexture
 | 
|  
 | 
|  void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info)
 | 
|  {
 | 
| -    if (m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
 | 
| +    WebGraphicsContext3D* webContext = context();
 | 
| +    gpu::gles2::GLES2Interface* gl = contextGL();
 | 
| +    if (gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
 | 
|          return;
 | 
|  
 | 
|      GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
 | 
| -    WebGraphicsContext3D* webContext = context();
 | 
| -    webContext->bindTexture(target, info.m_textureId);
 | 
| +    gl->BindTexture(target, info.m_textureId);
 | 
|      webContext->releaseTexImage2DCHROMIUM(target, info.m_imageId);
 | 
|      webContext->destroyImageCHROMIUM(info.m_imageId);
 | 
|      webContext->deleteTexture(info.m_textureId);
 | 
| -    webContext->bindTexture(target, 0);
 | 
| +    gl->BindTexture(target, 0);
 | 
|  
 | 
|      resetSkiaTextureBinding();
 | 
|  }
 | 
| @@ -341,8 +344,9 @@ bool Canvas2DLayerBridge::prepareMailboxFromImage(PassRefPtr<SkImage> image, Web
 | 
|      mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D;
 | 
|  
 | 
|      WebGraphicsContext3D* webContext = context();
 | 
| +    gpu::gles2::GLES2Interface* gl = contextGL();
 | 
|      GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_image->getTextureHandle(true))->fID;
 | 
| -    webContext->bindTexture(GL_TEXTURE_2D, textureID);
 | 
| +    gl->BindTexture(GL_TEXTURE_2D, textureID);
 | 
|      webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter());
 | 
|      webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, getGLFilter());
 | 
|      webContext->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | 
| @@ -366,11 +370,11 @@ bool Canvas2DLayerBridge::prepareMailboxFromImage(PassRefPtr<SkImage> image, Web
 | 
|      } else {
 | 
|          // FIXME: We'd rather insert a syncpoint than perform a flush here,
 | 
|          // but currently the canvas will flicker if we don't flush here.
 | 
| -        const WGC3Duint64 fenceSync = webContext->insertFenceSyncCHROMIUM();
 | 
| +        const GLuint64 fenceSync = gl->InsertFenceSyncCHROMIUM();
 | 
|          webContext->flush();
 | 
|          mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM(fenceSync, mailboxInfo.m_mailbox.syncToken);
 | 
|      }
 | 
| -    webContext->bindTexture(GL_TEXTURE_2D, 0);
 | 
| +    gl->BindTexture(GL_TEXTURE_2D, 0);
 | 
|      // Because we are changing the texture binding without going through skia,
 | 
|      // we must dirty the context.
 | 
|      grContext->resetContext(kTextureBinding_GrGLBackendState);
 | 
| @@ -718,6 +722,17 @@ WebGraphicsContext3D* Canvas2DLayerBridge::context()
 | 
|      return m_contextProvider ? m_contextProvider->context3d() : 0;
 | 
|  }
 | 
|  
 | 
| +gpu::gles2::GLES2Interface* Canvas2DLayerBridge::contextGL()
 | 
| +{
 | 
| +    // Check on m_layer is necessary because contextGL() may be called during
 | 
| +    // the destruction of m_layer
 | 
| +    if (m_layer && !m_destructionInProgress) {
 | 
| +        // Ensure rate limiter is disabled if context is lost.
 | 
| +        checkSurfaceValid();
 | 
| +    }
 | 
| +    return m_contextProvider ? m_contextProvider->contextGL() : nullptr;
 | 
| +}
 | 
| +
 | 
|  bool Canvas2DLayerBridge::checkSurfaceValid()
 | 
|  {
 | 
|      ASSERT(!m_destructionInProgress);
 | 
| @@ -844,7 +859,7 @@ void Canvas2DLayerBridge::mailboxReleased(const WebExternalTextureMailbox& mailb
 | 
|              ASSERT(releasedMailboxInfo->m_imageInfo.empty());
 | 
|  #endif // USE_IOSURFACE_FOR_2D_CANVAS
 | 
|              if (mailbox.validSyncToken) {
 | 
| -                context()->waitSyncTokenCHROMIUM(mailbox.syncToken);
 | 
| +                contextGL()->WaitSyncTokenCHROMIUM(mailbox.syncToken);
 | 
|              }
 | 
|              GrTexture* texture = releasedMailboxInfo->m_image->getTexture();
 | 
|              if (texture) {
 | 
| 
 |