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

Unified Diff: Source/core/html/canvas/WebGLRenderingContextBase.cpp

Issue 795833004: Use dictionaries for context creation attributes. Eliminate custom bindings. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years 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: Source/core/html/canvas/WebGLRenderingContextBase.cpp
diff --git a/Source/core/html/canvas/WebGLRenderingContextBase.cpp b/Source/core/html/canvas/WebGLRenderingContextBase.cpp
index b814a1b920247f8d51f2315cac8877997d5b7951..41d867f23882fae8122affe01e34789b92363459 100644
--- a/Source/core/html/canvas/WebGLRenderingContextBase.cpp
+++ b/Source/core/html/canvas/WebGLRenderingContextBase.cpp
@@ -42,6 +42,7 @@
#include "core/html/canvas/ANGLEInstancedArrays.h"
#include "core/html/canvas/CHROMIUMSubscribeUniform.h"
#include "core/html/canvas/CHROMIUMValuebuffer.h"
+#include "core/html/canvas/ContextAttributeHelpers.h"
#include "core/html/canvas/EXTBlendMinMax.h"
#include "core/html/canvas/EXTFragDepth.h"
#include "core/html/canvas/EXTShaderTextureLOD.h"
@@ -558,7 +559,7 @@ private:
RawPtrWillBeMember<WebGLRenderingContextBase> m_context;
};
-WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassOwnPtr<blink::WebGraphicsContext3D> context, WebGLContextAttributes* requestedAttributes)
+WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassOwnPtr<blink::WebGraphicsContext3D> context, const WebGLContextAttributes& requestedAttributes)
: CanvasRenderingContext(passedCanvas)
, ActiveDOMObject(&passedCanvas->document())
, m_contextLostMode(NotLostContext)
@@ -567,7 +568,7 @@ WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCa
, m_restoreAllowed(false)
, m_restoreTimer(this, &WebGLRenderingContextBase::maybeRestoreContext)
, m_generatedImageCache(4)
- , m_requestedAttributes(requestedAttributes->clone())
+ , m_requestedAttributes(requestedAttributes)
, m_synthesizedErrorsToConsole(true)
, m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
, m_multisamplingAllowed(false)
@@ -602,12 +603,12 @@ PassRefPtr<DrawingBuffer> WebGLRenderingContextBase::createDrawingBuffer(PassOwn
RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptRef(new WebGLRenderingContextEvictionManager());
blink::WebGraphicsContext3D::Attributes attrs;
- attrs.alpha = m_requestedAttributes->alpha();
- attrs.depth = m_requestedAttributes->depth();
- attrs.stencil = m_requestedAttributes->stencil();
- attrs.antialias = m_requestedAttributes->antialias();
- attrs.premultipliedAlpha = m_requestedAttributes->premultipliedAlpha();
- DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->preserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
+ attrs.alpha = m_requestedAttributes.alpha();
+ attrs.depth = m_requestedAttributes.depth();
+ attrs.stencil = m_requestedAttributes.stencil();
+ attrs.antialias = m_requestedAttributes.antialias();
+ attrs.premultipliedAlpha = m_requestedAttributes.premultipliedAlpha();
+ DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes.preserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
return DrawingBuffer::create(context, clampedCanvasSize(), preserve, attrs, contextEvictionManager.release());
}
@@ -698,7 +699,7 @@ void WebGLRenderingContextBase::setupFlags()
if (Page* p = canvas()->document().page()) {
m_synthesizedErrorsToConsole = p->settings().webGLErrorsToConsoleEnabled();
- if (!m_multisamplingObserverRegistered && m_requestedAttributes->antialias()) {
+ if (!m_multisamplingObserverRegistered && m_requestedAttributes.antialias()) {
m_multisamplingAllowed = drawingBuffer()->multisample();
p->addMultisamplingChangedObserver(this);
m_multisamplingObserverRegistered = true;
@@ -823,7 +824,12 @@ WebGLRenderingContextBase::HowToClear WebGLRenderingContextBase::clearIfComposit
if (!drawingBuffer()->bufferClearNeeded() || (mask && m_framebufferBinding))
return Skipped;
- RefPtrWillBeRawPtr<WebGLContextAttributes> contextAttributes = getContextAttributes();
+ Nullable<WebGLContextAttributes> contextAttributes;
+ getContextAttributes(contextAttributes);
+ if (contextAttributes.isNull()) {
+ // Unlikely, but context was lost.
+ return Skipped;
+ }
// Determine if it's possible to combine the clear the user asked for and this clear.
bool combinedClear = mask && !m_scissorEnabled;
@@ -839,13 +845,13 @@ WebGLRenderingContextBase::HowToClear WebGLRenderingContextBase::clearIfComposit
}
webContext()->colorMask(true, true, true, true);
GLbitfield clearMask = GL_COLOR_BUFFER_BIT;
- if (contextAttributes->depth()) {
+ if (contextAttributes.get().depth()) {
if (!combinedClear || !m_depthMask || !(mask & GL_DEPTH_BUFFER_BIT))
webContext()->clearDepth(1.0f);
clearMask |= GL_DEPTH_BUFFER_BIT;
webContext()->depthMask(true);
}
- if (contextAttributes->stencil()) {
+ if (contextAttributes.get().stencil()) {
if (combinedClear && (mask & GL_STENCIL_BUFFER_BIT))
webContext()->clearStencil(m_clearStencil & m_stencilMask);
else
@@ -2109,22 +2115,19 @@ ScriptValue WebGLRenderingContextBase::getBufferParameter(ScriptState* scriptSta
return WebGLAny(scriptState, static_cast<unsigned>(value));
}
-PassRefPtrWillBeRawPtr<WebGLContextAttributes> WebGLRenderingContextBase::getContextAttributes()
+void WebGLRenderingContextBase::getContextAttributes(Nullable<WebGLContextAttributes>& result)
{
if (isContextLost())
- return nullptr;
- // We always need to return a new WebGLContextAttributes object to
- // prevent the user from mutating any cached version.
- blink::WebGraphicsContext3D::Attributes attrs = drawingBuffer()->getActualAttributes();
- RefPtrWillBeRawPtr<WebGLContextAttributes> attributes = m_requestedAttributes->clone();
+ return;
+ result.set(m_requestedAttributes);
// Some requested attributes may not be honored, so we need to query the underlying
// context/drawing buffer and adjust accordingly.
- if (m_requestedAttributes->depth() && !attrs.depth)
- attributes->setDepth(false);
- if (m_requestedAttributes->stencil() && !attrs.stencil)
- attributes->setStencil(false);
- attributes->setAntialias(drawingBuffer()->multisample());
- return attributes.release();
+ blink::WebGraphicsContext3D::Attributes attrs = drawingBuffer()->getActualAttributes();
+ if (m_requestedAttributes.depth() && !attrs.depth)
+ result.get().setDepth(false);
+ if (m_requestedAttributes.stencil() && !attrs.stencil)
+ result.get().setStencil(false);
+ result.get().setAntialias(drawingBuffer()->multisample());
}
GLenum WebGLRenderingContextBase::getError()
@@ -2304,7 +2307,7 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* scriptState, GL
case GL_CURRENT_PROGRAM:
return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(m_currentProgram.get()));
case GL_DEPTH_BITS:
- if (!m_framebufferBinding && !m_requestedAttributes->depth())
+ if (!m_framebufferBinding && !m_requestedAttributes.depth())
return WebGLAny(scriptState, intZero);
return getIntParameter(scriptState, pname);
case GL_DEPTH_CLEAR_VALUE:
@@ -2403,7 +2406,7 @@ ScriptValue WebGLRenderingContextBase::getParameter(ScriptState* scriptState, GL
case GL_STENCIL_BACK_WRITEMASK:
return getUnsignedIntParameter(scriptState, pname);
case GL_STENCIL_BITS:
- if (!m_framebufferBinding && !m_requestedAttributes->stencil())
+ if (!m_framebufferBinding && !m_requestedAttributes.stencil())
return WebGLAny(scriptState, intZero);
return getIntParameter(scriptState, pname);
case GL_STENCIL_CLEAR_VALUE:
@@ -4596,7 +4599,7 @@ GLenum WebGLRenderingContextBase::boundFramebufferColorFormat()
{
if (m_framebufferBinding && m_framebufferBinding->object())
return m_framebufferBinding->colorBufferFormat();
- if (m_requestedAttributes->alpha())
+ if (m_requestedAttributes.alpha())
return GL_RGBA;
return GL_RGB;
}
@@ -5603,7 +5606,7 @@ void WebGLRenderingContextBase::maybeRestoreContext(Timer<WebGLRenderingContextB
#endif
}
- blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes->attributes(canvas()->document().topDocument().url().string(), settings, version());
+ blink::WebGraphicsContext3D::Attributes attributes = toWebGraphicsContext3DAttributes(m_requestedAttributes, canvas()->document().topDocument().url().string(), settings, version());
OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::current()->createOffscreenGraphicsContext3D(attributes, 0));
RefPtr<DrawingBuffer> buffer;
if (context) {
@@ -5742,8 +5745,9 @@ void WebGLRenderingContextBase::applyStencilTest()
if (m_framebufferBinding)
haveStencilBuffer = m_framebufferBinding->hasStencilBuffer();
else {
- RefPtrWillBeRawPtr<WebGLContextAttributes> attributes = getContextAttributes();
- haveStencilBuffer = attributes->stencil();
+ Nullable<WebGLContextAttributes> attributes;
+ getContextAttributes(attributes);
+ haveStencilBuffer = !attributes.isNull() && attributes.get().stencil();
}
enableOrDisable(GL_STENCIL_TEST,
m_stencilEnabled && haveStencilBuffer);

Powered by Google App Engine
This is Rietveld 408576698