[Mesa-dev] [PATCH 09/21] mesa: add validate_stencil_buffer() helper
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Jun 1 13:48:29 UTC 2017
Yeah, will fix locally, thanks!
On 06/01/2017 03:47 PM, Gustaw Smolarczyk wrote:
> This time, send it to the list too.
> Gustaw
>
>
> 1 cze 2017 15:45 "Gustaw Smolarczyk" <wielkiegie at gmail.com
> <mailto:wielkiegie at gmail.com>> napisał(a):
>
> 1 cze 2017 15:07 "Samuel Pitoiset" <samuel.pitoiset at gmail.com
> <mailto:samuel.pitoiset at gmail.com>> napisał(a):
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com
> <mailto:samuel.pitoiset at 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
>
>
> Shouldn't it return a bool so that the caller will know whether the
> validation passed or not?
>
> +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);
>
>
> We should return here in case the validation failed.
>
> Regards,
> Gustaw
>
>
More information about the mesa-dev
mailing list