[Mesa-dev] [PATCH 3/6] gallium/u_blitter: split out a helper for common clear state

Rob Clark robdclark at gmail.com
Sat Aug 13 18:57:55 UTC 2016


On Sat, Aug 13, 2016 at 2:23 PM, Rob Clark <robdclark at gmail.com> wrote:
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
>  src/gallium/auxiliary/util/u_blitter.c | 38 ++++++++++++++++++++++------------
>  src/gallium/auxiliary/util/u_blitter.h |  5 +++++
>  2 files changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index 9fbef9b..e008100 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -1268,19 +1268,13 @@ static void *get_clear_blend_state(struct blitter_context_priv *ctx,
>     return ctx->blend_clear[index];
>  }
>
> -static void util_blitter_clear_custom(struct blitter_context *blitter,
> -                                      unsigned width, unsigned height,
> -                                      unsigned num_layers,
> -                                      unsigned clear_buffers,
> -                                      const union pipe_color_union *color,
> -                                      double depth, unsigned stencil,
> -                                      void *custom_blend, void *custom_dsa)
> +void util_blitter_common_clear_setup(struct blitter_context *blitter,
> +                                     unsigned width, unsigned height,
> +                                     unsigned clear_buffers,
> +                                     void *custom_blend, void *custom_dsa)
>  {
>     struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
>     struct pipe_context *pipe = ctx->base.pipe;
> -   struct pipe_stencil_ref sr = { { 0 } };
> -
> -   assert(ctx->has_layered || num_layers <= 1);
>
>     util_blitter_set_running_flag(blitter);
>     blitter_check_saved_vertex_states(ctx);

so actually, I need to squash in:

----------
diff --git a/src/gallium/auxiliary/util/u_blitter.c
b/src/gallium/auxiliary/util/u_blitter.c
index e008100..c0d3808 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -1281,6 +1281,12 @@ void util_blitter_common_clear_setup(struct
blitter_context *blitter,
    blitter_check_saved_fragment_states(ctx);
    blitter_disable_render_cond(ctx);

+   /* this will end up getting set again in
blitter_set_common_draw_rect_state()
+    * but needs to be here for drivers using util_blitter_common_clear_setup()
+    * but not util_blitter_clear_custom()
+    */
+   pipe->bind_rasterizer_state(pipe, ctx->rs_state);
+
    /* bind states */
    if (custom_blend) {
       pipe->bind_blend_state(pipe, custom_blend);
----------

I don't think there should be any harm in doing
pipe->bind_rasterizer_state() twice for drivers using
util_blitter_clear_custom(), and this is easier that adding a new
helper (since ctx->rs_state is not visible outside of u_blitter.c),
but if someone sees a problem with binding rasterizer state twice then
I could make it a new helper fxn instead.

BR,
-R

> @@ -1306,14 +1300,32 @@ static void util_blitter_clear_custom(struct blitter_context *blitter,
>        pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
>     }
>
> +   pipe->set_sample_mask(pipe, ~0);
> +   blitter_set_dst_dimensions(ctx, width, height);
> +}
> +
> +static void util_blitter_clear_custom(struct blitter_context *blitter,
> +                                      unsigned width, unsigned height,
> +                                      unsigned num_layers,
> +                                      unsigned clear_buffers,
> +                                      const union pipe_color_union *color,
> +                                      double depth, unsigned stencil,
> +                                      void *custom_blend, void *custom_dsa)
> +{
> +   struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
> +   struct pipe_context *pipe = ctx->base.pipe;
> +   struct pipe_stencil_ref sr = { { 0 } };
> +
> +   assert(ctx->has_layered || num_layers <= 1);
> +
> +   util_blitter_common_clear_setup(blitter, width, height, clear_buffers,
> +                                   custom_blend, custom_dsa);
> +
>     sr.ref_value[0] = stencil & 0xff;
>     pipe->set_stencil_ref(pipe, &sr);
>
>     pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
>     bind_fs_write_all_cbufs(ctx);
> -   pipe->set_sample_mask(pipe, ~0);
> -
> -   blitter_set_dst_dimensions(ctx, width, height);
>
>     if (num_layers > 1 && ctx->has_layered) {
>        blitter_set_common_draw_rect_state(ctx, FALSE, TRUE);
> diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
> index 0f5da6b..d7d9f4a 100644
> --- a/src/gallium/auxiliary/util/u_blitter.h
> +++ b/src/gallium/auxiliary/util/u_blitter.h
> @@ -542,6 +542,11 @@ util_blitter_save_render_condition(struct blitter_context *blitter,
>     blitter->saved_render_cond_cond = condition;
>  }
>
> +void util_blitter_common_clear_setup(struct blitter_context *blitter,
> +                                     unsigned width, unsigned height,
> +                                     unsigned clear_buffers,
> +                                     void *custom_blend, void *custom_dsa);
> +
>  void util_blitter_set_running_flag(struct blitter_context *blitter);
>  void util_blitter_unset_running_flag(struct blitter_context *blitter);
>
> --
> 2.7.4
>


More information about the mesa-dev mailing list