[Mesa-dev] [PATCH 5/6] st/mesa: set correct PIPE_CLEAR_COLORn flags

Roland Scheidegger sroland at vmware.com
Thu Dec 5 13:49:44 PST 2013


Am 05.12.2013 18:53, schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> This also fixes the clear_with_quad function for glClearBuffer.
> ---
>  src/mesa/state_tracker/st_cb_clear.c | 37 +++++++++++++++++++++++++-----------
>  1 file changed, 26 insertions(+), 11 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
> index 5a7a00c..887e58b 100644
> --- a/src/mesa/state_tracker/st_cb_clear.c
> +++ b/src/mesa/state_tracker/st_cb_clear.c
> @@ -213,8 +213,7 @@ draw_quad(struct st_context *st,
>   * ctx->DrawBuffer->_X/Ymin/max fields.
>   */
>  static void
> -clear_with_quad(struct gl_context *ctx,
> -                GLboolean color, GLboolean depth, GLboolean stencil)
> +clear_with_quad(struct gl_context *ctx, unsigned clear_buffers)
>  {
>     struct st_context *st = st_context(ctx);
>     const struct gl_framebuffer *fb = ctx->DrawBuffer;
> @@ -253,7 +252,7 @@ clear_with_quad(struct gl_context *ctx,
>     {
>        struct pipe_blend_state blend;
>        memset(&blend, 0, sizeof(blend));
> -      if (color) {
> +      if (clear_buffers & PIPE_CLEAR_COLOR) {
>           int num_buffers = ctx->Extensions.EXT_draw_buffers2 ?
>                             ctx->DrawBuffer->_NumColorDrawBuffers : 1;
>           int i;
> @@ -261,6 +260,9 @@ clear_with_quad(struct gl_context *ctx,
>           blend.independent_blend_enable = num_buffers > 1;
>  
>           for (i = 0; i < num_buffers; i++) {
> +            if (!(clear_buffers & (PIPE_CLEAR_COLOR0 << i)))
> +               continue;
> +
>              if (ctx->Color.ColorMask[i][0])
>                 blend.rt[i].colormask |= PIPE_MASK_R;
>              if (ctx->Color.ColorMask[i][1])
> @@ -281,13 +283,13 @@ clear_with_quad(struct gl_context *ctx,
>     {
>        struct pipe_depth_stencil_alpha_state depth_stencil;
>        memset(&depth_stencil, 0, sizeof(depth_stencil));
> -      if (depth) {
> +      if (clear_buffers & PIPE_CLEAR_DEPTH) {
>           depth_stencil.depth.enabled = 1;
>           depth_stencil.depth.writemask = 1;
>           depth_stencil.depth.func = PIPE_FUNC_ALWAYS;
>        }
>  
> -      if (stencil) {
> +      if (clear_buffers & PIPE_CLEAR_STENCIL) {
>           struct pipe_stencil_ref stencil_ref;
>           memset(&stencil_ref, 0, sizeof(stencil_ref));
>           depth_stencil.stencil[0].enabled = 1;
> @@ -371,6 +373,19 @@ is_scissor_enabled(struct gl_context *ctx, struct gl_renderbuffer *rb)
>  
>  
>  /**
> + * Return if all of the color channels are masked.
> + */
> +static INLINE GLboolean
> +is_color_disabled(struct gl_context *ctx, int i)
> +{
> +   return !ctx->Color.ColorMask[i][0] &&
> +          !ctx->Color.ColorMask[i][1] &&
> +          !ctx->Color.ColorMask[i][2] &&
> +          !ctx->Color.ColorMask[i][3];
> +}
Technically you could also return true if not all channels are masked,
as long as these channels don't exist in the rb. I guess though that gets
a bit too complicated...


> +
> +/**
>   * Return if any of the color channels are masked.
>   */
>  static INLINE GLboolean
> @@ -427,11 +442,14 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>              if (!strb || !strb->surface)
>                 continue;
>  
> +            if (is_color_disabled(ctx, colormask_index))
> +               continue;
> +
>              if (is_scissor_enabled(ctx, rb) ||
>                  is_color_masked(ctx, colormask_index))
> -               quad_buffers |= PIPE_CLEAR_COLOR;
> +               quad_buffers |= PIPE_CLEAR_COLOR0 << i;
>              else
> -               clear_buffers |= PIPE_CLEAR_COLOR;
> +               clear_buffers |= PIPE_CLEAR_COLOR0 << i;
>           }
>        }
>     }
> @@ -464,10 +482,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>      */
>     if (quad_buffers) {
>        quad_buffers |= clear_buffers;
> -      clear_with_quad(ctx,
> -                      quad_buffers & PIPE_CLEAR_COLOR,
> -                      quad_buffers & PIPE_CLEAR_DEPTH,
> -                      quad_buffers & PIPE_CLEAR_STENCIL);
> +      clear_with_quad(ctx, quad_buffers);
>     } else if (clear_buffers) {
>        /* We can't translate the clear color to the colorbuffer format,
>         * because different colorbuffers may have different formats.
> 

Series makes sense to me if you don't want to use the
clear_render_target() function for that instead. And I guess the latter
hasn't many supporters...

Roland


More information about the mesa-dev mailing list