Chromium Code Reviews| Index: Source/core/html/canvas/WebGLFramebuffer.cpp |
| diff --git a/Source/core/html/canvas/WebGLFramebuffer.cpp b/Source/core/html/canvas/WebGLFramebuffer.cpp |
| index 7b1081c58c8eef40ee45c0885a411462b58ba25c..c4e456b754547949516249ee0cbed7e4a813bf56 100644 |
| --- a/Source/core/html/canvas/WebGLFramebuffer.cpp |
| +++ b/Source/core/html/canvas/WebGLFramebuffer.cpp |
| @@ -28,8 +28,8 @@ |
| #include "core/html/canvas/WebGLFramebuffer.h" |
| #include "core/html/canvas/WebGLRenderingContext.h" |
| -#include "platform/NotImplemented.h" |
| #include "core/platform/graphics/Extensions3D.h" |
| +#include "platform/NotImplemented.h" |
| namespace WebCore { |
| @@ -87,9 +87,9 @@ namespace { |
| GC3Denum WebGLRenderbufferAttachment::format() const |
| { |
| GC3Denum format = m_renderbuffer->internalFormat(); |
| - if (format == GraphicsContext3D::DEPTH_STENCIL |
| + if (format == GL_DEPTH_STENCIL_OES |
| && m_renderbuffer->emulatedStencilBuffer() |
| - && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GraphicsContext3D::STENCIL_INDEX8) { |
| + && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_STENCIL_INDEX8) { |
| return 0; |
| } |
| return format; |
| @@ -129,21 +129,22 @@ namespace { |
| void WebGLRenderbufferAttachment::attach(GraphicsContext3D* context, GC3Denum attachment) |
| { |
| Platform3DObject object = objectOrZero(m_renderbuffer.get()); |
| - if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT && m_renderbuffer->emulatedStencilBuffer()) { |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, object); |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, objectOrZero(m_renderbuffer->emulatedStencilBuffer())); |
| + if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT && m_renderbuffer->emulatedStencilBuffer()) { |
|
Ken Russell (switch to Gerrit)
2013/12/06 23:45:20
Eventually we'll probably want to rename this synt
|
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, object); |
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, objectOrZero(m_renderbuffer->emulatedStencilBuffer())); |
| } else { |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, attachment, GraphicsContext3D::RENDERBUFFER, object); |
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, object); |
| } |
| } |
| void WebGLRenderbufferAttachment::unattach(GraphicsContext3D* context, GC3Denum attachment) |
| { |
| - if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, 0); |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, 0); |
| - } else |
| - context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, attachment, GraphicsContext3D::RENDERBUFFER, 0); |
| + if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT) { |
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); |
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); |
| + } else { |
| + context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, 0); |
| + } |
| } |
| GC3Denum WebGLRenderbufferAttachment::type() const |
| @@ -239,16 +240,17 @@ namespace { |
| void WebGLTextureAttachment::attach(GraphicsContext3D* context, GC3Denum attachment) |
| { |
| Platform3DObject object = objectOrZero(m_texture.get()); |
| - context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, attachment, m_target, object, m_level); |
| + context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, object, m_level); |
| } |
| void WebGLTextureAttachment::unattach(GraphicsContext3D* context, GC3Denum attachment) |
| { |
| - if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { |
| - context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::DEPTH_ATTACHMENT, m_target, 0, m_level); |
| - context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::STENCIL_ATTACHMENT, m_target, 0, m_level); |
| - } else |
| - context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, attachment, m_target, 0, m_level); |
| + if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT) { |
| + context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_target, 0, m_level); |
| + context->framebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, m_target, 0, m_level); |
| + } else { |
| + context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, 0, m_level); |
| + } |
| } |
| GC3Denum WebGLTextureAttachment::type() const |
| @@ -259,9 +261,9 @@ namespace { |
| bool isColorRenderable(GC3Denum internalformat) |
| { |
| switch (internalformat) { |
| - case GraphicsContext3D::RGBA4: |
| - case GraphicsContext3D::RGB5_A1: |
| - case GraphicsContext3D::RGB565: |
| + case GL_RGBA4: |
| + case GL_RGB5_A1: |
| + case GL_RGB565: |
| return true; |
| default: |
| return false; |
| @@ -347,46 +349,46 @@ bool WebGLFramebuffer::isAttachmentComplete(WebGLAttachment* attachedObject, GC3 |
| WebGLSharedObject* object = attachedObject->object(); |
| ASSERT(object && (object->isTexture() || object->isRenderbuffer())); |
| - if (attachment == GraphicsContext3D::DEPTH_ATTACHMENT) { |
| + if (attachment == GL_DEPTH_ATTACHMENT) { |
| if (object->isRenderbuffer()) { |
| - if (internalformat != GraphicsContext3D::DEPTH_COMPONENT16) { |
| + if (internalformat != GL_DEPTH_COMPONENT16) { |
| *reason = "the internalformat of the attached renderbuffer is not DEPTH_COMPONENT16"; |
| return false; |
| } |
| } else if (object->isTexture()) { |
| GC3Denum type = attachedObject->type(); |
| - if (!(context()->m_webglDepthTexture && internalformat == GraphicsContext3D::DEPTH_COMPONENT |
| - && (type == GraphicsContext3D::UNSIGNED_SHORT || type == GraphicsContext3D::UNSIGNED_INT))) { |
| + if (!(context()->m_webglDepthTexture && internalformat == GL_DEPTH_COMPONENT |
| + && (type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT))) { |
| *reason = "the attached texture is not a depth texture"; |
| return false; |
| } |
| } |
| - } else if (attachment == GraphicsContext3D::STENCIL_ATTACHMENT) { |
| + } else if (attachment == GL_STENCIL_ATTACHMENT) { |
| // Depend on the underlying GL drivers to check stencil textures |
| // and check renderbuffer type here only. |
| if (object->isRenderbuffer()) { |
| - if (internalformat != GraphicsContext3D::STENCIL_INDEX8) { |
| + if (internalformat != GL_STENCIL_INDEX8) { |
| *reason = "the internalformat of the attached renderbuffer is not STENCIL_INDEX8"; |
| return false; |
| } |
| } |
| - } else if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { |
| + } else if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT) { |
| if (object->isRenderbuffer()) { |
| - if (internalformat != GraphicsContext3D::DEPTH_STENCIL) { |
| + if (internalformat != GL_DEPTH_STENCIL_OES) { |
| *reason = "the internalformat of the attached renderbuffer is not DEPTH_STENCIL"; |
| return false; |
| } |
| } else if (object->isTexture()) { |
| GC3Denum type = attachedObject->type(); |
| - if (!(context()->m_webglDepthTexture && internalformat == GraphicsContext3D::DEPTH_STENCIL |
| - && type == GraphicsContext3D::UNSIGNED_INT_24_8)) { |
| + if (!(context()->m_webglDepthTexture && internalformat == GL_DEPTH_STENCIL_OES |
| + && type == GL_UNSIGNED_INT_24_8_OES)) { |
| *reason = "the attached texture is not a DEPTH_STENCIL texture"; |
| return false; |
| } |
| } |
| - } else if (attachment == GraphicsContext3D::COLOR_ATTACHMENT0 |
| - || (context()->m_webglDrawBuffers && attachment > GraphicsContext3D::COLOR_ATTACHMENT0 |
| - && attachment < static_cast<GC3Denum>(GraphicsContext3D::COLOR_ATTACHMENT0 + context()->maxColorAttachments()))) { |
| + } else if (attachment == GL_COLOR_ATTACHMENT0 |
| + || (context()->m_webglDrawBuffers && attachment > GL_COLOR_ATTACHMENT0 |
| + && attachment < static_cast<GC3Denum>(GL_COLOR_ATTACHMENT0 + context()->maxColorAttachments()))) { |
| if (object->isRenderbuffer()) { |
| if (!isColorRenderable(internalformat)) { |
| *reason = "the internalformat of the attached renderbuffer is not color-renderable"; |
| @@ -394,7 +396,7 @@ bool WebGLFramebuffer::isAttachmentComplete(WebGLAttachment* attachedObject, GC3 |
| } |
| } else if (object->isTexture()) { |
| GC3Denum type = attachedObject->type(); |
| - if (internalformat != GraphicsContext3D::RGBA && internalformat != GraphicsContext3D::RGB) { |
| + if (internalformat != GL_RGBA && internalformat != GL_RGB) { |
| *reason = "the internalformat of the attached texture is not color-renderable"; |
| return false; |
| } |
| @@ -402,12 +404,12 @@ bool WebGLFramebuffer::isAttachmentComplete(WebGLAttachment* attachedObject, GC3 |
| // WebGL yet. It would be better to depend on the underlying GL drivers to check on rendering to floating point textures |
| // and add the check back to WebGL when above two extensions are implemented. |
| // Assume UNSIGNED_BYTE is renderable here without the need to explicitly check if GL_OES_rgb8_rgba8 extension is supported. |
| - if (type != GraphicsContext3D::UNSIGNED_BYTE |
| - && type != GraphicsContext3D::UNSIGNED_SHORT_5_6_5 |
| - && type != GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4 |
| - && type != GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1 |
| - && !(type == GraphicsContext3D::FLOAT && context()->m_oesTextureFloat) |
| - && !(type == GraphicsContext3D::HALF_FLOAT_OES && context()->m_oesTextureHalfFloat)) { |
| + if (type != GL_UNSIGNED_BYTE |
| + && type != GL_UNSIGNED_SHORT_5_6_5 |
| + && type != GL_UNSIGNED_SHORT_4_4_4_4 |
| + && type != GL_UNSIGNED_SHORT_5_5_5_1 |
| + && !(type == GL_FLOAT && context()->m_oesTextureFloat) |
| + && !(type == GL_HALF_FLOAT_OES && context()->m_oesTextureHalfFloat)) { |
| *reason = "unsupported type: The attached texture is not supported to be rendered to"; |
| return false; |
| } |
| @@ -442,15 +444,15 @@ void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(GC3Denum attachment) |
| m_attachments.remove(attachment); |
| drawBuffersIfNecessary(false); |
| switch (attachment) { |
| - case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: |
| - attach(GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::DEPTH_ATTACHMENT); |
| - attach(GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::STENCIL_ATTACHMENT); |
| + case GC3D_DEPTH_STENCIL_ATTACHMENT: |
| + attach(GL_DEPTH_ATTACHMENT, GL_DEPTH_ATTACHMENT); |
| + attach(GL_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT); |
| break; |
| - case GraphicsContext3D::DEPTH_ATTACHMENT: |
| - attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT, GraphicsContext3D::DEPTH_ATTACHMENT); |
| + case GL_DEPTH_ATTACHMENT: |
| + attach(GC3D_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT); |
| break; |
| - case GraphicsContext3D::STENCIL_ATTACHMENT: |
| - attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT, GraphicsContext3D::STENCIL_ATTACHMENT); |
| + case GL_STENCIL_ATTACHMENT: |
| + attach(GC3D_DEPTH_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT); |
| break; |
| } |
| } |
| @@ -484,7 +486,7 @@ GC3Dsizei WebGLFramebuffer::colorBufferWidth() const |
| { |
| if (!object()) |
| return 0; |
| - WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHMENT0); |
| + WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); |
| if (!attachment) |
| return 0; |
| @@ -495,7 +497,7 @@ GC3Dsizei WebGLFramebuffer::colorBufferHeight() const |
| { |
| if (!object()) |
| return 0; |
| - WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHMENT0); |
| + WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); |
| if (!attachment) |
| return 0; |
| @@ -506,7 +508,7 @@ GC3Denum WebGLFramebuffer::colorBufferFormat() const |
| { |
| if (!object()) |
| return 0; |
| - WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHMENT0); |
| + WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); |
| if (!attachment) |
| return 0; |
| return attachment->format(); |
| @@ -522,23 +524,23 @@ GC3Denum WebGLFramebuffer::checkStatus(const char** reason) const |
| for (AttachmentMap::const_iterator it = m_attachments.begin(); it != m_attachments.end(); ++it) { |
| WebGLAttachment* attachment = it->value.get(); |
| if (!isAttachmentComplete(attachment, it->key, reason)) |
| - return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| + return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| if (!attachment->valid()) { |
| *reason = "attachment is not valid"; |
| - return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED; |
| + return GL_FRAMEBUFFER_UNSUPPORTED; |
| } |
| if (!attachment->format()) { |
| *reason = "attachment is an unsupported format"; |
| - return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| + return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| } |
| switch (it->key) { |
| - case GraphicsContext3D::DEPTH_ATTACHMENT: |
| + case GL_DEPTH_ATTACHMENT: |
| haveDepth = true; |
| break; |
| - case GraphicsContext3D::STENCIL_ATTACHMENT: |
| + case GL_STENCIL_ATTACHMENT: |
| haveStencil = true; |
| break; |
| - case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: |
| + case GC3D_DEPTH_STENCIL_ATTACHMENT: |
| haveDepthStencil = true; |
| break; |
| } |
| @@ -548,39 +550,39 @@ GC3Denum WebGLFramebuffer::checkStatus(const char** reason) const |
| } else { |
| if (width != attachment->width() || height != attachment->height()) { |
| *reason = "attachments do not have the same dimensions"; |
| - return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_DIMENSIONS; |
| + return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; |
| } |
| } |
| ++count; |
| } |
| if (!count) { |
| *reason = "no attachments"; |
| - return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; |
| + return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; |
| } |
| if (!width || !height) { |
| *reason = "framebuffer has a 0 dimension"; |
| - return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| + return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| } |
| // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. |
| if ((haveDepthStencil && (haveDepth || haveStencil)) || (haveDepth && haveStencil)) { |
| *reason = "conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments"; |
| - return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED; |
| + return GL_FRAMEBUFFER_UNSUPPORTED; |
| } |
| - return GraphicsContext3D::FRAMEBUFFER_COMPLETE; |
| + return GL_FRAMEBUFFER_COMPLETE; |
| } |
| bool WebGLFramebuffer::onAccess(GraphicsContext3D* context3d, const char** reason) |
| { |
| - if (checkStatus(reason) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) |
| + if (checkStatus(reason) != GL_FRAMEBUFFER_COMPLETE) |
| return false; |
| return true; |
| } |
| bool WebGLFramebuffer::hasStencilBuffer() const |
| { |
| - WebGLAttachment* attachment = getAttachment(GraphicsContext3D::STENCIL_ATTACHMENT); |
| + WebGLAttachment* attachment = getAttachment(GL_STENCIL_ATTACHMENT); |
| if (!attachment) |
| - attachment = getAttachment(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT); |
| + attachment = getAttachment(GC3D_DEPTH_STENCIL_ATTACHMENT); |
| return attachment && attachment->valid(); |
| } |
| @@ -602,7 +604,7 @@ void WebGLFramebuffer::drawBuffers(const Vector<GC3Denum>& bufs) |
| m_drawBuffers = bufs; |
| m_filteredDrawBuffers.resize(m_drawBuffers.size()); |
| for (size_t i = 0; i < m_filteredDrawBuffers.size(); ++i) |
| - m_filteredDrawBuffers[i] = GraphicsContext3D::NONE; |
| + m_filteredDrawBuffers[i] = GL_NONE; |
| drawBuffersIfNecessary(true); |
| } |
| @@ -613,14 +615,14 @@ void WebGLFramebuffer::drawBuffersIfNecessary(bool force) |
| bool reset = force; |
| // This filtering works around graphics driver bugs on Mac OS X. |
| for (size_t i = 0; i < m_drawBuffers.size(); ++i) { |
| - if (m_drawBuffers[i] != GraphicsContext3D::NONE && getAttachment(m_drawBuffers[i])) { |
| + if (m_drawBuffers[i] != GL_NONE && getAttachment(m_drawBuffers[i])) { |
| if (m_filteredDrawBuffers[i] != m_drawBuffers[i]) { |
| m_filteredDrawBuffers[i] = m_drawBuffers[i]; |
| reset = true; |
| } |
| } else { |
| - if (m_filteredDrawBuffers[i] != GraphicsContext3D::NONE) { |
| - m_filteredDrawBuffers[i] = GraphicsContext3D::NONE; |
| + if (m_filteredDrawBuffers[i] != GL_NONE) { |
| + m_filteredDrawBuffers[i] = GL_NONE; |
| reset = true; |
| } |
| } |
| @@ -638,8 +640,8 @@ GC3Denum WebGLFramebuffer::getDrawBuffer(GC3Denum drawBuffer) |
| if (index < static_cast<int>(m_drawBuffers.size())) |
| return m_drawBuffers[index]; |
| if (drawBuffer == Extensions3D::DRAW_BUFFER0_EXT) |
| - return GraphicsContext3D::COLOR_ATTACHMENT0; |
| - return GraphicsContext3D::NONE; |
| + return GL_COLOR_ATTACHMENT0; |
| + return GL_NONE; |
| } |
| } |