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