| Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp | 
| diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp | 
| index 2844f45682b8ab3a4195f816f74bd025998e89e4..0a53aa1b67f1f18adcb8f1dcecffad57654b781e 100644 | 
| --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp | 
| +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp | 
| @@ -714,7 +714,7 @@ PassRefPtr<Image> WebGLRenderingContextBase::getImage( | 
| if (!drawingBuffer()) | 
| return nullptr; | 
|  | 
| -  drawingBuffer()->commit(); | 
| +  drawingBuffer()->resolveAndBindForReadAndDraw(); | 
| IntSize size = clampedCanvasSize(); | 
| OpacityMode opacityMode = | 
| creationAttributes().hasAlpha() ? NonOpaque : Opaque; | 
| @@ -1053,7 +1053,7 @@ PassRefPtr<DrawingBuffer> WebGLRenderingContextBase::createDrawingBuffer( | 
| NOTREACHED(); | 
| } | 
| return DrawingBuffer::create( | 
| -      std::move(contextProvider), clampedCanvasSize(), premultipliedAlpha, | 
| +      std::move(contextProvider), this, clampedCanvasSize(), premultipliedAlpha, | 
| wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing, | 
| preserve, webGLVersion, chromiumImageUsage); | 
| } | 
| @@ -1084,12 +1084,10 @@ void WebGLRenderingContextBase::initializeNewContext() { | 
| m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; | 
|  | 
| m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; | 
| -  drawingBuffer()->setClearColor(m_clearColor); | 
| m_scissorEnabled = false; | 
| m_clearDepth = 1; | 
| m_clearStencil = 0; | 
| m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true; | 
| -  drawingBuffer()->setColorMask(m_colorMask); | 
|  | 
| GLint numCombinedTextureImageUnits = 0; | 
| contextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, | 
| @@ -1376,8 +1374,11 @@ WebGLRenderingContextBase::clearIfComposited(GLbitfield mask) { | 
| !drawingBuffer()->defaultBufferRequiresAlphaChannelToBePreserved()); | 
| drawingBuffer()->clearFramebuffers(clearMask); | 
|  | 
| -  restoreStateAfterClear(); | 
| -  drawingBuffer()->restoreFramebufferBindings(); | 
| +  // Call the DrawingBufferClient method to restore scissor test, mask, and | 
| +  // clear values, because we dirtied them above. | 
| +  DrawingBufferClientRestoreScissorTest(); | 
| +  DrawingBufferClientRestoreMaskAndClearValues(); | 
| + | 
| drawingBuffer()->setBufferClearNeeded(false); | 
|  | 
| return combinedClear ? CombinedClear : JustClear; | 
| @@ -1410,27 +1411,6 @@ void WebGLRenderingContextBase::restoreClearColor() { | 
| m_clearColor[3]); | 
| } | 
|  | 
| -void WebGLRenderingContextBase::restoreClearDepthf() { | 
| -  if (isContextLost()) | 
| -    return; | 
| - | 
| -  contextGL()->ClearDepthf(m_clearDepth); | 
| -} | 
| - | 
| -void WebGLRenderingContextBase::restoreClearStencil() { | 
| -  if (isContextLost()) | 
| -    return; | 
| - | 
| -  contextGL()->ClearStencil(m_clearStencil); | 
| -} | 
| - | 
| -void WebGLRenderingContextBase::restoreStencilMaskSeparate() { | 
| -  if (isContextLost()) | 
| -    return; | 
| - | 
| -  contextGL()->StencilMaskSeparate(GL_FRONT, m_stencilMask); | 
| -} | 
| - | 
| void WebGLRenderingContextBase::restoreColorMask() { | 
| if (isContextLost()) | 
| return; | 
| @@ -1439,24 +1419,6 @@ void WebGLRenderingContextBase::restoreColorMask() { | 
| m_colorMask[3]); | 
| } | 
|  | 
| -void WebGLRenderingContextBase::restoreDepthMask() { | 
| -  if (isContextLost()) | 
| -    return; | 
| - | 
| -  contextGL()->DepthMask(m_depthMask); | 
| -} | 
| - | 
| -void WebGLRenderingContextBase::restoreStateAfterClear() { | 
| -  // Restore clear-related state items back to what the context had set. | 
| -  restoreScissorEnabled(); | 
| -  restoreClearColor(); | 
| -  restoreColorMask(); | 
| -  restoreClearDepthf(); | 
| -  restoreClearStencil(); | 
| -  restoreStencilMaskSeparate(); | 
| -  restoreDepthMask(); | 
| -} | 
| - | 
| void WebGLRenderingContextBase::markLayerComposited() { | 
| if (!isContextLost()) | 
| drawingBuffer()->setBufferClearNeeded(true); | 
| @@ -1492,7 +1454,7 @@ bool WebGLRenderingContextBase::paintRenderingResultsToCanvas( | 
| ScopedTexture2DRestorer restorer(this); | 
| ScopedFramebufferRestorer fboRestorer(this); | 
|  | 
| -  drawingBuffer()->commit(); | 
| +  drawingBuffer()->resolveAndBindForReadAndDraw(); | 
| if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer( | 
| drawingBuffer(), sourceBuffer)) { | 
| // Currently, copyRenderingResultsFromDrawingBuffer is expected to always | 
| @@ -1514,7 +1476,7 @@ ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData( | 
| return nullptr; | 
|  | 
| clearIfComposited(); | 
| -  drawingBuffer()->commit(); | 
| +  drawingBuffer()->resolveAndBindForReadAndDraw(); | 
| ScopedFramebufferRestorer restorer(this); | 
| int width, height; | 
| WTF::ArrayBufferContents contents; | 
| @@ -1562,17 +1524,7 @@ void WebGLRenderingContextBase::reshape(int width, int height) { | 
|  | 
| // We don't have to mark the canvas as dirty, since the newly created image | 
| // buffer will also start off clear (and this matches what reshape will do). | 
| -  drawingBuffer()->reset(IntSize(width, height)); | 
| -  restoreStateAfterClear(); | 
| - | 
| -  contextGL()->BindTexture( | 
| -      GL_TEXTURE_2D, | 
| -      objectOrZero( | 
| -          m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get())); | 
| -  contextGL()->BindRenderbuffer(GL_RENDERBUFFER, | 
| -                                objectOrZero(m_renderbufferBinding.get())); | 
| -  drawingBuffer()->restoreFramebufferBindings(); | 
| -  drawingBuffer()->restorePixelUnpackBufferBindings(); | 
| +  drawingBuffer()->resize(IntSize(width, height)); | 
| } | 
|  | 
| int WebGLRenderingContextBase::drawingBufferWidth() const { | 
| @@ -1593,8 +1545,6 @@ void WebGLRenderingContextBase::activeTexture(GLenum texture) { | 
| } | 
| m_activeTextureUnit = texture - GL_TEXTURE0; | 
| contextGL()->ActiveTexture(texture); | 
| - | 
| -  drawingBuffer()->setActiveTextureUnit(texture); | 
| } | 
|  | 
| void WebGLRenderingContextBase::attachShader(WebGLProgram* program, | 
| @@ -1686,10 +1636,6 @@ void WebGLRenderingContextBase::bindBuffer(GLenum target, WebGLBuffer* buffer) { | 
| } | 
| if (!validateAndUpdateBufferBindTarget("bindBuffer", target, buffer)) | 
| return; | 
| - | 
| -  if (target == GL_PIXEL_UNPACK_BUFFER) { | 
| -    drawingBuffer()->setPixelUnpackBufferBinding(objectOrZero(buffer)); | 
| -  } | 
| contextGL()->BindBuffer(target, objectOrZero(buffer)); | 
| } | 
|  | 
| @@ -1729,9 +1675,6 @@ void WebGLRenderingContextBase::bindRenderbuffer( | 
| } | 
| m_renderbufferBinding = renderBuffer; | 
| contextGL()->BindRenderbuffer(target, objectOrZero(renderBuffer)); | 
| - | 
| -  drawingBuffer()->setRenderbufferBinding(objectOrZero(renderBuffer)); | 
| - | 
| if (renderBuffer) | 
| renderBuffer->setHasEverBeenBound(); | 
| } | 
| @@ -1754,9 +1697,6 @@ void WebGLRenderingContextBase::bindTexture(GLenum target, | 
|  | 
| if (target == GL_TEXTURE_2D) { | 
| m_textureUnits[m_activeTextureUnit].m_texture2DBinding = texture; | 
| - | 
| -    if (!m_activeTextureUnit) | 
| -      drawingBuffer()->setTexture2DBinding(objectOrZero(texture)); | 
| } else if (target == GL_TEXTURE_CUBE_MAP) { | 
| m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = texture; | 
| } else if (isWebGL2OrHigher() && target == GL_TEXTURE_2D_ARRAY) { | 
| @@ -2018,7 +1958,6 @@ void WebGLRenderingContextBase::clearColor(GLfloat r, | 
| m_clearColor[1] = g; | 
| m_clearColor[2] = b; | 
| m_clearColor[3] = a; | 
| -  drawingBuffer()->setClearColor(m_clearColor); | 
| contextGL()->ClearColor(r, g, b, a); | 
| } | 
|  | 
| @@ -2046,7 +1985,6 @@ void WebGLRenderingContextBase::colorMask(GLboolean red, | 
| m_colorMask[1] = green; | 
| m_colorMask[2] = blue; | 
| m_colorMask[3] = alpha; | 
| -  drawingBuffer()->setColorMask(m_colorMask); | 
| contextGL()->ColorMask(red, green, blue, alpha); | 
| } | 
|  | 
| @@ -2257,10 +2195,8 @@ bool WebGLRenderingContextBase::deleteObject(WebGLObject* object) { | 
| } | 
|  | 
| void WebGLRenderingContextBase::deleteBuffer(WebGLBuffer* buffer) { | 
| -  GLuint bufferName = objectOrZero(buffer); | 
| if (!deleteObject(buffer)) | 
| return; | 
| -  drawingBuffer()->notifyBufferDeleted(bufferName); | 
| removeBoundBuffer(buffer); | 
| } | 
|  | 
| @@ -2270,7 +2206,6 @@ void WebGLRenderingContextBase::deleteFramebuffer( | 
| return; | 
| if (framebuffer == m_framebufferBinding) { | 
| m_framebufferBinding = nullptr; | 
| -    drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0); | 
| // Have to call drawingBuffer()->bind() here to bind back to internal fbo. | 
| drawingBuffer()->bind(GL_FRAMEBUFFER); | 
| } | 
| @@ -2288,7 +2223,6 @@ void WebGLRenderingContextBase::deleteRenderbuffer( | 
| return; | 
| if (renderbuffer == m_renderbufferBinding) { | 
| m_renderbufferBinding = nullptr; | 
| -    drawingBuffer()->setRenderbufferBinding(0); | 
| } | 
| if (m_framebufferBinding) | 
| m_framebufferBinding->removeAttachmentFromBoundFramebuffer(GL_FRAMEBUFFER, | 
| @@ -2312,8 +2246,6 @@ void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture) { | 
| if (texture == m_textureUnits[i].m_texture2DBinding) { | 
| m_textureUnits[i].m_texture2DBinding = nullptr; | 
| maxBoundTextureIndex = i; | 
| -      if (!i) | 
| -        drawingBuffer()->setTexture2DBinding(0); | 
| } | 
| if (texture == m_textureUnits[i].m_textureCubeMapBinding) { | 
| m_textureUnits[i].m_textureCubeMapBinding = nullptr; | 
| @@ -2391,10 +2323,8 @@ void WebGLRenderingContextBase::disable(GLenum cap) { | 
| applyStencilTest(); | 
| return; | 
| } | 
| -  if (cap == GL_SCISSOR_TEST) { | 
| +  if (cap == GL_SCISSOR_TEST) | 
| m_scissorEnabled = false; | 
| -    drawingBuffer()->setScissorEnabled(m_scissorEnabled); | 
| -  } | 
| contextGL()->Disable(cap); | 
| } | 
|  | 
| @@ -2530,10 +2460,8 @@ void WebGLRenderingContextBase::enable(GLenum cap) { | 
| applyStencilTest(); | 
| return; | 
| } | 
| -  if (cap == GL_SCISSOR_TEST) { | 
| +  if (cap == GL_SCISSOR_TEST) | 
| m_scissorEnabled = true; | 
| -    drawingBuffer()->setScissorEnabled(m_scissorEnabled); | 
| -  } | 
| contextGL()->Enable(cap); | 
| } | 
|  | 
| @@ -3934,7 +3862,6 @@ void WebGLRenderingContextBase::pixelStorei(GLenum pname, GLint param) { | 
| if (param == 1 || param == 2 || param == 4 || param == 8) { | 
| if (pname == GL_PACK_ALIGNMENT) { | 
| m_packAlignment = param; | 
| -          drawingBuffer()->setPackAlignment(param); | 
| } else {  // GL_UNPACK_ALIGNMENT: | 
| m_unpackAlignment = param; | 
| } | 
| @@ -5953,12 +5880,6 @@ void WebGLRenderingContextBase::loseContextImpl( | 
| ASSERT(m_contextLostMode != NotLostContext); | 
| m_autoRecoveryMethod = autoRecoveryMethod; | 
|  | 
| -  // Make absolutely sure we do not refer to an already-deleted texture or | 
| -  // framebuffer. | 
| -  drawingBuffer()->setTexture2DBinding(0); | 
| -  drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0); | 
| -  drawingBuffer()->setRenderbufferBinding(0); | 
| - | 
| detachAndRemoveAllObjects(); | 
|  | 
| // Lose all the extensions. | 
| @@ -6115,6 +6036,62 @@ void WebGLRenderingContextBase::stop() { | 
| } | 
| } | 
|  | 
| +bool WebGLRenderingContextBase::DrawingBufferClientIsBoundForDraw() { | 
| +  return !m_framebufferBinding; | 
| +} | 
| + | 
| +void WebGLRenderingContextBase::DrawingBufferClientRestoreScissorTest() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  if (m_scissorEnabled) | 
| +    contextGL()->Enable(GL_SCISSOR_TEST); | 
| +  else | 
| +    contextGL()->Disable(GL_SCISSOR_TEST); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase::DrawingBufferClientRestoreMaskAndClearValues() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  contextGL()->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], | 
| +                         m_colorMask[3]); | 
| +  contextGL()->DepthMask(m_depthMask); | 
| +  contextGL()->StencilMaskSeparate(GL_FRONT, m_stencilMask); | 
| + | 
| +  contextGL()->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], | 
| +                          m_clearColor[3]); | 
| +  contextGL()->ClearDepthf(m_clearDepth); | 
| +  contextGL()->ClearStencil(m_clearStencil); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase::DrawingBufferClientRestorePixelPackAlignment() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  contextGL()->PixelStorei(GL_PACK_ALIGNMENT, m_packAlignment); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase::DrawingBufferClientRestoreTexture2DBinding() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  restoreCurrentTexture2D(); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase:: | 
| +    DrawingBufferClientRestoreRenderbufferBinding() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  contextGL()->BindRenderbuffer(GL_RENDERBUFFER, | 
| +                                objectOrZero(m_renderbufferBinding.get())); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase::DrawingBufferClientRestoreFramebufferBinding() { | 
| +  if (!contextGL()) | 
| +    return; | 
| +  restoreCurrentFramebuffer(); | 
| +} | 
| + | 
| +void WebGLRenderingContextBase:: | 
| +    DrawingBufferClientRestorePixelUnpackBufferBinding() {} | 
| + | 
| ScriptValue WebGLRenderingContextBase::getBooleanParameter( | 
| ScriptState* scriptState, | 
| GLenum pname) { | 
| @@ -7408,9 +7385,6 @@ void WebGLRenderingContextBase::setFramebuffer(GLenum target, | 
| m_framebufferBinding = buffer; | 
| applyStencilTest(); | 
| } | 
| -  drawingBuffer()->setFramebufferBinding( | 
| -      target, objectOrZero(getFramebufferBinding(target))); | 
| - | 
| if (!buffer) { | 
| // Instead of binding fb 0, bind the drawing buffer. | 
| drawingBuffer()->bind(target); | 
| @@ -7424,8 +7398,10 @@ void WebGLRenderingContextBase::restoreCurrentFramebuffer() { | 
| } | 
|  | 
| void WebGLRenderingContextBase::restoreCurrentTexture2D() { | 
| -  bindTexture(GL_TEXTURE_2D, | 
| -              m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()); | 
| +  if (m_activeTextureUnit < m_textureUnits.size()) { | 
| +    bindTexture(GL_TEXTURE_2D, | 
| +                m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get()); | 
| +  } | 
| } | 
|  | 
| void WebGLRenderingContextBase::findNewMaxNonDefaultTextureUnit() { | 
|  |