From 0aea29cc1ce0c97e1cffb6aaff78c7dd754b8191 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 21 Oct 2016 17:15:49 -0700 Subject: [PATCH] intel/blorp: Add capability to use pre-baked binding tables When a pre-baked binding table is requested, no binding table is created, instead the binding table offset (relative to surface state base address) provided by the user is used verbatim. Signed-off-by: Jason Ekstrand Reviewed-by: Topi Pohjolainen --- src/intel/blorp/blorp_genX_exec.h | 44 +++++++++++++++++-------------- src/intel/blorp/blorp_priv.h | 3 +++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/intel/blorp/blorp_genX_exec.h b/src/intel/blorp/blorp_genX_exec.h index d278c1f58b4..66906fabbcc 100644 --- a/src/intel/blorp/blorp_genX_exec.h +++ b/src/intel/blorp/blorp_genX_exec.h @@ -1108,28 +1108,32 @@ blorp_emit_surface_states(struct blorp_batch *batch, uint32_t bind_offset, surface_offsets[2]; void *surface_maps[2]; - unsigned num_surfaces = 1 + params->src.enabled; - blorp_alloc_binding_table(batch, num_surfaces, - isl_dev->ss.size, isl_dev->ss.align, - &bind_offset, surface_offsets, surface_maps); - - if (params->dst.enabled) { - blorp_emit_surface_state(batch, ¶ms->dst, - surface_maps[BLORP_RENDERBUFFER_BT_INDEX], - surface_offsets[BLORP_RENDERBUFFER_BT_INDEX], - true); + if (params->use_pre_baked_binding_table) { + bind_offset = params->pre_baked_binding_table_offset; } else { - assert(params->depth.enabled || params->stencil.enabled); - const struct brw_blorp_surface_info *surface = - params->depth.enabled ? ¶ms->depth : ¶ms->stencil; - blorp_emit_null_surface_state(batch, surface, - surface_maps[BLORP_RENDERBUFFER_BT_INDEX]); - } + unsigned num_surfaces = 1 + params->src.enabled; + blorp_alloc_binding_table(batch, num_surfaces, + isl_dev->ss.size, isl_dev->ss.align, + &bind_offset, surface_offsets, surface_maps); + + if (params->dst.enabled) { + blorp_emit_surface_state(batch, ¶ms->dst, + surface_maps[BLORP_RENDERBUFFER_BT_INDEX], + surface_offsets[BLORP_RENDERBUFFER_BT_INDEX], + true); + } else { + assert(params->depth.enabled || params->stencil.enabled); + const struct brw_blorp_surface_info *surface = + params->depth.enabled ? ¶ms->depth : ¶ms->stencil; + blorp_emit_null_surface_state(batch, surface, + surface_maps[BLORP_RENDERBUFFER_BT_INDEX]); + } - if (params->src.enabled) { - blorp_emit_surface_state(batch, ¶ms->src, - surface_maps[BLORP_TEXTURE_BT_INDEX], - surface_offsets[BLORP_TEXTURE_BT_INDEX], false); + if (params->src.enabled) { + blorp_emit_surface_state(batch, ¶ms->src, + surface_maps[BLORP_TEXTURE_BT_INDEX], + surface_offsets[BLORP_TEXTURE_BT_INDEX], false); + } } #if GEN_GEN >= 7 diff --git a/src/intel/blorp/blorp_priv.h b/src/intel/blorp/blorp_priv.h index b69babc0bab..3d64fff3f2e 100644 --- a/src/intel/blorp/blorp_priv.h +++ b/src/intel/blorp/blorp_priv.h @@ -197,6 +197,9 @@ struct blorp_params struct brw_vs_prog_data *vs_prog_data; uint32_t wm_prog_kernel; struct brw_wm_prog_data *wm_prog_data; + + bool use_pre_baked_binding_table; + uint32_t pre_baked_binding_table_offset; }; void blorp_params_init(struct blorp_params *params); -- 2.30.2