i965: Allocate shadow batches to explicitly be the BO size.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 13 Apr 2018 22:35:56 +0000 (15:35 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 2 May 2018 16:26:55 +0000 (09:26 -0700)
This unfortunately makes it malloc/realloc on every new batch, rather
than once at startup.  But it ensures that the shadow buffer's size will
absolutely match the BO size.  Otherwise, as we tune BATCH_SZ/STATE_SZ
or bufmgr cache bucket sizes, we may get a BO size that's rounded up,
and fail to allocate the shadow buffer large enough.

This doesn't fix any bugs today, as BATCH_SZ/STATE_SZ are the size of
a cache bucket, but it's better to be safe than sorry.

Reported-by: James Xiong <james.xiong@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/mesa/drivers/dri/i965/intel_batchbuffer.c

index d745c2a31138e8e28f134c6a6fb39ef3631fed14..b511be374190a3ede864961808e6c7b99884881d 100644 (file)
@@ -107,15 +107,11 @@ intel_batchbuffer_init(struct brw_context *brw)
 
    batch->use_shadow_copy = !devinfo->has_llc;
 
-   if (batch->use_shadow_copy) {
-      batch->batch.map = malloc(BATCH_SZ);
-      batch->map_next = batch->batch.map;
-      batch->state.map = malloc(STATE_SZ);
-   }
-
    init_reloc_list(&batch->batch_relocs, 250);
    init_reloc_list(&batch->state_relocs, 250);
 
+   batch->batch.map = NULL;
+   batch->state.map = NULL;
    batch->exec_count = 0;
    batch->exec_array_size = 100;
    batch->exec_bos =
@@ -196,7 +192,9 @@ recreate_growing_buffer(struct brw_context *brw,
    grow->partial_bo_map = NULL;
    grow->partial_bytes = 0;
 
-   if (!batch->use_shadow_copy)
+   if (batch->use_shadow_copy)
+      grow->map = realloc(grow->map, grow->bo->size);
+   else
       grow->map = brw_bo_map(brw, grow->bo, MAP_READ | MAP_WRITE);
 }