[Mesa-dev] [PATCH 16/38] main: Refactor glBlitFramebuffer.
Fredrik Höglund
fredrik at kde.org
Sun Apr 12 08:50:58 PDT 2015
There should be two blank lines between the function defintions,
but with that nitpick fixed:
Reviewed-by: Fredrik Höglund <fredrik at kde.org>
On Wednesday 04 March 2015, Laura Ekstrand wrote:
> ---
> src/mesa/main/blit.c | 119 ++++++++++++++++++++++++++++-----------------------
> src/mesa/main/blit.h | 7 +++
> 2 files changed, 73 insertions(+), 53 deletions(-)
>
> diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c
> index 899dd45..b6d6d75 100644
> --- a/src/mesa/main/blit.c
> +++ b/src/mesa/main/blit.c
> @@ -147,39 +147,24 @@ is_valid_blit_filter(const struct gl_context *ctx, GLenum filter)
> }
>
>
> -/**
> - * Blit rectangular region, optionally from one framebuffer to another.
> - *
> - * Note, if the src buffer is multisampled and the dest is not, this is
> - * when the samples must be resolved to a single color.
> - */
> -void GLAPIENTRY
> -_mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> - GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
> - GLbitfield mask, GLenum filter)
> +void
> +_mesa_blit_framebuffer(struct gl_context *ctx,
> + struct gl_framebuffer *readFb,
> + struct gl_framebuffer *drawFb,
> + GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
> + GLbitfield mask, GLenum filter, const char *func)
> {
> const GLbitfield legalMaskBits = (GL_COLOR_BUFFER_BIT |
> GL_DEPTH_BUFFER_BIT |
> GL_STENCIL_BUFFER_BIT);
> - const struct gl_framebuffer *readFb, *drawFb;
> - GET_CURRENT_CONTEXT(ctx);
>
> FLUSH_VERTICES(ctx, 0);
>
> - if (MESA_VERBOSE & VERBOSE_API)
> - _mesa_debug(ctx,
> - "glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d, 0x%x, %s)\n",
> - srcX0, srcY0, srcX1, srcY1,
> - dstX0, dstY0, dstX1, dstY1,
> - mask, _mesa_lookup_enum_by_nr(filter));
> -
> if (ctx->NewState) {
> _mesa_update_state(ctx);
> }
>
> - readFb = ctx->ReadBuffer;
> - drawFb = ctx->DrawBuffer;
> -
> if (!readFb || !drawFb) {
> /* This will normally never happen but someday we may want to
> * support MakeCurrent() with no drawables.
> @@ -191,12 +176,12 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> if (drawFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
> readFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
> _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
> - "glBlitFramebufferEXT(incomplete draw/read buffers)");
> + "%s(incomplete draw/read buffers)", func);
> return;
> }
>
> if (!is_valid_blit_filter(ctx, filter)) {
> - _mesa_error(ctx, GL_INVALID_ENUM, "glBlitFramebufferEXT(%s)",
> + _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid filter %s)", func,
> _mesa_lookup_enum_by_nr(filter));
> return;
> }
> @@ -204,13 +189,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> if ((filter == GL_SCALED_RESOLVE_FASTEST_EXT ||
> filter == GL_SCALED_RESOLVE_NICEST_EXT) &&
> (readFb->Visual.samples == 0 || drawFb->Visual.samples > 0)) {
> - _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebufferEXT(%s)",
> + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(%s: invalid samples)", func,
> _mesa_lookup_enum_by_nr(filter));
> return;
> }
>
> if (mask & ~legalMaskBits) {
> - _mesa_error( ctx, GL_INVALID_VALUE, "glBlitFramebufferEXT(mask)");
> + _mesa_error(ctx, GL_INVALID_VALUE, "%s(invalid mask bits set)", func);
> return;
> }
>
> @@ -218,13 +203,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
> && filter != GL_NEAREST) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(depth/stencil requires GL_NEAREST filter)");
> + "%s(depth/stencil requires GL_NEAREST filter)", func);
> return;
> }
>
> /* get color read/draw renderbuffers */
> if (mask & GL_COLOR_BUFFER_BIT) {
> - const GLuint numColorDrawBuffers = ctx->DrawBuffer->_NumColorDrawBuffers;
> + const GLuint numColorDrawBuffers = drawFb->_NumColorDrawBuffers;
> const struct gl_renderbuffer *colorReadRb = readFb->_ColorReadBuffer;
> const struct gl_renderbuffer *colorDrawRb = NULL;
> GLuint i;
> @@ -240,7 +225,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> }
> else {
> for (i = 0; i < numColorDrawBuffers; i++) {
> - colorDrawRb = ctx->DrawBuffer->_ColorDrawBuffers[i];
> + colorDrawRb = drawFb->_ColorDrawBuffers[i];
> if (!colorDrawRb)
> continue;
>
> @@ -256,15 +241,15 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> */
> if (_mesa_is_gles3(ctx) && (colorDrawRb == colorReadRb)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(source and destination color "
> - "buffer cannot be the same)");
> + "%s(source and destination color "
> + "buffer cannot be the same)", func);
> return;
> }
>
> if (!compatible_color_datatypes(colorReadRb->Format,
> colorDrawRb->Format)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(color buffer datatypes mismatch)");
> + "%s(color buffer datatypes mismatch)", func);
> return;
> }
> /* extra checks for multisample copies... */
> @@ -272,7 +257,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> /* color formats must match */
> if (!compatible_resolve_formats(colorReadRb, colorDrawRb)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(bad src/dst multisample pixel formats)");
> + "%s(bad src/dst multisample pixel formats)", func);
> return;
> }
> }
> @@ -285,7 +270,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> GLenum type = _mesa_get_format_datatype(colorReadRb->Format);
> if (type == GL_INT || type == GL_UNSIGNED_INT) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(integer color type)");
> + "%s(integer color type)", func);
> return;
> }
> }
> @@ -312,8 +297,8 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>
> if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(source and destination stencil "
> - "buffer cannot be the same)");
> + "%s(source and destination stencil "
> + "buffer cannot be the same)", func);
> return;
> }
>
> @@ -323,7 +308,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> * there is only one: GL_UNSIGNED_INT.
> */
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(stencil attachment format mismatch)");
> + "%s(stencil attachment format mismatch)", func);
> return;
> }
>
> @@ -339,8 +324,8 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> _mesa_get_format_datatype(readRb->Format) !=
> _mesa_get_format_datatype(drawRb->Format))) {
>
> - _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebuffer"
> - "(stencil attachment depth format mismatch)");
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "%s(stencil attachment depth format mismatch)", func);
> return;
> }
> }
> @@ -366,8 +351,8 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>
> if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(source and destination depth "
> - "buffer cannot be the same)");
> + "%s(source and destination depth "
> + "buffer cannot be the same)", func);
> return;
> }
>
> @@ -376,7 +361,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> (_mesa_get_format_datatype(readRb->Format) !=
> _mesa_get_format_datatype(drawRb->Format))) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(depth attachment format mismatch)");
> + "%s(depth attachment format mismatch)", func);
> return;
> }
>
> @@ -388,8 +373,8 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> * we should ignore the stencil format check.
> */
> if (read_s_bit > 0 && draw_s_bit > 0 && read_s_bit != draw_s_bit) {
> - _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebuffer"
> - "(depth attachment stencil bits mismatch)");
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "%s(depth attachment stencil bits mismatch)", func);
> return;
> }
> }
> @@ -405,7 +390,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> */
> if (drawFb->Visual.samples > 0) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(destination samples must be 0)");
> + "%s(destination samples must be 0)", func);
> return;
> }
>
> @@ -425,7 +410,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> && (srcX0 != dstX0 || srcY0 != dstY0
> || srcX1 != dstX1 || srcY1 != dstY1)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebuffer(bad src/dst multisample region)");
> + "%s(bad src/dst multisample region)", func);
> return;
> }
> } else {
> @@ -433,7 +418,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> drawFb->Visual.samples > 0 &&
> readFb->Visual.samples != drawFb->Visual.samples) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(mismatched samples)");
> + "%s(mismatched samples)", func);
> return;
> }
>
> @@ -444,7 +429,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> if (abs(srcX1 - srcX0) != abs(dstX1 - dstX0) ||
> abs(srcY1 - srcY0) != abs(dstY1 - dstY0)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glBlitFramebufferEXT(bad src/dst multisample region sizes)");
> + "%s(bad src/dst multisample region sizes)", func);
> return;
> }
> }
> @@ -456,11 +441,12 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> const struct gl_renderbuffer *colorDrawRb = NULL;
> GLuint i = 0;
>
> - printf("glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d,"
> - " 0x%x, 0x%x)\n",
> + printf("%s(%d, %d, %d, %d, %d, %d, %d, %d,"
> + " 0x%x, 0x%x)\n", func,
> srcX0, srcY0, srcX1, srcY1,
> dstX0, dstY0, dstX1, dstY1,
> mask, filter);
> +
> if (colorReadRb) {
> const struct gl_renderbuffer_attachment *att;
>
> @@ -478,8 +464,8 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> printf("\n");
>
> /* Print all active color render buffers */
> - for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> - colorDrawRb = ctx->DrawBuffer->_ColorDrawBuffers[i];
> + for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
> + colorDrawRb = drawFb->_ColorDrawBuffers[i];
> if (!colorDrawRb)
> continue;
>
> @@ -506,8 +492,35 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> }
>
> assert(ctx->Driver.BlitFramebuffer);
> - ctx->Driver.BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> + ctx->Driver.BlitFramebuffer(ctx, readFb, drawFb,
> srcX0, srcY0, srcX1, srcY1,
> dstX0, dstY0, dstX1, dstY1,
> mask, filter);
> }
> +
> +/**
> + * Blit rectangular region, optionally from one framebuffer to another.
> + *
> + * Note, if the src buffer is multisampled and the dest is not, this is
> + * when the samples must be resolved to a single color.
> + */
> +void GLAPIENTRY
> +_mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
> + GLbitfield mask, GLenum filter)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> +
> + if (MESA_VERBOSE & VERBOSE_API)
> + _mesa_debug(ctx,
> + "glBlitFramebuffer(%d, %d, %d, %d, "
> + " %d, %d, %d, %d, 0x%x, %s)\n",
> + srcX0, srcY0, srcX1, srcY1,
> + dstX0, dstY0, dstX1, dstY1,
> + mask, _mesa_lookup_enum_by_nr(filter));
> +
> + _mesa_blit_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> + srcX0, srcY0, srcX1, srcY1,
> + dstX0, dstY0, dstX1, dstY1,
> + mask, filter, "glBlitFramebuffer");
> +}
> diff --git a/src/mesa/main/blit.h b/src/mesa/main/blit.h
> index 01a958a..b854f5f 100644
> --- a/src/mesa/main/blit.h
> +++ b/src/mesa/main/blit.h
> @@ -28,6 +28,13 @@
>
> #include "glheader.h"
>
> +extern void
> +_mesa_blit_framebuffer(struct gl_context *ctx,
> + struct gl_framebuffer *readFb,
> + struct gl_framebuffer *drawFb,
> + GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
> + GLbitfield mask, GLenum filter, const char *func);
>
> extern void GLAPIENTRY
> _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>
More information about the mesa-dev
mailing list