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:
parent
963311b71f
commit
c6eb3aeba5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue