In order to reduce future churn, move the callbacks for starting and finishing the batch from intel_batchbuffer to the brw_context.
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> --- src/mesa/drivers/dri/i965/brw_context.c | 83 +++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/intel_batchbuffer.c | 79 +------------------------ src/mesa/drivers/dri/i965/intel_batchbuffer.h | 3 + 3 files changed, 88 insertions(+), 77 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index a4b9880316..a375f0cb2a 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1746,3 +1746,86 @@ intel_update_image_buffers(struct brw_context *brw, __DRIdrawable *drawable) __DRI_IMAGE_BUFFER_BACK); } } + +/** + * Called when starting a new batch buffer. + */ +void brw_batch_start_hook(brw_batch *batch) +{ + struct brw_context *brw = container_of(batch, brw, batch); + + /* If the kernel supports hardware contexts, then most hardware state is + * preserved between batches; we only need to re-emit state that is required + * to be in every batch. Otherwise we need to re-emit all the state that + * would otherwise be stored in the context (which for all intents and + * purposes means everything). + */ + if (!batch->hw_ctx) + brw->ctx.NewDriverState |= BRW_NEW_CONTEXT; + + brw->ctx.NewDriverState |= BRW_NEW_BATCH; + + brw->state_batch_count = 0; + + brw->ib.type = -1; + + /* We need to periodically reap the shader time results, because rollover + * happens every few seconds. We also want to see results every once in a + * while, because many programs won't cleanly destroy our context, so the + * end-of-run printout may not happen. + */ + if (INTEL_DEBUG & DEBUG_SHADER_TIME) + brw_collect_and_report_shader_time(brw); +} + +/** + * Called from brw_batch_flush before emitting MI_BATCHBUFFER_END and sending + * it off. + * + * This function can emit state (say, to preserve registers that aren't saved + * between batches). All of this state MUST fit in the reserved space at the + * end of the batchbuffer. If you add more GPU state, increase the reserved + * space by updating the BATCH_RESERVED macro. + */ +void brw_batch_finish_hook(brw_batch *batch) +{ + struct brw_context *brw = container_of(batch, brw, batch); + + if (batch->ring != RENDER_RING) + return; + + if (brw->gen >= 7) + gen7_restore_default_l3_config(brw); + + if (brw->is_haswell) { + /* From the Haswell PRM, Volume 2b, Command Reference: Instructions, + * 3DSTATE_CC_STATE_POINTERS > "Note": + * + * "SW must program 3DSTATE_CC_STATE_POINTERS command at the end of every + * 3D batch buffer followed by a PIPE_CONTROL with RC flush and CS + * stall." + * + * From the example in the docs, it seems to expect a regular pipe control + * flush here as well. We may have done it already, but meh. + * + * See also WaAvoidRCZCounterRollover. + */ + brw_emit_mi_flush(brw); + + BEGIN_BATCH(2); + OUT_BATCH(_3DSTATE_CC_STATE_POINTERS << 16 | (2 - 2)); + OUT_BATCH(brw->cc.state_offset | 1); + ADVANCE_BATCH(); + + brw_emit_pipe_control_flush(brw, + PIPE_CONTROL_RENDER_TARGET_FLUSH | + PIPE_CONTROL_CS_STALL); + } + + /* Capture the closing pipeline statistics register values necessary to + * support query objects (in the non-hardware context world). + */ + brw_emit_query_end(brw); + + brw->cache.bo_used_by_gpu = true; +} diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c index 01b0d4fe2c..cc623bebe2 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c @@ -211,82 +211,7 @@ brw_new_batch(struct brw_context *brw) drm_intel_gem_bo_clear_relocs(brw->batch.bo, 0); intel_batchbuffer_reset(&brw->batch, brw->has_llc); - /* If the kernel supports hardware contexts, then most hardware state is - * preserved between batches; we only need to re-emit state that is required - * to be in every batch. Otherwise we need to re-emit all the state that - * would otherwise be stored in the context (which for all intents and - * purposes means everything). - */ - if (!brw->batch.hw_ctx) - brw->ctx.NewDriverState |= BRW_NEW_CONTEXT; - - brw->ctx.NewDriverState |= BRW_NEW_BATCH; - - brw->state_batch_count = 0; - - brw->ib.type = -1; - - /* We need to periodically reap the shader time results, because rollover - * happens every few seconds. We also want to see results every once in a - * while, because many programs won't cleanly destroy our context, so the - * end-of-run printout may not happen. - */ - if (INTEL_DEBUG & DEBUG_SHADER_TIME) - brw_collect_and_report_shader_time(brw); -} - -/** - * Called from intel_batchbuffer_flush before emitting MI_BATCHBUFFER_END and - * sending it off. - * - * This function can emit state (say, to preserve registers that aren't saved - * between batches). All of this state MUST fit in the reserved space at the - * end of the batchbuffer. If you add more GPU state, increase the reserved - * space by updating the BATCH_RESERVED macro. - */ -static void -brw_finish_batch(struct brw_context *brw) -{ - /* Capture the closing pipeline statistics register values necessary to - * support query objects (in the non-hardware context world). - */ - brw_emit_query_end(brw); - - if (brw->batch.ring == RENDER_RING) { - /* Work around L3 state leaks into contexts set MI_RESTORE_INHIBIT which - * assume that the L3 cache is configured according to the hardware - * defaults. - */ - if (brw->gen >= 7) - gen7_restore_default_l3_config(brw); - - if (brw->is_haswell) { - /* From the Haswell PRM, Volume 2b, Command Reference: Instructions, - * 3DSTATE_CC_STATE_POINTERS > "Note": - * - * "SW must program 3DSTATE_CC_STATE_POINTERS command at the end of every - * 3D batch buffer followed by a PIPE_CONTROL with RC flush and CS stall." - * - * From the example in the docs, it seems to expect a regular pipe control - * flush here as well. We may have done it already, but meh. - * - * See also WaAvoidRCZCounterRollover. - */ - brw_emit_mi_flush(brw); - BEGIN_BATCH(2); - OUT_BATCH(_3DSTATE_CC_STATE_POINTERS << 16 | (2 - 2)); - OUT_BATCH(brw->cc.state_offset | 1); - ADVANCE_BATCH(); - brw_emit_pipe_control_flush(brw, PIPE_CONTROL_RENDER_TARGET_FLUSH | - PIPE_CONTROL_CS_STALL); - } - } - - /* Mark that the current program cache BO has been used by the GPU. - * It will be reallocated if we need to put new programs in for the - * next batch. - */ - brw->cache.bo_used_by_gpu = true; + brw_batch_start_hook(&brw->batch); } static void @@ -419,7 +344,7 @@ _intel_batchbuffer_flush(struct brw_context *brw, brw->batch.reserved_space = 0; - brw_finish_batch(brw); + brw_batch_finish_hook(&brw->batch); /* Mark the end of the buffer. */ intel_batchbuffer_emit_dword(&brw->batch, MI_BATCH_BUFFER_END); diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.h b/src/mesa/drivers/dri/i965/intel_batchbuffer.h index df57bcaf25..a4664c4158 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.h +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.h @@ -53,6 +53,9 @@ void intel_batchbuffer_reset_to_saved(struct brw_context *brw); void intel_batchbuffer_require_space(struct brw_context *brw, GLuint sz, enum brw_gpu_ring ring); +void brw_batch_start_hook(struct brw_batch *batch); +void brw_batch_finish_hook(struct brw_batch *batch); + int _intel_batchbuffer_flush(struct brw_context *brw, const char *file, int line); -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev