Hi all,

Could somebody check it on CI to confirm that this patch do not add
regressions or maybe even take a look at this patch.

Regards,
Andrii.

On Mon, Aug 27, 2018 at 12:39 PM andrey simiklit <asimiklit.w...@gmail.com>
wrote:

> Hi all,
>
> It would be great if somebody look at this.
> I guess that this issue can affect every place where we use
> 'intel_batchbuffer_save_state/intel_batchbuffer_reset_to_saved' but only
> when the 'brw_batch_has_aperture_space' function returns false several
> times in a row.
> Pay attention that the last batch
> <https://bugs.freedesktop.org/attachment.cgi?id=141200> of log has an
> aperture with negative value "(-1023.8Mb aperture)".
> Please correct me if I am incorrect.
>
> Regards,
> Andrii.
> On Tue, Aug 21, 2018 at 3:00 PM andrey simiklit <asimiklit.w...@gmail.com>
> wrote:
>
>> 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.w...@gmail.com> wrote:
>>
>>> From: Andrii Simiklit <andrii.simik...@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.simik...@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
>>>
>>>
>>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to