Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com> --- src/mesa/drivers/dri/i965/brw_binding_tables.c | 36 ++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_defines.h | 5 ++++ src/mesa/drivers/dri/i965/brw_state.h | 15 +++++++++- 3 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/src/mesa/drivers/dri/i965/brw_binding_tables.c b/src/mesa/drivers/dri/i965/brw_binding_tables.c index 2160be8..4a80a9b 100644 --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c @@ -176,6 +176,42 @@ 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, + enum stage_shader_edit_type stage, + uint32_t index, + uint32_t surf_offset) +{ + GLuint cmd_binding_table_edit; + GLbitfield brw_new_binding_table; + + switch(stage) { + case STAGE_VERTEX_SHADER: + cmd_binding_table_edit = _3DSTATE_BINDING_TABLE_EDIT_VS; + brw_new_binding_table = BRW_NEW_VS_BINDING_TABLE; + break; + case STAGE_GEOMETRY_SHADER: + cmd_binding_table_edit = _3DSTATE_BINDING_TABLE_EDIT_GS; + brw_new_binding_table = BRW_NEW_GS_BINDING_TABLE; + break; + case STAGE_FRAGMENT_SHADER: + cmd_binding_table_edit = _3DSTATE_BINDING_TABLE_EDIT_PS; + brw_new_binding_table = BRW_NEW_PS_BINDING_TABLE; + break; + default: + assert(!"Unimplemented binding table edit command"); + break; + } + + BEGIN_BATCH(3); + OUT_BATCH(cmd_binding_table_edit << 16 | (3 - 2)); + OUT_BATCH(0x3); + OUT_BATCH(index << 16 | (surf_offset >> 5)); + ADVANCE_BATCH(); + + brw->state.dirty.brw |= brw_new_binding_table; +} + +void gen7_enable_hw_binding_tables(struct brw_context *brw) { if (!brw->has_resource_streamer) diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index 3530bbf..a66027e 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -1246,6 +1246,11 @@ enum brw_message_target { #define _3DSTATE_BINDING_TABLE_POOL_ALLOC 0x7919 /* GEN7.5+ */ # define HSW_BINDING_TABLE_ALLOC_OFFSET 0x860 /* GEN7.5+ */ +#define _3DSTATE_BINDING_TABLE_EDIT_VS 0x7843 /* GEN7.5 */ +#define _3DSTATE_BINDING_TABLE_EDIT_GS 0x7844 /* GEN7.5 */ +#define _3DSTATE_BINDING_TABLE_EDIT_HS 0x7845 /* GEN7.5 */ +#define _3DSTATE_BINDING_TABLE_EDIT_DS 0x7846 /* GEN7.5 */ +#define _3DSTATE_BINDING_TABLE_EDIT_PS 0x7847 /* GEN7.5 */ #define _3DSTATE_SAMPLER_STATE_POINTERS 0x7802 /* GEN6+ */ # define PS_SAMPLER_STATE_CHANGE (1 << 12) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 0e08e03..b9509f4 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -256,7 +256,20 @@ gen7_upload_constant_state(struct brw_context *brw, /* gen7_misc_state.c */ void gen7_rs_control(struct brw_context *brw, int enable); - +/** + * Enum to specify stages on binding table edit + */ +enum stage_shader_edit_type +{ + STAGE_VERTEX_SHADER, + STAGE_GEOMETRY_SHADER, + STAGE_FRAGMENT_SHADER, +}; + +void gen7_update_binding_table(struct brw_context *brw, + enum stage_shader_edit_type stage, + uint32_t index, + uint32_t surf_offset); void gen7_update_hw_bt(struct brw_context *brw); void gen7_enable_hw_binding_tables(struct brw_context *brw); -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev