[Mesa-dev] [PATCH 06/15] i965/blorp: Allocate space for push constants on Gen7.

Ian Romanick idr at freedesktop.org
Tue May 22 10:21:22 PDT 2012


On 05/11/2012 11:03 AM, Paul Berry wrote:
> On Gen7, push constants for shader programs are stored in the URB, so
> blorp code needs to set aside space for them.  This was previously
> unnecessary because blorp code was based on HiZ operations, which
> don't require any shaders.
>
> This patch adds a call from gen7_blorp_exec() to
> gen7_allocate_push_constants(), to ensure that push constants are
> assigned the correct location in the URB.  It also extracts a new
> function gen7_emit_urb_state() from gen7_upload_urb(), which is
> re-used by gen7_blorp_emit_urb_config() to ensure that the URB regions
> used by all the pipeline stages leave room for the push constants.
> ---
>   src/mesa/drivers/dri/i965/brw_context.h  |    7 +++++++
>   src/mesa/drivers/dri/i965/gen7_blorp.cpp |   27 ++++-----------------------
>   src/mesa/drivers/dri/i965/gen7_urb.c     |   23 ++++++++++++++++-------
>   3 files changed, 27 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 251893f..fe50d94 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1146,6 +1146,13 @@ void
>   gen6_emit_3dstate_sample_mask(struct brw_context *brw,
>                                 unsigned num_samples);
>
> +/* gen7_urb.c */
> +void
> +gen7_allocate_push_constants(struct brw_context *brw);
> +void
> +gen7_emit_urb_state(struct brw_context *brw, GLuint nr_vs_entries,
> +                    GLuint vs_size, GLuint vs_start);
> +

Super nit pick of the series... there should be a blank line between 
these prototypes. :)

>
>
>   /*======================================================================
> diff --git a/src/mesa/drivers/dri/i965/gen7_blorp.cpp b/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> index 7573b47..dee342f 100644
> --- a/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> +++ b/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> @@ -50,34 +50,14 @@ static void
>   gen7_blorp_emit_urb_config(struct brw_context *brw,
>                              const brw_blorp_params *params)
>   {
> -   struct intel_context *intel =&brw->intel;
> -
>      /* The minimum valid value is 32. See 3DSTATE_URB_VS,
>       * Dword 1.15:0 "VS Number of URB Entries".
>       */
>      int num_vs_entries = 32;
> +   int vs_size = 2;
> +   int vs_start = 2; /* skip over push constants */
>
> -   BEGIN_BATCH(2);
> -   OUT_BATCH(_3DSTATE_URB_VS<<  16 | (2 - 2));
> -   OUT_BATCH(1<<  GEN7_URB_ENTRY_SIZE_SHIFT |
> -             0<<  GEN7_URB_STARTING_ADDRESS_SHIFT |
> -             num_vs_entries);
> -   ADVANCE_BATCH();
> -
> -   BEGIN_BATCH(2);
> -   OUT_BATCH(_3DSTATE_URB_GS<<  16 | (2 - 2));
> -   OUT_BATCH(0);
> -   ADVANCE_BATCH();
> -
> -   BEGIN_BATCH(2);
> -   OUT_BATCH(_3DSTATE_URB_HS<<  16 | (2 - 2));
> -   OUT_BATCH(0);
> -   ADVANCE_BATCH();
> -
> -   BEGIN_BATCH(2);
> -   OUT_BATCH(_3DSTATE_URB_DS<<  16 | (2 - 2));
> -   OUT_BATCH(0);
> -   ADVANCE_BATCH();
> +   gen7_emit_urb_state(brw, num_vs_entries, vs_size, vs_start);
>   }
>
>
> @@ -725,6 +705,7 @@ gen7_blorp_exec(struct intel_context *intel,
>
>      uint32_t prog_offset = params->get_wm_prog(brw,&prog_data);
>      gen6_blorp_emit_batch_head(brw, params);
> +   gen7_allocate_push_constants(brw);
>      gen6_emit_3dstate_multisample(brw, params->num_samples);
>      gen6_emit_3dstate_sample_mask(brw, params->num_samples);
>      gen6_blorp_emit_state_base_address(brw, params);
> diff --git a/src/mesa/drivers/dri/i965/gen7_urb.c b/src/mesa/drivers/dri/i965/gen7_urb.c
> index 920c9fc..a732199 100644
> --- a/src/mesa/drivers/dri/i965/gen7_urb.c
> +++ b/src/mesa/drivers/dri/i965/gen7_urb.c
> @@ -50,7 +50,7 @@
>    *
>    * See "Volume 2a: 3D Pipeline," section 1.8.
>    */
> -static void
> +void
>   gen7_allocate_push_constants(struct brw_context *brw)
>   {
>      struct intel_context *intel =&brw->intel;
> @@ -100,31 +100,40 @@ gen7_upload_urb(struct brw_context *brw)
>      assert(!brw->gs.prog_active);
>
>      gen7_emit_vs_workaround_flush(intel);
> +   gen7_emit_urb_state(brw, brw->urb.nr_vs_entries, brw->urb.vs_size,
> +                       brw->urb.vs_start);
> +}
> +
> +void
> +gen7_emit_urb_state(struct brw_context *brw, GLuint nr_vs_entries,
> +                    GLuint vs_size, GLuint vs_start)
> +{
> +   struct intel_context *intel =&brw->intel;
>
>      BEGIN_BATCH(2);
>      OUT_BATCH(_3DSTATE_URB_VS<<  16 | (2 - 2));
> -   OUT_BATCH(brw->urb.nr_vs_entries |
> -             ((brw->urb.vs_size - 1)<<  GEN7_URB_ENTRY_SIZE_SHIFT) |
> -	     (brw->urb.vs_start<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
> +   OUT_BATCH(nr_vs_entries |
> +             ((vs_size - 1)<<  GEN7_URB_ENTRY_SIZE_SHIFT) |
> +	     (vs_start<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
>      ADVANCE_BATCH();
>
>      /* Allocate the GS, HS, and DS zero space - we don't use them. */
>      BEGIN_BATCH(2);
>      OUT_BATCH(_3DSTATE_URB_GS<<  16 | (2 - 2));
>      OUT_BATCH((0<<  GEN7_URB_ENTRY_SIZE_SHIFT) |
> -             (2<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
> +             (vs_start<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
>      ADVANCE_BATCH();
>
>      BEGIN_BATCH(2);
>      OUT_BATCH(_3DSTATE_URB_HS<<  16 | (2 - 2));
>      OUT_BATCH((0<<  GEN7_URB_ENTRY_SIZE_SHIFT) |
> -             (2<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
> +             (vs_start<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
>      ADVANCE_BATCH();
>
>      BEGIN_BATCH(2);
>      OUT_BATCH(_3DSTATE_URB_DS<<  16 | (2 - 2));
>      OUT_BATCH((0<<  GEN7_URB_ENTRY_SIZE_SHIFT) |
> -             (2<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
> +             (vs_start<<  GEN7_URB_STARTING_ADDRESS_SHIFT));
>      ADVANCE_BATCH();
>   }
>



More information about the mesa-dev mailing list