Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(753)

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2402603002: State management cleanup (Closed)
Patch Set: Make state dirtying explosive Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 a366b15a9e14285279172f72552b64a191083adf..a4c85145b1f29aeb10939916169e41b22a48e1c2 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,
@@ -1375,9 +1373,6 @@ WebGLRenderingContextBase::clearIfComposited(GLbitfield mask) {
true, true, true,
!drawingBuffer()->defaultBufferRequiresAlphaChannelToBePreserved());
drawingBuffer()->clearFramebuffers(clearMask);
-
- restoreStateAfterClear();
- drawingBuffer()->restoreFramebufferBindings();
drawingBuffer()->setBufferClearNeeded(false);
return combinedClear ? CombinedClear : JustClear;
@@ -1410,27 +1405,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,23 +1413,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())
@@ -1492,7 +1449,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 +1471,7 @@ ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData(
return nullptr;
clearIfComposited();
- drawingBuffer()->commit();
+ drawingBuffer()->resolveAndBindForReadAndDraw();
ScopedFramebufferRestorer restorer(this);
int width, height;
WTF::ArrayBufferContents contents;
@@ -1562,17 +1519,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 +1540,6 @@ void WebGLRenderingContextBase::activeTexture(GLenum texture) {
}
m_activeTextureUnit = texture - GL_TEXTURE0;
contextGL()->ActiveTexture(texture);
-
- drawingBuffer()->setActiveTextureUnit(texture);
}
void WebGLRenderingContextBase::attachShader(WebGLProgram* program,
@@ -1686,10 +1631,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 +1670,6 @@ void WebGLRenderingContextBase::bindRenderbuffer(
}
m_renderbufferBinding = renderBuffer;
contextGL()->BindRenderbuffer(target, objectOrZero(renderBuffer));
-
- drawingBuffer()->setRenderbufferBinding(objectOrZero(renderBuffer));
-
if (renderBuffer)
renderBuffer->setHasEverBeenBound();
}
@@ -1754,9 +1692,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 +1953,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 +1980,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 +2190,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 +2201,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 +2218,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 +2241,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 +2318,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 +2455,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 +3857,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 +5875,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 +6031,32 @@ void WebGLRenderingContextBase::stop() {
}
}
+void WebGLRenderingContextBase::GetDrawingBufferRestoreState(
+ DrawingBufferRestoreState* restoreState) {
+ restoreState->scissorEnabled = m_scissorEnabled;
+
+ memcpy(restoreState->clearColor, m_clearColor, sizeof(m_clearColor));
+ restoreState->clearDepth = m_clearDepth;
+ restoreState->clearStencil = m_clearStencil;
+
+ memcpy(restoreState->colorMask, m_colorMask, sizeof(m_colorMask));
+ restoreState->depthMask = m_depthMask;
+ restoreState->stencilMask = m_stencilMask;
+
+ restoreState->packAlignment = m_packAlignment;
+
+ if (m_activeTextureUnit < m_textureUnits.size()) {
+ restoreState->activeTexture2DBinding = objectOrZero(
+ m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get());
+ }
+ restoreState->renderbufferBinding = objectOrZero(m_renderbufferBinding.get());
+ restoreState->drawFramebufferBinding =
+ objectOrZero(m_framebufferBinding.get());
+ restoreState->readFramebufferBinding =
+ objectOrZero(m_framebufferBinding.get());
+ restoreState->pixelUnpackBufferBinding = 0;
+}
+
ScriptValue WebGLRenderingContextBase::getBooleanParameter(
ScriptState* scriptState,
GLenum pname) {
@@ -7408,9 +7350,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);

Powered by Google App Engine
This is Rietveld 408576698