[Mesa-dev] [PATCH 09/21] mesa: add validate_stencil_buffer() helper

Gustaw Smolarczyk wielkiegie at gmail.com
Thu Jun 1 13:47:53 UTC 2017


This time, send it to the list too.
Gustaw


1 cze 2017 15:45 "Gustaw Smolarczyk" <wielkiegie at gmail.com> napisał(a):

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

Signed-off-by: Samuel Pitoiset <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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170601/18d2802c/attachment-0001.html>


More information about the mesa-dev mailing list