[Mesa-dev] [PATCH] i965/batch: don't ignore the 'brw_new_batch' call for a 'new batch'
andrey simiklit
asimiklit.work at gmail.com
Tue Aug 21 12:00:57 UTC 2018
Hi all,
The bug for this issue was created:
https://bugs.freedesktop.org/show_bug.cgi?id=107626
Regards,
Andrii.
On Mon, Aug 20, 2018 at 5:43 PM, <asimiklit.work at gmail.com> wrote:
> From: Andrii Simiklit <andrii.simiklit at globallogic.com>
>
> If we restore the 'new batch' using 'intel_batchbuffer_reset_to_saved'
> function we must restore the default state of the batch using
> 'brw_new_batch' function because the 'intel_batchbuffer_flush'
> function will not do it for the 'new batch' again.
> At least the following fields of the batch
> 'state_base_address_emitted','aperture_space', 'state_used'
> should be restored to default values to avoid:
> 1. the aperture_space overflow
> 2. the missed STATE_BASE_ADDRESS commad in the batch
> 3. the memory overconsumption of the 'statebuffer'
> due to uncleared 'state_used' field.
> etc.
>
> Signed-off-by: Andrii Simiklit <andrii.simiklit at globallogic.com>
> ---
> src/mesa/drivers/dri/i965/intel_batchbuffer.c | 104
> +++++++++++++++-----------
> 1 file changed, 59 insertions(+), 45 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index 65d2c64..b8c5fb4 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -219,7 +219,7 @@ add_exec_bo(struct intel_batchbuffer *batch, struct
> brw_bo *bo)
> bo->index = batch->exec_count;
> batch->exec_bos[batch->exec_count] = bo;
> batch->aperture_space += bo->size;
> -
> + assert((batch->aperture_space >= 0) && "error 'batch->aperture_space'
> field is overflown!");
> return batch->exec_count++;
> }
>
> @@ -290,6 +290,51 @@ intel_batchbuffer_reset_and_clear_render_cache(struct
> brw_context *brw)
> brw_cache_sets_clear(brw);
> }
>
> +/**
> + * Called when starting a new batch buffer.
> + */
> +static void
> +brw_new_batch(struct brw_context *brw)
> +{
> + /* Unreference any BOs held by the previous batch, and reset counts. */
> + for (int i = 0; i < brw->batch.exec_count; i++) {
> + brw_bo_unreference(brw->batch.exec_bos[i]);
> + brw->batch.exec_bos[i] = NULL;
> + }
> + brw->batch.batch_relocs.reloc_count = 0;
> + brw->batch.state_relocs.reloc_count = 0;
> + brw->batch.exec_count = 0;
> + brw->batch.aperture_space = 0;
> +
> + brw_bo_unreference(brw->batch.state.bo);
> +
> + /* Create a new batchbuffer and reset the associated state: */
> + intel_batchbuffer_reset_and_clear_render_cache(brw);
> +
> + /* 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->hw_ctx == 0) {
> + brw->ctx.NewDriverState |= BRW_NEW_CONTEXT;
> + brw_upload_invariant_state(brw);
> + }
> +
> + brw->ctx.NewDriverState |= BRW_NEW_BATCH;
> +
> + brw->ib.index_size = -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);
> +}
> +
> void
> intel_batchbuffer_save_state(struct brw_context *brw)
> {
> @@ -311,6 +356,19 @@ intel_batchbuffer_reset_to_saved(struct brw_context
> *brw)
> brw->batch.exec_count = brw->batch.saved.exec_count;
>
> brw->batch.map_next = brw->batch.saved.map_next;
> + if (USED_BATCH(brw->batch) == 0)
> + {
> + /**
> + * The 'intel_batchbuffer_flush' function will not call
> + * the 'brw_new_batch' function when the USED_BATCH returns 0.
> + * It may leads to the few following issue:
> + * The 'aperture_space' field can be overflown
> + * The 'statebuffer' buffer contains the big unused space
> + * The STATE_BASE_ADDRESS message is missed
> + * etc
> + **/
> + brw_new_batch(brw);
> + }
> }
>
> void
> @@ -529,50 +587,6 @@ intel_batchbuffer_require_space(struct brw_context
> *brw, GLuint sz)
> }
> }
>
> -/**
> - * Called when starting a new batch buffer.
> - */
> -static void
> -brw_new_batch(struct brw_context *brw)
> -{
> - /* Unreference any BOs held by the previous batch, and reset counts. */
> - for (int i = 0; i < brw->batch.exec_count; i++) {
> - brw_bo_unreference(brw->batch.exec_bos[i]);
> - brw->batch.exec_bos[i] = NULL;
> - }
> - brw->batch.batch_relocs.reloc_count = 0;
> - brw->batch.state_relocs.reloc_count = 0;
> - brw->batch.exec_count = 0;
> - brw->batch.aperture_space = 0;
> -
> - brw_bo_unreference(brw->batch.state.bo);
> -
> - /* Create a new batchbuffer and reset the associated state: */
> - intel_batchbuffer_reset_and_clear_render_cache(brw);
> -
> - /* 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->hw_ctx == 0) {
> - brw->ctx.NewDriverState |= BRW_NEW_CONTEXT;
> - brw_upload_invariant_state(brw);
> - }
> -
> - brw->ctx.NewDriverState |= BRW_NEW_BATCH;
> -
> - brw->ib.index_size = -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
> --
> 2.7.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180821/026d0c3e/attachment.html>
More information about the mesa-dev
mailing list