[Mesa-dev] [PATCH 1/6] i965: Don't grow batch/state buffer on every emit after an overflow.

Ian Romanick idr at freedesktop.org
Wed Nov 29 02:15:59 UTC 2017


On 11/28/2017 04:13 PM, Kenneth Graunke wrote:
> Once we reach the intended size of the buffer (BATCH_SZ or STATE_SZ), we
> try and flush.  If we're not allowed to flush, we resort to growing the
> buffer so that there's space for the data we need to emit.
> 
> We accidentally got the threshold wrong.  The first non-wrappable call
> beyond (e.g.) STATE_SZ would grow the buffer to floor(1.5 * STATE_SZ),
> The next call would see we were beyond STATE_SZ and think we needed to
> grow a second time - when the buffer was already large enough.
> 
> We still want to flush when we hit STATE_SZ, but for growing, we should
> use the actual size of the buffer as the threshold.  This way, we only
> grow when actually necessary.
> 
> Fixes: 2dfc119f22f257082ab0 "i965: Grow the batch/state buffers if we need space and can't flush."
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103101
> ---
>  src/mesa/drivers/dri/i965/intel_batchbuffer.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> index 216073129ba..1d0292b4b80 100644
> --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
> @@ -373,7 +373,7 @@ intel_batchbuffer_require_space(struct brw_context *brw, GLuint sz,
>     if (batch_used + sz >= BATCH_SZ) {

Why not just change this test to >= batch->bo->size?

>        if (!batch->no_wrap) {
>           intel_batchbuffer_flush(brw);
> -      } else {
> +      } else if (batch_used + sz >= batch->bo->size) {
>           const unsigned new_size =
>              MIN2(batch->bo->size + batch->bo->size / 2, MAX_BATCH_SIZE);
>           grow_buffer(brw, &batch->bo, &batch->map, &batch->batch_cpu_map,
> @@ -1075,7 +1075,7 @@ brw_state_batch(struct brw_context *brw,
>        if (!batch->no_wrap) {
>           intel_batchbuffer_flush(brw);
>           offset = ALIGN(batch->state_used, alignment);
> -      } else {
> +      } else if (offset + size >= batch->state_bo->size) {
>           const unsigned new_size =
>              MIN2(batch->state_bo->size + batch->state_bo->size / 2,
>                   MAX_STATE_SIZE);
> 



More information about the mesa-dev mailing list