[Mesa-dev] [PATCH 4/5] i965: Implement interface to edit binding table entries
Pohjolainen, Topi
topi.pohjolainen at intel.com
Tue May 19 23:57:26 PDT 2015
On Wed, May 20, 2015 at 09:32:09AM +0300, Abdiel Janulgue wrote:
> Unlike normal software binding tables where the driver has to manually
> generate and fill a binding table array which are then uploaded to the
> hardware, the resource streamer instead presents the driver with an option
> to fill out slots for individual binding table indices. The hardware
> accumlates the state for these combined edits which it then automatically
> flushes to a binding table pool when the binding table pointer state
> command is invoked.
>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_binding_tables.c | 50 ++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_state.h | 9 +++++
> 2 files changed, 59 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_binding_tables.c b/src/mesa/drivers/dri/i965/brw_binding_tables.c
> index d8cb96d..e0ee700 100644
> --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c
> +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c
> @@ -61,6 +61,12 @@
> */
> #define HW_BT_START_OFFSET 2 * 256;
>
> +static const GLuint stage_to_bt_edit[MESA_SHADER_FRAGMENT + 1] = {
> + _3DSTATE_BINDING_TABLE_EDIT_VS,
> + _3DSTATE_BINDING_TABLE_EDIT_GS,
> + _3DSTATE_BINDING_TABLE_EDIT_PS,
> +};
> +
> /**
> * Upload a shader stage's binding table as indirect state.
> *
> @@ -191,6 +197,50 @@ const struct brw_tracked_state brw_gs_binding_table = {
> * Hardware-generated binding tables for the resource streamer
> */
> void
> +gen7_update_binding_table(struct brw_context *brw,
> + gl_shader_stage stage,
> + uint32_t index,
> + uint32_t surf_offset)
> +{
> + assert(stage <= MESA_SHADER_FRAGMENT);
> +
> + /* The surface state offset is a 16-bit value aligned to 32 bytes but
> + * Surface State Pointer in dw2 is [15:0]. Right shift surf_offset
> + * by 5 bits so it won't disturb bit 16 (which is used as the binding
> + * table index entry), otherwise it would hang the GPU.
> + */
> + uint32_t dw2 = SET_FIELD(index, BRW_BINDING_TABLE_INDEX) | (surf_offset >> 5);
How about creating a macro for the shift along with the documentation above -
I see the same shift below in gen7_update_binding_table_from_array() without
the explanation.
> +
> + BEGIN_BATCH(3);
> + OUT_BATCH(stage_to_bt_edit[stage] << 16 | (3 - 2));
> + OUT_BATCH(BRW_BINDING_TABLE_EDIT_TARGET_ALL);
> + OUT_BATCH(dw2);
> + ADVANCE_BATCH();
> +}
> +
> +/**
> + * Hardware-generated binding tables for the resource streamer
> + */
> +void
> +gen7_update_binding_table_from_array(struct brw_context *brw,
> + gl_shader_stage stage,
> + const uint32_t* binding_table,
> + int size)
> +{
> + uint32_t dw2 = 0;
> + assert(stage <= MESA_SHADER_FRAGMENT);
> +
> + BEGIN_BATCH(size + 2);
> + OUT_BATCH(stage_to_bt_edit[stage] << 16 | size);
> + OUT_BATCH(BRW_BINDING_TABLE_EDIT_TARGET_ALL);
> + for (int i = 0; i < size; i++) {
> + dw2 = SET_FIELD(i, BRW_BINDING_TABLE_INDEX) | (binding_table[i] >> 5);
> + OUT_BATCH(dw2);
> + }
> + ADVANCE_BATCH();
> +}
> +
> +void
> gen7_disable_hw_binding_tables(struct brw_context *brw)
> {
> BEGIN_BATCH(3);
> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> index 52dea58..b296e54 100644
> --- a/src/mesa/drivers/dri/i965/brw_state.h
> +++ b/src/mesa/drivers/dri/i965/brw_state.h
> @@ -375,6 +375,15 @@ gen7_upload_constant_state(struct brw_context *brw,
>
> /* gen7_misc_state.c */
> void gen7_rs_control(struct brw_context *brw, int enable);
> +
> +void gen7_update_binding_table(struct brw_context *brw,
> + gl_shader_stage stage,
> + uint32_t index,
> + uint32_t surf_offset);
> +void gen7_update_binding_table_from_array(struct brw_context *brw,
> + gl_shader_stage stage,
> + const uint32_t* binding_table,
> + int size);
> void gen7_enable_hw_binding_tables(struct brw_context *brw);
> void gen7_disable_hw_binding_tables(struct brw_context *brw);
> void gen7_reset_rs_pool_offsets(struct brw_context *brw);
> --
> 1.9.1
>
> _______________________________________________
> 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