The 3DSTATE_GATHER_POOL_ALLOC is used to enable or disable the gather push constants feature within a context. This patch provides the toggle functionality of using gather push constants to program constant data within a batch.
In addition, using gather push constants require that a gather pool be allocated so that the resource streamer can flush the packed constants it gathered. The pool is later referenced by the 3DSTATE_CONSTANT_* command to program the push constant data. This patch initializes the gather pool as well. Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com> --- src/mesa/drivers/dri/i965/brw_binding_tables.c | 40 +++++++++++++++++++++++++- src/mesa/drivers/dri/i965/brw_context.c | 7 +++++ src/mesa/drivers/dri/i965/brw_context.h | 7 +++++ src/mesa/drivers/dri/i965/brw_state.h | 1 + 4 files changed, 54 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 03e7a4a..b91e5d9 100644 --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c @@ -222,9 +222,44 @@ gen7_update_binding_table_from_array(struct brw_context *brw, ADVANCE_BATCH(); } +static void +gen7_init_gather_pool(struct brw_context *brw) +{ + if (!brw->has_resource_streamer || !brw->use_gather_constants) + return; + + if (!brw->gather_pool.bo) { + brw->gather_pool.bo = drm_intel_bo_alloc(brw->bufmgr, "gather_pool", + 131072, 4096); + brw->gather_pool.next_offset = 0; + } +} + +void +gen7_toggle_gather_constants(struct brw_context *brw, bool enable) +{ + if (enable && (!brw->has_resource_streamer || !brw->use_gather_constants)) + return; + + BEGIN_BATCH(3); + OUT_BATCH(_3DSTATE_GATHER_POOL_ALLOC << 16 | (3 - 2)); + if (enable) { + OUT_RELOC(brw->gather_pool.bo, I915_GEM_DOMAIN_SAMPLER, 0, + (1 << 11) | (3 << 4) | GEN7_MOCS_L3); + OUT_RELOC(brw->gather_pool.bo, I915_GEM_DOMAIN_SAMPLER, 0, + brw->gather_pool.bo->size); + } else { + OUT_BATCH((3 << 4)); + OUT_BATCH(0); + } + ADVANCE_BATCH(); +} + void gen7_disable_hw_binding_tables(struct brw_context *brw) { + gen7_toggle_gather_constants(brw, false); + BEGIN_BATCH(3); OUT_BATCH(_3DSTATE_BINDING_TABLE_POOL_ALLOC << 16 | (3 - 2)); OUT_BATCH(3 << 5); /* only in HSW */ @@ -262,6 +297,9 @@ gen7_enable_hw_binding_tables(struct brw_context *brw) brw->hw_bt_pool.bo->size); ADVANCE_BATCH(); + gen7_init_gather_pool(brw); + gen7_toggle_gather_constants(brw, true); + /* Pipe control workaround */ BEGIN_BATCH(4); OUT_BATCH(_3DSTATE_PIPE_CONTROL | (4 - 2)); @@ -275,6 +313,7 @@ void gen7_reset_rs_pool_offsets(struct brw_context *brw) { brw->hw_bt_pool.next_offset = bt_size; + brw->gather_pool.next_offset = 0; } const struct brw_tracked_state gen7_hw_binding_tables = { @@ -358,5 +397,4 @@ const struct brw_tracked_state gen6_binding_table_pointers = { }, .emit = gen6_upload_binding_table_pointers, }; - /** @} */ diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index b962103..32bbdc2 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -711,6 +711,12 @@ brwCreateContext(gl_api api, brw->has_resource_streamer = false; } + if (getenv("INTEL_GATHER")) { + brw->use_gather_constants = brw->has_resource_streamer; + } else { + brw->use_gather_constants = false; + } + brw->vs.base.stage = MESA_SHADER_VERTEX; brw->gs.base.stage = MESA_SHADER_GEOMETRY; brw->wm.base.stage = MESA_SHADER_FRAGMENT; @@ -853,6 +859,7 @@ brwCreateContext(gl_api api, ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB; brw->hw_bt_pool.bo = 0; + brw->gather_pool.bo = 0; if (INTEL_DEBUG & DEBUG_SHADER_TIME) brw_init_shader_time(brw); diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 17fea5b..b205773 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1081,6 +1081,7 @@ struct brw_context bool use_rep_send; bool scalar_vs; bool has_resource_streamer; + bool use_gather_constants; /** * Some versions of Gen hardware don't do centroid interpolation correctly @@ -1340,6 +1341,12 @@ struct brw_context uint32_t next_offset; } hw_bt_pool; + /* Internal storage used by the resource streamer to flush and refer to constant data*/ + struct { + drm_intel_bo *bo; + uint32_t next_offset; + } gather_pool; + struct { uint32_t state_offset; uint32_t blend_state_offset; diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index f985a3a..16355bd 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -309,6 +309,7 @@ void gen7_update_binding_table_from_array(struct brw_context *brw, 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); +void gen7_toggle_gather_constants(struct brw_context *brw, bool enable); #ifdef __cplusplus } -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev