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..d0016201bed113f0323213d188372c8c0528d373 100644 |
| --- a/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| +++ b/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| @@ -1196,6 +1196,108 @@ 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()); |
| + if (!m_framebufferBinding) { |
| + // for the default framebuffer |
| + switch (attachment) { |
| + case GL_BACK: |
| + case GL_DEPTH: |
| + case GL_STENCIL: |
| + break; |
| + default: |
| + synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid attachment"); |
| + 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_ENUM, functionName, "invalid attachment"); |
| + 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()); |
|
Zhenyao Mo
2015/03/10 17:03:12
Now this ASSERTION is wrong. I think you can just
Zhenyao Mo
2015/03/10 17:05:58
Never mind. It is correct.
|
| + |
| + 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) { |
| + ASSERT(!m_framebufferBinding); |
| + return WebGLAny(scriptState, GL_FRAMEBUFFER_DEFAULT); |
| + } |
| + ASSERT(attachmentObject->isTexture() || attachmentObject->isRenderbuffer()); |
| + if (attachmentObject->isTexture()) |
| + return WebGLAny(scriptState, GL_TEXTURE); |
| + if (attachmentObject->isRenderbuffer()) |
| + return WebGLAny(scriptState, GL_RENDERBUFFER); |
| + 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); |