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 69707fb246fe37280a178e29f955d4af52f87d7a..511558d5efb966470659243a77d6eb46fb74e48d 100644 |
| --- a/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| +++ b/Source/core/html/canvas/WebGL2RenderingContextBase.cpp |
| @@ -1461,6 +1461,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) { |
|
Ken Russell (switch to Gerrit)
2015/04/28 05:43:23
Please make sure that this code eventually uses th
yunchao
2015/04/29 11:13:11
Done.
|
| + 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()); |
|
Ken Russell (switch to Gerrit)
2015/04/28 05:43:23
target can be either GL_READ_FRAMEBUFFER or GL_DRA
yunchao
2015/04/29 11:13:11
Done.
|
| + |
| + 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); |
|
Ken Russell (switch to Gerrit)
2015/04/28 05:43:23
This will return an incorrect answer if the Drawin
yunchao
2015/04/29 11:13:11
Agreed. The latest patch set has updated bindFrame
|
| + 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) |
| { |
| visitor->trace(m_readFramebufferBinding); |