<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, May 17, 2017 at 11:16 PM, Pohjolainen, Topi <span dir="ltr"><<a href="mailto:topi.pohjolainen@gmail.com" target="_blank">topi.pohjolainen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, May 16, 2017 at 03:45:28PM -0700, Jason Ekstrand wrote:<br>
> As part of enabling support for SF programs, we plumb the SF URB size<br>
> through to emit_urb_config.  For now, it's always zero but, on gen4, it<br>
> may be something larger.<br>
> ---<br>
>  src/intel/blorp/blorp.c                     | 62 +++++++++++++++++++++++++++++<br>
>  src/intel/blorp/blorp_blit.c                |  3 ++<br>
>  src/intel/blorp/blorp_clear.c               |  3 ++<br>
>  src/intel/blorp/blorp_genX_<wbr>exec.h           |  8 +++-<br>
>  src/intel/blorp/blorp_priv.h                |  7 ++++<br>
>  src/intel/vulkan/genX_blorp_<wbr>exec.c          |  5 ++-<br>
>  src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c |  3 +-<br>
>  7 files changed, 87 insertions(+), 4 deletions(-)<br>
><br>
> diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c<br>
> index f9727f7..1f29b93 100644<br>
> --- a/src/intel/blorp/blorp.c<br>
> +++ b/src/intel/blorp/blorp.c<br>
> @@ -216,6 +216,68 @@ blorp_compile_vs(struct blorp_context *blorp, void *mem_ctx,<br>
>     return program;<br>
>  }<br>
><br>
> +struct blorp_sf_key {<br>
> +   enum blorp_shader_type shader_type; /* Must be BLORP_SHADER_TYPE_GEN4_SF */<br>
> +<br>
> +   struct brw_sf_prog_key key;<br>
> +};<br>
> +<br>
> +bool<br>
> +blorp_ensure_sf_program(<wbr>struct blorp_context *blorp,<br>
> +                        struct blorp_params *params)<br>
> +{<br>
> +   const struct brw_wm_prog_data *wm_prog_data = params->wm_prog_data;<br>
> +   assert(params->wm_prog_data);<br>
> +<br>
> +   /* Gen6+ doesn't need a strips and fans program */<br>
> +   if (blorp->compiler->devinfo->gen >= 6)<br>
> +      return true;<br>
> +<br>
> +   struct blorp_sf_key key = {<br>
> +      .shader_type = BLORP_SHADER_TYPE_GEN4_SF,<br>
> +   };<br>
> +<br>
> +   /* Everything gets compacted in vertex setup, so we just need a<br>
> +    * pass-through for the correct number of input varyings.<br>
> +    */<br>
> +   const uint64_t slots_valid = VARYING_BIT_POS |<br>
> +      ((1ull << wm_prog_data->num_varying_<wbr>inputs) - 1) << VARYING_SLOT_VAR0;<br>
> +<br>
> +   key.key.attrs = slots_valid;<br>
> +   key.key.primitive = BRW_SF_PRIM_TRIANGLES;<br>
> +   key.key.contains_flat_varying = wm_prog_data->contains_flat_<wbr>varying;<br>
> +<br>
> +   STATIC_ASSERT(sizeof(key.key.<wbr>interp_mode) ==<br>
> +                 sizeof(wm_prog_data->interp_<wbr>mode));<br>
> +   memcpy(key.key.interp_mode, wm_prog_data->interp_mode,<br>
> +          sizeof(key.key.interp_mode));<br>
> +<br>
> +   if (blorp->lookup_shader(blorp, &key, sizeof(key),<br>
> +                            &params->sf_prog_kernel, &params->sf_prog_data))<br>
> +      return true;<br>
> +<br>
> +   void *mem_ctx = ralloc_context(NULL);<br>
> +<br>
> +   const unsigned *program;<br>
> +   unsigned program_size;<br>
> +<br>
> +   struct brw_vue_map vue_map;<br>
> +   brw_compute_vue_map(blorp-><wbr>compiler->devinfo, &vue_map, slots_valid, false);<br>
> +<br>
> +   struct brw_sf_prog_data prog_data_tmp;<br>
> +   program = brw_compile_sf(blorp-><wbr>compiler, mem_ctx, &key.key,<br>
> +                            &prog_data_tmp, &vue_map, &program_size);<br>
> +<br>
> +   bool result =<br>
> +      blorp->upload_shader(blorp, &key, sizeof(key), program, program_size,<br>
> +                           (void *)&prog_data_tmp, sizeof(prog_data_tmp),<br>
> +                           &params->sf_prog_kernel, &params->sf_prog_data);<br>
> +<br>
> +   ralloc_free(mem_ctx);<br>
> +<br>
> +   return result;<br>
> +}<br>
> +<br>
>  void<br>
>  blorp_gen6_hiz_op(struct blorp_batch *batch,<br>
>                    struct blorp_surf *surf, unsigned level, unsigned layer,<br>
> diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c<br>
> index 8408ebc..1f8ea49 100644<br>
> --- a/src/intel/blorp/blorp_blit.c<br>
> +++ b/src/intel/blorp/blorp_blit.c<br>
> @@ -1835,6 +1835,9 @@ try_blorp_blit(struct blorp_batch *batch,<br>
>     if (!brw_blorp_get_blit_kernel(<wbr>batch->blorp, params, wm_prog_key))<br>
>        return 0;<br>
><br>
> +   if (!blorp_ensure_sf_program(<wbr>batch->blorp, params))<br>
> +      return 0;<br>
> +<br>
>     unsigned result = 0;<br>
>     unsigned max_surface_size = get_max_surface_size(devinfo, params);<br>
>     if (params->src.surf.logical_<wbr>level0_px.width > max_surface_size ||<br>
> diff --git a/src/intel/blorp/blorp_clear.<wbr>c b/src/intel/blorp/blorp_clear.<wbr>c<br>
> index a9eb6b9..40a1a10 100644<br>
> --- a/src/intel/blorp/blorp_clear.<wbr>c<br>
> +++ b/src/intel/blorp/blorp_clear.<wbr>c<br>
> @@ -419,6 +419,9 @@ blorp_clear(struct blorp_batch *batch,<br>
>                                        use_simd16_replicated_data))<br>
>        return;<br>
><br>
> +   if (!blorp_ensure_sf_program(<wbr>batch->blorp, &params))<br>
> +      return;<br>
> +<br>
>     while (num_layers > 0) {<br>
>        brw_blorp_surface_info_init(<wbr>batch->blorp, &params.dst, surf, level,<br>
>                                    start_layer, format, true);<br>
> diff --git a/src/intel/blorp/blorp_genX_<wbr>exec.h b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
> index c6c14f5..058dedc 100644<br>
> --- a/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
> +++ b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
> @@ -73,7 +73,8 @@ blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset,<br>
>                      struct blorp_address address, uint32_t delta);<br>
><br>
>  static void<br>
> -blorp_emit_urb_config(struct blorp_batch *batch, unsigned vs_entry_size);<br>
> +blorp_emit_urb_config(struct blorp_batch *batch,<br>
> +                      unsigned vs_entry_size, unsigned sf_entry_size);<br>
><br>
>  /***** BEGIN blorp_exec implementation ******/<br>
><br>
> @@ -180,7 +181,10 @@ emit_urb_config(struct blorp_batch *batch,<br>
>     /* The URB size is expressed in units of 64 bytes (512 bits) */<br>
>     const unsigned vs_entry_size = DIV_ROUND_UP(total_needed, 64);<br>
><br>
> -   blorp_emit_urb_config(batch, vs_entry_size);<br>
> +   const unsigned sf_entry_size =<br>
> +      params->sf_prog_data ? params->sf_prog_data->urb_<wbr>entry_size : 0;<br>
> +<br>
> +   blorp_emit_urb_config(batch, vs_entry_size, sf_entry_size);<br>
>  }<br>
><br>
>  static void<br>
> diff --git a/src/intel/blorp/blorp_priv.h b/src/intel/blorp/blorp_priv.h<br>
> index 5f3362a..b3a5b2b 100644<br>
> --- a/src/intel/blorp/blorp_priv.h<br>
> +++ b/src/intel/blorp/blorp_priv.h<br>
> @@ -194,6 +194,8 @@ struct blorp_params<br>
>     unsigned num_layers;<br>
>     uint32_t vs_prog_kernel;<br>
>     struct brw_vs_prog_data *vs_prog_data;<br>
> +   uint32_t sf_prog_kernel;<br>
> +   struct brw_sf_prog_data *sf_prog_data;<br>
>     uint32_t wm_prog_kernel;<br>
>     struct brw_wm_prog_data *wm_prog_data;<br>
><br>
> @@ -207,6 +209,7 @@ enum blorp_shader_type {<br>
>     BLORP_SHADER_TYPE_BLIT,<br>
>     BLORP_SHADER_TYPE_CLEAR,<br>
>     BLORP_SHADER_TYPE_LAYER_<wbr>OFFSET_VS,<br>
> +   BLORP_SHADER_TYPE_GEN4_SF,<br>
>  };<br>
><br>
>  struct brw_blorp_blit_prog_key<br>
> @@ -341,6 +344,10 @@ blorp_compile_vs(struct blorp_context *blorp, void *mem_ctx,<br>
>                   struct brw_vs_prog_data *vs_prog_data,<br>
>                   unsigned *program_size);<br>
><br>
> +bool<br>
> +blorp_ensure_sf_program(<wbr>struct blorp_context *blorp,<br>
> +                        struct blorp_params *params);<br>
> +<br>
>  /** \} */<br>
><br>
>  #ifdef __cplusplus<br>
> diff --git a/src/intel/vulkan/genX_blorp_<wbr>exec.c b/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
> index 71ed707..eb33899 100644<br>
> --- a/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
> +++ b/src/intel/vulkan/genX_blorp_<wbr>exec.c<br>
> @@ -148,11 +148,14 @@ blorp_flush_range(struct blorp_batch *batch, void *start, size_t size)<br>
>  }<br>
><br>
>  static void<br>
> -blorp_emit_urb_config(struct blorp_batch *batch, unsigned vs_entry_size)<br>
> +blorp_emit_urb_config(struct blorp_batch *batch,<br>
> +                      unsigned vs_entry_size, unsigned sf_entry_size)<br>
>  {<br>
>     struct anv_device *device = batch->blorp->driver_ctx;<br>
>     struct anv_cmd_buffer *cmd_buffer = batch->driver_batch;<br>
><br>
<br>
</div></div>In order to keep compiler silent in release builds I think we need also:<br>
<br>
      (void)sf_entry_size;<span class=""><br></span></blockquote><div><br></div><div>Unused function arguments are usaully ok unless you've turned your warning level up significantly.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> +   assert(sf_entry_size == 0);<br>
> +<br>
>     const unsigned entry_size[4] = { vs_entry_size, 1, 1, 1 };<br>
><br>
>     genX(emit_urb_setup)(device, &cmd_buffer->batch,<br>
> diff --git a/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c b/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
> index 7157420..72ac274 100644<br>
> --- a/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
> +++ b/src/mesa/drivers/dri/i965/<wbr>genX_blorp_exec.c<br>
> @@ -155,7 +155,8 @@ blorp_flush_range(struct blorp_batch *batch, void *start, size_t size)<br>
>  }<br>
><br>
>  static void<br>
> -blorp_emit_urb_config(struct blorp_batch *batch, unsigned vs_entry_size)<br>
> +blorp_emit_urb_config(struct blorp_batch *batch,<br>
> +                      unsigned vs_entry_size, unsigned sf_entry_size)<br>
>  {<br>
>     assert(batch->blorp->driver_<wbr>ctx == batch->driver_batch);<br>
>     struct brw_context *brw = batch->driver_batch;<br>
> --<br>
> 2.5.0.400.gff86faf<br>
><br>
</span>> ______________________________<wbr>_________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>