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

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

Issue 1673113002: Move WebGL1 attachment image type / attachment point matching check to command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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 779d6a88f055e11b74eff905aa9350ac381763b0..b5715e16af0b389c83c4665e1bb4a7772bfb1bb6 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -581,6 +581,10 @@ PassOwnPtr<WebGraphicsContext3D> WebGLRenderingContextBase::createWebGraphicsCon
canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcontextcreationerror, false, true, extractWebGLContextCreationError(glInfo)));
return nullptr;
}
+ if (context->getString(GL_EXTENSIONS).utf8().find("GL_OES_packed_depth_stencil") == std::string::npos) {
+ canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcontextcreationerror, false, true, "OES_packed_depth_stencil support is required."));
+ return nullptr;
+ }
return context.release();
}
@@ -2046,18 +2050,6 @@ WebGLRenderbuffer* WebGLRenderingContextBase::createRenderbuffer()
return o;
}
-WebGLRenderbuffer* WebGLRenderingContextBase::ensureEmulatedStencilBuffer(GLenum target, WebGLRenderbuffer* renderbuffer)
-{
- if (isContextLost())
- return nullptr;
- if (!renderbuffer->emulatedStencilBuffer()) {
- renderbuffer->setEmulatedStencilBuffer(createRenderbuffer());
- webContext()->bindRenderbuffer(target, objectOrZero(renderbuffer->emulatedStencilBuffer()));
- webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
- }
- return renderbuffer->emulatedStencilBuffer();
-}
-
const WebGLSamplerState* WebGLRenderingContextBase::getTextureUnitSamplerState(GLenum target, GLuint unit) const
{
ASSERT(unit < m_textureUnits.size());
@@ -2414,32 +2406,17 @@ void WebGLRenderingContextBase::framebufferRenderbuffer(ScriptState* scriptState
return;
}
Platform3DObject bufferObject = objectOrZero(buffer);
- switch (attachment) {
- case GL_DEPTH_STENCIL_ATTACHMENT:
- if (isWebGL2OrHigher() || isDepthStencilSupported() || !buffer) {
- webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
- webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
- } else {
- WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuffer(renderbuffertarget, buffer);
- if (!emulatedStencilBuffer) {
- synthesizeGLError(GL_OUT_OF_MEMORY, "framebufferRenderbuffer", "out of memory");
- return;
- }
- webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
- webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, objectOrZero(emulatedStencilBuffer));
- }
- break;
- default:
- webContext()->framebufferRenderbuffer(target, attachment, renderbuffertarget, bufferObject);
- }
if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
// On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT + STENCIL_ATTACHMENT.
// We divide it here so in WebGLFramebuffer, we don't have to handle DEPTH_STENCIL_ATTACHMENT in WebGL 2.
+ webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, bufferObject);
+ webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
framebufferBinding->setAttachmentForBoundFramebuffer(target, GL_DEPTH_ATTACHMENT, buffer);
framebufferBinding->setAttachmentForBoundFramebuffer(target, GL_STENCIL_ATTACHMENT, buffer);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", GL_DEPTH_ATTACHMENT, buffer);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", GL_STENCIL_ATTACHMENT, buffer);
} else {
+ webContext()->framebufferRenderbuffer(target, attachment, renderbuffertarget, bufferObject);
framebufferBinding->setAttachmentForBoundFramebuffer(target, attachment, buffer);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", attachment, buffer);
}
@@ -2470,22 +2447,17 @@ void WebGLRenderingContextBase::framebufferTexture2D(ScriptState* scriptState, G
return;
}
Platform3DObject textureObject = objectOrZero(texture);
- switch (attachment) {
- case GL_DEPTH_STENCIL_ATTACHMENT:
- webContext()->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget, textureObject, level);
- webContext()->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget, textureObject, level);
- break;
- default:
- webContext()->framebufferTexture2D(target, attachment, textarget, textureObject, level);
- }
if (isWebGL2OrHigher() && attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
// On ES3, DEPTH_STENCIL_ATTACHMENT is like an alias for DEPTH_ATTACHMENT + STENCIL_ATTACHMENT.
// We divide it here so in WebGLFramebuffer, we don't have to handle DEPTH_STENCIL_ATTACHMENT in WebGL 2.
+ webContext()->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarget, textureObject, level);
+ webContext()->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textarget, textureObject, level);
framebufferBinding->setAttachmentForBoundFramebuffer(target, GL_DEPTH_ATTACHMENT, textarget, texture, level, 0);
framebufferBinding->setAttachmentForBoundFramebuffer(target, GL_STENCIL_ATTACHMENT, textarget, texture, level, 0);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", GL_DEPTH_ATTACHMENT, texture);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", GL_STENCIL_ATTACHMENT, texture);
} else {
+ webContext()->framebufferTexture2D(target, attachment, textarget, textureObject, level);
framebufferBinding->setAttachmentForBoundFramebuffer(target, attachment, textarget, texture, level, 0);
preserveObjectWrapper(scriptState, framebufferBinding, "attachment", attachment, texture);
}
@@ -3095,13 +3067,7 @@ ScriptValue WebGLRenderingContextBase::getRenderbufferParameter(ScriptState* scr
webContext()->getRenderbufferParameteriv(target, pname, &value);
return WebGLAny(scriptState, value);
case GL_RENDERBUFFER_STENCIL_SIZE:
- if (m_renderbufferBinding->emulatedStencilBuffer()) {
- webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding->emulatedStencilBuffer()));
- webContext()->getRenderbufferParameteriv(target, pname, &value);
- webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
- } else {
- webContext()->getRenderbufferParameteriv(target, pname, &value);
- }
+ webContext()->getRenderbufferParameteriv(target, pname, &value);
return WebGLAny(scriptState, value);
case GL_RENDERBUFFER_INTERNAL_FORMAT:
return WebGLAny(scriptState, m_renderbufferBinding->internalFormat());
@@ -3857,7 +3823,6 @@ void WebGLRenderingContextBase::renderbufferStorageImpl(
webContext()->renderbufferStorage(target, internalformat, width, height);
m_renderbufferBinding->setInternalFormat(internalformat);
m_renderbufferBinding->setSize(width, height);
- m_renderbufferBinding->deleteEmulatedStencilBuffer(webContext());
break;
case GL_SRGB8_ALPHA8_EXT:
if (!extensionEnabled(EXTsRGBName)) {
@@ -3867,24 +3832,10 @@ void WebGLRenderingContextBase::renderbufferStorageImpl(
webContext()->renderbufferStorage(target, internalformat, width, height);
m_renderbufferBinding->setInternalFormat(internalformat);
m_renderbufferBinding->setSize(width, height);
- m_renderbufferBinding->deleteEmulatedStencilBuffer(webContext());
break;
case GL_DEPTH_STENCIL_OES:
- if (isDepthStencilSupported()) {
- webContext()->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, width, height);
- } else {
- WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuffer(target, m_renderbufferBinding.get());
- if (!emulatedStencilBuffer) {
- synthesizeGLError(GL_OUT_OF_MEMORY, functionName, "out of memory");
- break;
- }
- webContext()->renderbufferStorage(target, GL_DEPTH_COMPONENT16, width, height);
- webContext()->bindRenderbuffer(target, objectOrZero(emulatedStencilBuffer));
- webContext()->renderbufferStorage(target, GL_STENCIL_INDEX8, width, height);
- webContext()->bindRenderbuffer(target, objectOrZero(m_renderbufferBinding.get()));
- emulatedStencilBuffer->setSize(width, height);
- emulatedStencilBuffer->setInternalFormat(GL_STENCIL_INDEX8);
- }
+ ASSERT(isDepthStencilSupported());
+ webContext()->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, width, height);
m_renderbufferBinding->setSize(width, height);
m_renderbufferBinding->setInternalFormat(internalformat);
break;

Powered by Google App Engine
This is Rietveld 408576698