[Mesa-dev] [PATCH 09/23] i965: Make brw_upload_sampler_state_table handle Gen7+ as well.

Pohjolainen, Topi topi.pohjolainen at intel.com
Wed Jul 30 00:32:12 PDT 2014


On Tue, Jul 29, 2014 at 04:29:14PM -0700, Kenneth Graunke wrote:
> This copies a few changes from gen7_upload_sampler_state_table; the next
> patch will delete that function.
> 
> Gen7+ has per-stage sampler state pointer update packets, so we emit
> them as soon as we emit a new table for a stage.  On Gen6 and earlier,
> we have a single packet, so we delay until we've changed everything
> that's going to be changed.
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_sampler_state.c  | 39 +++++++++++++++++++++++---
>  src/mesa/drivers/dri/i965/brw_state.h          |  3 ++
>  src/mesa/drivers/dri/i965/gen7_sampler_state.c |  2 +-
>  3 files changed, 39 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_sampler_state.c b/src/mesa/drivers/dri/i965/brw_sampler_state.c
> index a14b5b3..dc351bd 100644
> --- a/src/mesa/drivers/dri/i965/brw_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_sampler_state.c
> @@ -39,6 +39,7 @@
>  #include "brw_context.h"
>  #include "brw_state.h"
>  #include "brw_defines.h"
> +#include "intel_batchbuffer.h"
>  #include "intel_mipmap_tree.h"
>  
>  #include "main/macros.h"
> @@ -402,9 +403,16 @@ brw_upload_sampler_state_table(struct brw_context *brw,
>        if (SamplersUsed & (1 << s)) {
>           const unsigned unit = prog->SamplerUnits[s];
>           if (ctx->Texture.Unit[unit]._Current) {
> -            brw_update_sampler_state(brw, unit,
> -                                     (struct brw_sampler_state *) sampler_state,
> -                                     batch_offset_for_sampler_state);
> +            if (brw->gen >= 7) {
> +               gen7_update_sampler_state(brw, unit,
> +                                         (struct gen7_sampler_state *)
> +                                         sampler_state);
> +            } else {
> +               brw_update_sampler_state(brw, unit,
> +                                        (struct brw_sampler_state *)
> +                                        sampler_state,
> +                                        batch_offset_for_sampler_state);
> +            }
>           }
>        }
>  
> @@ -412,7 +420,30 @@ brw_upload_sampler_state_table(struct brw_context *brw,
>        batch_offset_for_sampler_state += size_in_bytes;
>     }
>  
> -   brw->state.dirty.cache |= CACHE_NEW_SAMPLER;
> +   if (brw->gen >= 7) {
> +      /* Emit a 3DSTATE_SAMPLER_STATE_POINTERS_XS packet. */
> +      static const uint16_t packet_headers[] = {
> +         [MESA_SHADER_VERTEX] = _3DSTATE_SAMPLER_STATE_POINTERS_VS,
> +         [MESA_SHADER_GEOMETRY] = _3DSTATE_SAMPLER_STATE_POINTERS_GS,
> +         [MESA_SHADER_FRAGMENT] = _3DSTATE_SAMPLER_STATE_POINTERS_PS,
> +      };
> +
> +      /* Ivybridge requires a workaround flush before VS packets. */
> +      if (brw->gen == 7 && !brw->is_haswell && !brw->is_baytrail &&
> +          stage_state->stage == MESA_SHADER_VERTEX) {
> +         gen7_emit_vs_workaround_flush(brw);
> +      }
> +
> +      BEGIN_BATCH(2);
> +      OUT_BATCH(packet_headers[stage_state->stage] << 16 | (2 - 2));
> +      OUT_BATCH(stage_state->sampler_offset);
> +      ADVANCE_BATCH();

This is purely matter of taste but to me it would have been clearer to have
the contents of this block in a helper function, say
gen7_emit_3d_state_sampler_state_pointers_xs().

> +      /* Emit a 3DSTATE_SAMPLER_STATE_POINTERS_XS packet. */
> +   } else {
> +      /* Flag that the sampler state table pointer has changed; later atoms
> +       * will handle it.
> +       */
> +      brw->state.dirty.cache |= CACHE_NEW_SAMPLER;
> +   }
>  }
>  
>  static void
> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> index 77de785..64652cb 100644
> --- a/src/mesa/drivers/dri/i965/brw_state.h
> +++ b/src/mesa/drivers/dri/i965/brw_state.h
> @@ -252,6 +252,9 @@ void upload_default_color(struct brw_context *brw,
>  void gen4_init_vtable_sampler_functions(struct brw_context *brw);
>  
>  /* gen7_sampler_state.c */
> +void gen7_update_sampler_state(struct brw_context *brw,
> +                               int unit,
> +                               struct gen7_sampler_state *sampler_state);
>  void gen7_init_vtable_sampler_functions(struct brw_context *brw);
>  
>  /* gen6_sf_state.c */
> diff --git a/src/mesa/drivers/dri/i965/gen7_sampler_state.c b/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> index b6d45cc..66af26a 100644
> --- a/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> @@ -33,7 +33,7 @@
>  /**
>   * Sets the sampler state for a single unit.
>   */
> -static void
> +void
>  gen7_update_sampler_state(struct brw_context *brw, int unit,
>  			  struct gen7_sampler_state *sampler)
>  {
> -- 
> 2.0.2
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list