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