Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/mesa/main/blit.c | 111 +++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 53 deletions(-)
diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c index 2c0300eab3..207ce7d501 100644 --- a/src/mesa/main/blit.c +++ b/src/mesa/main/blit.c @@ -178,6 +178,62 @@ is_valid_blit_filter(const struct gl_context *ctx, GLenum filter) static void +validate_stencil_buffer(struct gl_context *ctx, struct gl_framebuffer *readFb, + struct gl_framebuffer *drawFb, GLbitfield *mask, + bool no_error, const char *func) +{ + struct gl_renderbuffer *readRb = + readFb->Attachment[BUFFER_STENCIL].Renderbuffer; + struct gl_renderbuffer *drawRb = + drawFb->Attachment[BUFFER_STENCIL].Renderbuffer; + + /* From the EXT_framebuffer_object spec: + * + * "If a buffer is specified in <mask> and does not exist in both + * the read and draw framebuffers, the corresponding bit is silently + * ignored." + */ + if (readRb == NULL || drawRb == NULL) { + *mask &= ~GL_STENCIL_BUFFER_BIT; + } else if (!no_error) { + int read_z_bits, draw_z_bits; + + if (_mesa_is_gles3(ctx) && (drawRb == readRb)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(source and destination stencil buffer cannot be the " + "same)", func); + return; + } + + if (_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) != + _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) { + /* There is no need to check the stencil datatype here, because + * there is only one: GL_UNSIGNED_INT. + */ + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(stencil attachment format mismatch)", func); + return; + } + + read_z_bits = _mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS); + draw_z_bits = _mesa_get_format_bits(drawRb->Format, GL_DEPTH_BITS); + + /* If both buffers also have depth data, the depth formats must match + * as well. If one doesn't have depth, it's not blitted, so we should + * ignore the depth format check. + */ + if (read_z_bits > 0 && draw_z_bits > 0 && + (read_z_bits != draw_z_bits || + _mesa_get_format_datatype(readRb->Format) != + _mesa_get_format_datatype(drawRb->Format))) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(stencil attachment depth format mismatch)", func); + return; + } + } +} + +static void blit_framebuffer(struct gl_context *ctx, struct gl_framebuffer *readFb, struct gl_framebuffer *drawFb, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, @@ -317,59 +373,8 @@ blit_framebuffer(struct gl_context *ctx, } } - if (mask & GL_STENCIL_BUFFER_BIT) { - struct gl_renderbuffer *readRb = - readFb->Attachment[BUFFER_STENCIL].Renderbuffer; - struct gl_renderbuffer *drawRb = - drawFb->Attachment[BUFFER_STENCIL].Renderbuffer; - - /* From the EXT_framebuffer_object spec: - * - * "If a buffer is specified in <mask> and does not exist in both - * the read and draw framebuffers, the corresponding bit is silently - * ignored." - */ - if ((readRb == NULL) || (drawRb == NULL)) { - mask &= ~GL_STENCIL_BUFFER_BIT; - } - else { - int read_z_bits, draw_z_bits; - - if (_mesa_is_gles3(ctx) && (drawRb == readRb)) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "%s(source and destination stencil " - "buffer cannot be the same)", func); - return; - } - - if (_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) != - _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) { - /* There is no need to check the stencil datatype here, because - * there is only one: GL_UNSIGNED_INT. - */ - _mesa_error(ctx, GL_INVALID_OPERATION, - "%s(stencil attachment format mismatch)", func); - return; - } - - read_z_bits = _mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS); - draw_z_bits = _mesa_get_format_bits(drawRb->Format, GL_DEPTH_BITS); - - /* If both buffers also have depth data, the depth formats must match - * as well. If one doesn't have depth, it's not blitted, so we should - * ignore the depth format check. - */ - if (read_z_bits > 0 && draw_z_bits > 0 && - (read_z_bits != draw_z_bits || - _mesa_get_format_datatype(readRb->Format) != - _mesa_get_format_datatype(drawRb->Format))) { - - _mesa_error(ctx, GL_INVALID_OPERATION, - "%s(stencil attachment depth format mismatch)", func); - return; - } - } - } + if (mask & GL_STENCIL_BUFFER_BIT) + validate_stencil_buffer(ctx, readFb, drawFb, &mask, false, func); if (mask & GL_DEPTH_BUFFER_BIT) { struct gl_renderbuffer *readRb = -- 2.13.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev