Commit 646559fe by Geoff Lang Committed by Geoff Lang

Add support for the remaining ES3 framebuffer attachment parameter queries.

TRAC #23474 Author: Geoff Lang Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods
parent 0a804796
...@@ -269,6 +269,11 @@ Renderbuffer *Framebuffer::getStencilbuffer() const ...@@ -269,6 +269,11 @@ Renderbuffer *Framebuffer::getStencilbuffer() const
return mStencilbuffer.get(); return mStencilbuffer.get();
} }
Renderbuffer *Framebuffer::getDepthStencilBuffer() const
{
return (mDepthbuffer.id() == mStencilbuffer.id()) ? mDepthbuffer.get() : NULL;
}
Renderbuffer *Framebuffer::getDepthOrStencilbuffer() const Renderbuffer *Framebuffer::getDepthOrStencilbuffer() const
{ {
Renderbuffer *depthstencilbuffer = mDepthbuffer.get(); Renderbuffer *depthstencilbuffer = mDepthbuffer.get();
......
...@@ -49,6 +49,7 @@ class Framebuffer ...@@ -49,6 +49,7 @@ class Framebuffer
Renderbuffer *getColorbuffer(unsigned int colorAttachment) const; Renderbuffer *getColorbuffer(unsigned int colorAttachment) const;
Renderbuffer *getDepthbuffer() const; Renderbuffer *getDepthbuffer() const;
Renderbuffer *getStencilbuffer() const; Renderbuffer *getStencilbuffer() const;
Renderbuffer *getDepthStencilBuffer() const;
Renderbuffer *getDepthOrStencilbuffer() const; Renderbuffer *getDepthOrStencilbuffer() const;
Renderbuffer *getReadColorbuffer() const; Renderbuffer *getReadColorbuffer() const;
GLenum getReadColorbufferType() const; GLenum getReadColorbufferType() const;
......
...@@ -2861,85 +2861,159 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac ...@@ -2861,85 +2861,159 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
if (context) if (context)
{ {
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) META_ASSERT(GL_DRAW_FRAMEBUFFER_ANGLE == GL_DRAW_FRAMEBUFFER && GL_READ_FRAMEBUFFER_ANGLE == GL_READ_FRAMEBUFFER);
if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
gl::Framebuffer *framebuffer = NULL; switch (pname)
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{ {
if(context->getReadFramebufferHandle() == 0) case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
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:
case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
if (context->getClientVersion() >= 3)
{ {
return gl::error(GL_INVALID_OPERATION); break;
} }
default:
framebuffer = context->getReadFramebuffer(); return gl::error(GL_INVALID_ENUM);
} }
else
// Determine if the attachment is a valid enum
switch (attachment)
{ {
if (context->getDrawFramebufferHandle() == 0) case GL_BACK:
case GL_FRONT:
case GL_STENCIL:
case GL_DEPTH_STENCIL_ATTACHMENT:
if (context->getClientVersion() < 3)
{ {
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_ENUM);
} }
break;
framebuffer = context->getDrawFramebuffer(); case GL_DEPTH_ATTACHMENT:
case GL_STENCIL_ATTACHMENT:
break;
default:
if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
(attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
{
return gl::error(GL_INVALID_ENUM);
}
break;
} }
GLuint framebufferHandle = (target == GL_READ_FRAMEBUFFER) ? context->getReadFramebufferHandle()
: context->getDrawFramebufferHandle();
gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
GLenum attachmentType; GLenum attachmentType;
GLuint attachmentHandle; GLuint attachmentHandle;
GLuint attachmentLevel; GLuint attachmentLevel;
GLuint attachmentLayer; GLuint attachmentLayer;
gl::Renderbuffer *renderbuffer;
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT) if(framebufferHandle == 0)
{ {
const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT); if(context->getClientVersion() < 3)
if (colorAttachment >= context->getMaximumRenderTargets())
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_OPERATION);
} }
attachmentType = framebuffer->getColorbufferType(colorAttachment);
attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
}
else
{
switch (attachment) switch (attachment)
{ {
case GL_DEPTH_ATTACHMENT: case GL_BACK:
attachmentType = framebuffer->getColorbufferType(0);
attachmentHandle = framebuffer->getColorbufferHandle(0);
attachmentLevel = framebuffer->getColorbufferMipLevel(0);
attachmentLayer = framebuffer->getColorbufferLayer(0);
renderbuffer = framebuffer->getColorbuffer(0);
break;
case GL_DEPTH:
attachmentType = framebuffer->getDepthbufferType(); attachmentType = framebuffer->getDepthbufferType();
attachmentHandle = framebuffer->getDepthbufferHandle(); attachmentHandle = framebuffer->getDepthbufferHandle();
attachmentLevel = framebuffer->getDepthbufferMipLevel(); attachmentLevel = framebuffer->getDepthbufferMipLevel();
attachmentLayer = framebuffer->getDepthbufferLayer(); attachmentLayer = framebuffer->getDepthbufferLayer();
renderbuffer = framebuffer->getDepthbuffer();
break; break;
case GL_STENCIL_ATTACHMENT: case GL_STENCIL:
attachmentType = framebuffer->getStencilbufferType(); attachmentType = framebuffer->getStencilbufferType();
attachmentHandle = framebuffer->getStencilbufferHandle(); attachmentHandle = framebuffer->getStencilbufferHandle();
attachmentLevel = framebuffer->getStencilbufferMipLevel(); attachmentLevel = framebuffer->getStencilbufferMipLevel();
attachmentLayer = framebuffer->getStencilbufferLayer(); attachmentLayer = framebuffer->getStencilbufferLayer();
renderbuffer = framebuffer->getStencilbuffer();
break; break;
case GL_DEPTH_STENCIL_ATTACHMENT: default:
if (context->getClientVersion() < 3) return gl::error(GL_INVALID_OPERATION);
{ }
return gl::error(GL_INVALID_ENUM); }
} else
if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle()) {
if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
attachmentType = framebuffer->getColorbufferType(colorAttachment);
attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
renderbuffer = framebuffer->getColorbuffer(colorAttachment);
}
else
{
switch (attachment)
{ {
case GL_DEPTH_ATTACHMENT:
attachmentType = framebuffer->getDepthbufferType();
attachmentHandle = framebuffer->getDepthbufferHandle();
attachmentLevel = framebuffer->getDepthbufferMipLevel();
attachmentLayer = framebuffer->getDepthbufferLayer();
renderbuffer = framebuffer->getDepthbuffer();
break;
case GL_STENCIL_ATTACHMENT:
attachmentType = framebuffer->getStencilbufferType();
attachmentHandle = framebuffer->getStencilbufferHandle();
attachmentLevel = framebuffer->getStencilbufferMipLevel();
attachmentLayer = framebuffer->getStencilbufferLayer();
renderbuffer = framebuffer->getStencilbuffer();
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
{
return gl::error(GL_INVALID_OPERATION);
}
attachmentType = framebuffer->getDepthStencilbufferType();
attachmentHandle = framebuffer->getDepthStencilbufferHandle();
attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
attachmentLayer = framebuffer->getDepthStencilbufferLayer();
renderbuffer = framebuffer->getDepthStencilBuffer();
break;
default:
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
attachmentType = framebuffer->getDepthStencilbufferType();
attachmentHandle = framebuffer->getDepthStencilbufferHandle();
attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
attachmentLayer = framebuffer->getDepthStencilbufferLayer();
default: return gl::error(GL_INVALID_ENUM);
} }
} }
GLenum attachmentObjectType; // Type category GLenum attachmentObjectType; // Type category
if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER) if (framebufferHandle == 0)
{
attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
}
else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
{ {
attachmentObjectType = attachmentType; attachmentObjectType = attachmentType;
} }
...@@ -2953,64 +3027,124 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac ...@@ -2953,64 +3027,124 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
return; return;
} }
switch (pname) if (attachmentObjectType == GL_NONE)
{ {
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
*params = attachmentObjectType; // is NONE, then querying any other pname will generate INVALID_ENUM.
break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: // ES 3.0.2 spec pg 235 states that if the attachment type is none,
if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE) // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
{ // INVALID_OPERATION for all other pnames
*params = attachmentHandle;
} switch (pname)
else
{
return gl::error(GL_INVALID_ENUM);
}
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
if (attachmentObjectType == GL_TEXTURE)
{
*params = attachmentLevel;
}
else
{
return gl::error(GL_INVALID_ENUM);
}
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
if (attachmentObjectType == GL_TEXTURE)
{ {
if (gl::IsCubemapTextureTarget(attachmentType)) case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
*params = attachmentObjectType;
break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
*params = 0;
break;
default:
if (context->getClientVersion() < 3)
{ {
*params = attachmentType; return gl::error(GL_INVALID_ENUM);
} }
else else
{ {
*params = 0; gl::error(GL_INVALID_OPERATION);
} }
} }
else }
else
{
ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
ASSERT(renderbuffer != NULL);
switch (pname)
{ {
return gl::error(GL_INVALID_ENUM); case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
*params = attachmentObjectType;
break;
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
{
return gl::error(GL_INVALID_ENUM);
}
*params = attachmentHandle;
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
if (attachmentObjectType != GL_TEXTURE)
{
return gl::error(GL_INVALID_ENUM);
}
*params = attachmentLevel;
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
if (attachmentObjectType != GL_TEXTURE)
{
return gl::error(GL_INVALID_ENUM);
}
*params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
break;
case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
*params = renderbuffer->getRedSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
*params = renderbuffer->getGreenSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
*params = renderbuffer->getBlueSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
*params = renderbuffer->getAlphaSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
*params = renderbuffer->getDepthSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
*params = renderbuffer->getStencilSize();
break;
case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
if (attachment == GL_DEPTH_STENCIL)
{
gl::error(GL_INVALID_OPERATION);
}
*params = renderbuffer->getComponentType();
break;
case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
*params = renderbuffer->getColorEncoding();
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
if (attachmentObjectType != GL_TEXTURE)
{
return gl::error(GL_INVALID_ENUM);
}
*params = attachmentLayer;
break;
default:
UNREACHABLE();
break;
} }
break;
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
if (context->getClientVersion() < 3)
{
return gl::error(GL_INVALID_ENUM);
}
if (attachmentObjectType == GL_TEXTURE)
{
*params = attachmentLayer;
}
else
{
return gl::error(GL_INVALID_ENUM);
}
break;
default:
return gl::error(GL_INVALID_ENUM);
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment