diff options
author | Alejandro Piñeiro <[email protected]> | 2017-01-12 16:09:17 -0200 |
---|---|---|
committer | Alejandro Piñeiro <[email protected]> | 2017-01-13 08:52:14 -0200 |
commit | 84e3e12b2582f4707a837ebb960ea7ce19e1c263 (patch) | |
tree | e9bdce93e591b44ef4c729e759767b9331a25a2e /src/mesa | |
parent | c6eb3aeba530fe82087c1c3c06ded23cb79bc199 (diff) |
main/fbobject: throw invalid operation when get_attachment fails if needed
In most cases, if a call to get_attachment fails is because attachment
is a INVALID_ENUM. But for some specific cases, if COLOR_ATTACHMENTm
(where m >= MAX_COLOR_ATTACHMENTS) is used, it should raise an
INVALID_OPERATION exception instead.
Fixes:
GL45-CTS.direct_state_access.framebuffers_get_attachment_parameter_errors
GL45-CTS.direct_state_access.framebuffers_renderbuffer_attachment_errors
v2: extra new line before quote block. Include "color attachment" on both
new message errors (Nicolai).
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/fbobject.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index ce5eeae048c..044bd635794 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -3495,6 +3495,7 @@ framebuffer_renderbuffer(struct gl_context *ctx, const char *func) { struct gl_renderbuffer_attachment *att; + bool is_color_attachment; if (_mesa_is_winsys_fbo(fb)) { /* Can't attach new renderbuffers to a window system framebuffer */ @@ -3503,11 +3504,29 @@ framebuffer_renderbuffer(struct gl_context *ctx, return; } - att = get_attachment(ctx, fb, attachment, NULL); + att = get_attachment(ctx, fb, attachment, &is_color_attachment); if (att == NULL) { - _mesa_error(ctx, GL_INVALID_ENUM, - "%s(invalid attachment %s)", func, - _mesa_enum_to_string(attachment)); + /* + * From OpenGL 4.5 spec, section 9.2.7 "Attaching Renderbuffer Images to + * a Framebuffer": + * + * "An INVALID_OPERATION error is generated if attachment is COLOR_- + * ATTACHMENTm where m is greater than or equal to the value of + * MAX_COLOR_- ATTACHMENTS ." + * + * If we are at this point, is because the attachment is not valid, so + * if is_color_attachment is true, is because of the previous reason. + */ + if (is_color_attachment) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(invalid color attachment %s)", func, + _mesa_enum_to_string(attachment)); + } else { + _mesa_error(ctx, GL_INVALID_ENUM, + "%s(invalid attachment %s)", func, + _mesa_enum_to_string(attachment)); + } + return; } @@ -3609,6 +3628,7 @@ _mesa_get_framebuffer_attachment_parameter(struct gl_context *ctx, GLint *params, const char *caller) { const struct gl_renderbuffer_attachment *att; + bool is_color_attachment; GLenum err; /* The error code for an attachment type of GL_NONE differs between APIs. @@ -3676,12 +3696,27 @@ _mesa_get_framebuffer_attachment_parameter(struct gl_context *ctx, } else { /* user-created framebuffer FBO */ - att = get_attachment(ctx, buffer, attachment, NULL); + att = get_attachment(ctx, buffer, attachment, &is_color_attachment); } if (att == NULL) { - _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid attachment %s)", caller, - _mesa_enum_to_string(attachment)); + /* + * From OpenGL 4.5 spec, section 9.2.3 "Framebuffer Object Queries": + * + * "An INVALID_OPERATION error is generated if a framebuffer object + * is bound to target and attachment is COLOR_ATTACHMENTm where m is + * greater than or equal to the value of MAX_COLOR_ATTACHMENTS." + * + * If we are at this point, is because the attachment is not valid, so + * if is_color_attachment is true, is because of the previous reason. + */ + if (is_color_attachment) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid color attachment %s)", + caller, _mesa_enum_to_string(attachment)); + } else { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid attachment %s)", caller, + _mesa_enum_to_string(attachment)); + } return; } |