Chromium Code Reviews| Index: Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| diff --git a/Source/core/html/canvas/WebGL2RenderingContextBase.cpp b/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| index b6f57f87ac8c23137bcad0062f63a038e1dc62b6..aed4b39e18a30e39eb926dad19470ad1b0e27b37 100644 |
| --- a/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| +++ b/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| @@ -1196,6 +1196,105 @@ bool WebGL2RenderingContextBase::validateAndUpdateBufferBindTarget(const char* f |
| return true; |
| } |
| +bool WebGL2RenderingContextBase::validateGetFramebufferAttachmentParameterFunc(const char* functionName, GLenum target, GLenum attachment) |
| +{ |
| + if (target != GL_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER) { |
| + synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
| + return false; |
| + } |
| + ASSERT(!m_framebufferBinding && !drawingBuffer()); |
|
Zhenyao Mo
2015/03/09 18:39:19
OK, let me explain again. I understand your inten
yunchao
2015/03/10 15:34:54
Yeah. I got it. Thank you, @zmo.
|
| + if (!m_framebufferBinding) { |
| + // for the default framebuffer |
| + switch (attachment) { |
| + case GL_BACK: |
| + case GL_DEPTH: |
| + case GL_STENCIL: |
| + break; |
| + default: |
| + synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid attachment"); |
|
Zhenyao Mo
2015/03/09 18:39:19
Although the man page of this function says INVALI
yunchao
2015/03/10 15:34:53
Done.
|
| + return false; |
| + } |
| + } else { |
| + // for the FBO |
| + switch (attachment) { |
| + case GL_COLOR_ATTACHMENT0: |
| + case GL_DEPTH_ATTACHMENT: |
| + case GL_STENCIL_ATTACHMENT: |
| + break; |
| + case GL_DEPTH_STENCIL_ATTACHMENT: |
| + if (m_framebufferBinding->getAttachmentObject(GL_DEPTH_STENCIL_ATTACHMENT) || (m_framebufferBinding->getAttachmentObject(GL_DEPTH_ATTACHMENT) == m_framebufferBinding->getAttachmentObject(GL_STENCIL_ATTACHMENT))) |
| + break; |
| + default: |
| + if (attachment > GL_COLOR_ATTACHMENT0 |
| + && attachment < static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + maxColorAttachments())) |
| + break; |
| + synthesizeGLError(GL_INVALID_OPERATION, functionName, "invalid attachment"); |
|
Zhenyao Mo
2015/03/09 18:39:19
Same here, maybe INVALID_ENUM.
yunchao
2015/03/10 15:34:53
Done.
|
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +ScriptValue WebGL2RenderingContextBase::getFramebufferAttachmentParameter(ScriptState* scriptState, GLenum target, GLenum attachment, GLenum pname) |
| +{ |
| + if (isContextLost() || !validateGetFramebufferAttachmentParameterFunc("getFramebufferAttachmentParameter", target, attachment)) |
| + return ScriptValue::createNull(scriptState); |
| + |
| + ASSERT(m_framebufferBinding && !m_framebufferBinding->object()); |
| + |
| + WebGLSharedObject* attachmentObject = m_framebufferBinding ? m_framebufferBinding->getAttachmentObject(attachment) : 0; |
| + if (m_framebufferBinding && !attachmentObject) { |
| + if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) |
| + return WebGLAny(scriptState, GL_NONE); |
| + if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) |
| + return WebGLAny(scriptState, 0); |
| + synthesizeGLError(GL_INVALID_OPERATION, "getFramebufferAttachmentParameter", "invalid parameter name"); |
| + return ScriptValue::createNull(scriptState); |
| + } |
| + |
| + switch (pname) { |
| + case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: |
| + if (!attachmentObject) |
|
Zhenyao Mo
2015/03/09 18:39:19
nit: add ASSERT(!m_framebufferBinding) here to mak
yunchao
2015/03/10 15:34:54
Done.
|
| + return WebGLAny(scriptState, GL_FRAMEBUFFER_DEFAULT); |
| + if (attachmentObject->isTexture()) |
| + return WebGLAny(scriptState, GL_TEXTURE); |
| + if (attachmentObject->isRenderbuffer()) |
| + return WebGLAny(scriptState, GL_RENDERBUFFER); |
|
Zhenyao Mo
2015/03/09 18:39:19
nit: ASSERT(attachmentObject->isTexture() || attac
yunchao
2015/03/10 15:34:54
Done.
|
| + break; |
| + case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: |
| + if (!attachmentObject) |
| + break; |
| + return WebGLAny(scriptState, PassRefPtrWillBeRawPtr<WebGLObject>(attachmentObject)); |
| + case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: |
| + case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: |
| + if (!attachmentObject || !attachmentObject->isTexture()) |
| + break; |
| + case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: |
| + { |
| + GLint value = 0; |
| + webContext()->getFramebufferAttachmentParameteriv(target, attachment, pname, &value); |
| + return WebGLAny(scriptState, value); |
| + } |
| + case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: |
| + case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: |
| + { |
| + GLint value = 0; |
| + webContext()->getFramebufferAttachmentParameteriv(target, attachment, pname, &value); |
| + return WebGLAny(scriptState, static_cast<unsigned>(value)); |
| + } |
| + default: |
| + break; |
| + } |
| + synthesizeGLError(GL_INVALID_ENUM, "getFramebufferAttachmentParameter", "invalid parameter name"); |
| + return ScriptValue::createNull(scriptState); |
| +} |
| + |
| DEFINE_TRACE(WebGL2RenderingContextBase) |
| { |
| WebGLRenderingContextBase::trace(visitor); |