main/fboject: return if it is color_attachment on get_attachment

Some callers would need that info to know if they should raise
INVALID_ENUM or INVALID_OPERATION. An alternative would be the caller
to check if the attachment is a GL_COLOR_ATTACHMENTm, but that seems
redundant as get_attachment is already doing that.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Alejandro Piñeiro 2017-01-12 16:03:00 -02:00
parent 963311b71f
commit c6eb3aeba5
1 changed files with 19 additions and 11 deletions

View File

@ -222,15 +222,21 @@ get_framebuffer_target(struct gl_context *ctx, GLenum target)
* default / window-system FB object.
* If \p attachment is GL_DEPTH_STENCIL_ATTACHMENT, return a pointer to
* the depth buffer attachment point.
* Returns if the attachment is a GL_COLOR_ATTACHMENTm_EXT on
* is_color_attachment, because several callers would return different errors
* if they don't find the attachment.
*/
static struct gl_renderbuffer_attachment *
get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
GLenum attachment)
GLenum attachment, bool *is_color_attachment)
{
GLuint i;
assert(_mesa_is_user_fbo(fb));
if (is_color_attachment)
*is_color_attachment = false;
switch (attachment) {
case GL_COLOR_ATTACHMENT0_EXT:
case GL_COLOR_ATTACHMENT1_EXT:
@ -248,6 +254,8 @@ get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
case GL_COLOR_ATTACHMENT13_EXT:
case GL_COLOR_ATTACHMENT14_EXT:
case GL_COLOR_ATTACHMENT15_EXT:
if (is_color_attachment)
*is_color_attachment = true;
/* Only OpenGL ES 1.x forbids color attachments other than
* GL_COLOR_ATTACHMENT0. For all other APIs the limit set by the
* hardware is used.
@ -543,13 +551,13 @@ _mesa_FramebufferRenderbuffer_sw(struct gl_context *ctx,
mtx_lock(&fb->Mutex);
att = get_attachment(ctx, fb, attachment);
att = get_attachment(ctx, fb, attachment, NULL);
assert(att);
if (rb) {
set_renderbuffer_attachment(ctx, att, rb);
if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
/* do stencil attachment here (depth already done above) */
att = get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT);
att = get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT, NULL);
assert(att);
set_renderbuffer_attachment(ctx, att, rb);
}
@ -559,7 +567,7 @@ _mesa_FramebufferRenderbuffer_sw(struct gl_context *ctx,
remove_attachment(ctx, att);
if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
/* detach stencil (depth was detached above) */
att = get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT);
att = get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT, NULL);
assert(att);
remove_attachment(ctx, att);
}
@ -1219,7 +1227,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
for (j = 0; j < ctx->Const.MaxDrawBuffers; j++) {
if (fb->ColorDrawBuffer[j] != GL_NONE) {
const struct gl_renderbuffer_attachment *att
= get_attachment(ctx, fb, fb->ColorDrawBuffer[j]);
= get_attachment(ctx, fb, fb->ColorDrawBuffer[j], NULL);
assert(att);
if (att->Type == GL_NONE) {
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT;
@ -1232,7 +1240,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
/* Check that the ReadBuffer is present */
if (fb->ColorReadBuffer != GL_NONE) {
const struct gl_renderbuffer_attachment *att
= get_attachment(ctx, fb, fb->ColorReadBuffer);
= get_attachment(ctx, fb, fb->ColorReadBuffer, NULL);
assert(att);
if (att->Type == GL_NONE) {
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT;
@ -3151,7 +3159,7 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
}
/* Not a hash lookup, so we can afford to get the attachment here. */
att = get_attachment(ctx, fb, attachment);
att = get_attachment(ctx, fb, attachment, NULL);
if (att == NULL) {
_mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid attachment %s)", caller,
_mesa_enum_to_string(attachment));
@ -3495,7 +3503,7 @@ framebuffer_renderbuffer(struct gl_context *ctx,
return;
}
att = get_attachment(ctx, fb, attachment);
att = get_attachment(ctx, fb, attachment, NULL);
if (att == NULL) {
_mesa_error(ctx, GL_INVALID_ENUM,
"%s(invalid attachment %s)", func,
@ -3668,7 +3676,7 @@ _mesa_get_framebuffer_attachment_parameter(struct gl_context *ctx,
}
else {
/* user-created framebuffer FBO */
att = get_attachment(ctx, buffer, attachment);
att = get_attachment(ctx, buffer, attachment, NULL);
}
if (att == NULL) {
@ -3692,8 +3700,8 @@ _mesa_get_framebuffer_attachment_parameter(struct gl_context *ctx,
return;
}
/* the depth and stencil attachments must point to the same buffer */
depthAtt = get_attachment(ctx, buffer, GL_DEPTH_ATTACHMENT);
stencilAtt = get_attachment(ctx, buffer, GL_STENCIL_ATTACHMENT);
depthAtt = get_attachment(ctx, buffer, GL_DEPTH_ATTACHMENT, NULL);
stencilAtt = get_attachment(ctx, buffer, GL_STENCIL_ATTACHMENT, NULL);
if (depthAtt->Renderbuffer != stencilAtt->Renderbuffer) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"%s(DEPTH/STENCIL attachments differ)", caller);