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

Kenneth Graunke kenneth at whitecape.org
Wed Nov 29 00:13:16 UTC 2017


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) {
       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);
-- 
2.15.0



More information about the mesa-dev mailing list