[Mesa-dev] [PATCH 32/38] main: Refactor _mesa_drawbuffers.

Fredrik Höglund fredrik at kde.org
Thu Apr 16 09:52:13 PDT 2015


On Wednesday 04 March 2015, Laura Ekstrand wrote:
> ---
>  src/mesa/drivers/common/meta.c |  3 ++-
>  src/mesa/main/buffers.c        | 25 ++++++++++++-------------
>  src/mesa/main/buffers.h        |  4 +++-
>  src/mesa/main/context.c        |  3 ++-
>  src/mesa/main/framebuffer.c    |  2 +-
>  5 files changed, 20 insertions(+), 17 deletions(-)
> 
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index fdc4cf1..6bd5ab4 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -1210,7 +1210,8 @@ _mesa_meta_end(struct gl_context *ctx)
>        _mesa_BindRenderbuffer(GL_RENDERBUFFER, save->RenderbufferName);
>  
>     if (state & MESA_META_DRAW_BUFFERS) {
> -      _mesa_drawbuffers(ctx, ctx->Const.MaxDrawBuffers, save->ColorDrawBuffers, NULL);
> +      _mesa_drawbuffers(ctx, ctx->DrawBuffer, ctx->Const.MaxDrawBuffers,
> +                        save->ColorDrawBuffers, NULL);
>     }
>  
>     ctx->Meta->SaveStackDepth--;
> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
> index 37a9790..4fdd97e 100644
> --- a/src/mesa/main/buffers.c
> +++ b/src/mesa/main/buffers.c
> @@ -277,7 +277,7 @@ _mesa_DrawBuffer(GLenum buffer)
>     }
>  
>     /* if we get here, there's no error so set new state */
> -   _mesa_drawbuffers(ctx, 1, &buffer, &destMask);
> +   _mesa_drawbuffers(ctx, ctx->DrawBuffer, 1, &buffer, &destMask);
>  
>     /*
>      * Call device driver function.
> @@ -440,7 +440,7 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>     }
>  
>     /* OK, if we get here, there were no errors so set the new state */
> -   _mesa_drawbuffers(ctx, n, buffers, destMask);
> +   _mesa_drawbuffers(ctx, ctx->DrawBuffer, n, buffers, destMask);
>  
>     /*
>      * Call device driver function.  Note that n can be equal to 0,
> @@ -459,12 +459,11 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>   * actual change.
>   */
>  static void
> -updated_drawbuffers(struct gl_context *ctx)
> +updated_drawbuffers(struct gl_context *ctx, struct gl_framebuffer *fb)
>  {
>     FLUSH_VERTICES(ctx, _NEW_BUFFERS);
>  
>     if (ctx->API == API_OPENGL_COMPAT && !ctx->Extensions.ARB_ES2_compatibility) {
> -      struct gl_framebuffer *fb = ctx->DrawBuffer;
>  

This blank line should probably also be removed.

With that nitpick fixed:

Reviewed-by: Fredrik Höglund <fredrik at kde.org>

>        /* Flag the FBO as requiring validation. */
>        if (_mesa_is_user_fbo(fb)) {
> @@ -482,6 +481,7 @@ updated_drawbuffers(struct gl_context *ctx)
>   * so nothing should go wrong at this point.
>   *
>   * \param ctx  current context
> + * \param fb   the desired draw buffer
>   * \param n    number of color outputs to set
>   * \param buffers  array[n] of colorbuffer names, like GL_LEFT.
>   * \param destMask  array[n] of BUFFER_BIT_* bitmasks which correspond to the
> @@ -489,10 +489,9 @@ updated_drawbuffers(struct gl_context *ctx)
>   *                  BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT).
>   */
>  void
> -_mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
> -                  const GLbitfield *destMask)
> +_mesa_drawbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
> +                  GLuint n, const GLenum *buffers, const GLbitfield *destMask)
>  {
> -   struct gl_framebuffer *fb = ctx->DrawBuffer;
>     GLbitfield mask[MAX_DRAW_BUFFERS];
>     GLuint buf;
>  
> @@ -518,7 +517,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
>        while (destMask0) {
>           GLint bufIndex = ffs(destMask0) - 1;
>           if (fb->_ColorDrawBufferIndexes[count] != bufIndex) {
> -            updated_drawbuffers(ctx);
> +            updated_drawbuffers(ctx, fb);
>              fb->_ColorDrawBufferIndexes[count] = bufIndex;
>           }
>           count++;
> @@ -535,14 +534,14 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
>              /* only one bit should be set in the destMask[buf] field */
>              assert(_mesa_bitcount(destMask[buf]) == 1);
>              if (fb->_ColorDrawBufferIndexes[buf] != bufIndex) {
> -	       updated_drawbuffers(ctx);
> +	       updated_drawbuffers(ctx, fb);
>                 fb->_ColorDrawBufferIndexes[buf] = bufIndex;
>              }
>              count = buf + 1;
>           }
>           else {
>              if (fb->_ColorDrawBufferIndexes[buf] != -1) {
> -	       updated_drawbuffers(ctx);
> +	       updated_drawbuffers(ctx, fb);
>                 fb->_ColorDrawBufferIndexes[buf] = -1;
>              }
>           }
> @@ -554,7 +553,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
>     /* set remaining outputs to -1 (GL_NONE) */
>     for (buf = fb->_NumColorDrawBuffers; buf < ctx->Const.MaxDrawBuffers; buf++) {
>        if (fb->_ColorDrawBufferIndexes[buf] != -1) {
> -         updated_drawbuffers(ctx);
> +         updated_drawbuffers(ctx, fb);
>           fb->_ColorDrawBufferIndexes[buf] = -1;
>        }
>     }
> @@ -566,7 +565,7 @@ _mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
>        /* also set context drawbuffer state */
>        for (buf = 0; buf < ctx->Const.MaxDrawBuffers; buf++) {
>           if (ctx->Color.DrawBuffer[buf] != fb->ColorDrawBuffer[buf]) {
> -	    updated_drawbuffers(ctx);
> +	    updated_drawbuffers(ctx, fb);
>              ctx->Color.DrawBuffer[buf] = fb->ColorDrawBuffer[buf];
>           }
>        }
> @@ -585,7 +584,7 @@ _mesa_update_draw_buffers(struct gl_context *ctx)
>     /* should be a window system FBO */
>     assert(_mesa_is_winsys_fbo(ctx->DrawBuffer));
>  
> -   _mesa_drawbuffers(ctx, ctx->Const.MaxDrawBuffers,
> +   _mesa_drawbuffers(ctx, ctx->DrawBuffer, ctx->Const.MaxDrawBuffers,
>                       ctx->Color.DrawBuffer, NULL);
>  }
>  
> diff --git a/src/mesa/main/buffers.h b/src/mesa/main/buffers.h
> index ebcfa1c..bc6d74a 100644
> --- a/src/mesa/main/buffers.h
> +++ b/src/mesa/main/buffers.h
> @@ -36,6 +36,7 @@
>  #include "glheader.h"
>  
>  struct gl_context;
> +struct gl_framebuffer;
>  
>  extern void GLAPIENTRY
>  _mesa_DrawBuffer( GLenum mode );
> @@ -44,7 +45,8 @@ extern void GLAPIENTRY
>  _mesa_DrawBuffers(GLsizei n, const GLenum *buffers);
>  
>  extern void
> -_mesa_drawbuffers(struct gl_context *ctx, GLuint n, const GLenum *buffers,
> +_mesa_drawbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
> +                  GLuint n, const GLenum *buffers,
>                    const GLbitfield *destMask);
>  
>  extern void
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 22c2341..b285d51 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -1567,7 +1567,8 @@ handle_first_current(struct gl_context *ctx)
>           else
>              buffer = GL_FRONT;
>  
> -         _mesa_drawbuffers(ctx, 1, &buffer, NULL /* destMask */);
> +         _mesa_drawbuffers(ctx, ctx->DrawBuffer, 1, &buffer,
> +                           NULL /* destMask */);
>        }
>  
>        if (ctx->ReadBuffer != _mesa_get_incomplete_framebuffer()) {
> diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
> index 6cb13d3..6446d71 100644
> --- a/src/mesa/main/framebuffer.c
> +++ b/src/mesa/main/framebuffer.c
> @@ -652,7 +652,7 @@ update_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
>         * context state (GL_READ_BUFFER too).
>         */
>        if (fb->ColorDrawBuffer[0] != ctx->Color.DrawBuffer[0]) {
> -         _mesa_drawbuffers(ctx, ctx->Const.MaxDrawBuffers,
> +         _mesa_drawbuffers(ctx, fb, ctx->Const.MaxDrawBuffers,
>                             ctx->Color.DrawBuffer, NULL);
>        }
>     }
> 



More information about the mesa-dev mailing list