[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