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" <wielkie...@gmail.com <mailto:wielkie...@gmail.com>> napisał(a):

    1 cze 2017 15:07 "Samuel Pitoiset" <samuel.pitoi...@gmail.com
    <mailto:samuel.pitoi...@gmail.com>> napisał(a):

        Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com
        <mailto: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


    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


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to