winsys/radeon: don't pre-allocate the relocations array
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 9 Sep 2016 16:50:34 +0000 (18:50 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 12 Sep 2016 11:55:53 +0000 (13:55 +0200)
It's really not necessary. Switch to an exponential resizing strategy.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/winsys/radeon/drm/radeon_drm_cs.c

index 9de00c23f4ffc184bda27bf93170d8211dae2f78..4f2501ef505796a4c6d84f6f4bf9554709130495 100644 (file)
@@ -98,19 +98,6 @@ static bool radeon_init_cs_context(struct radeon_cs_context *csc,
     int i;
 
     csc->fd = ws->fd;
-    csc->nrelocs = 512;
-    csc->relocs_bo = (struct radeon_bo_item*)
-                     CALLOC(1, csc->nrelocs * sizeof(csc->relocs_bo[0]));
-    if (!csc->relocs_bo) {
-        return false;
-    }
-
-    csc->relocs = (struct drm_radeon_cs_reloc*)
-                  CALLOC(1, csc->nrelocs * sizeof(struct drm_radeon_cs_reloc));
-    if (!csc->relocs) {
-        FREE(csc->relocs_bo);
-        return false;
-    }
 
     csc->chunks[0].chunk_id = RADEON_CHUNK_ID_IB;
     csc->chunks[0].length_dw = 0;
@@ -285,7 +272,7 @@ static unsigned radeon_add_buffer(struct radeon_drm_cs *cs,
     /* New relocation, check if the backing array is large enough. */
     if (csc->crelocs >= csc->nrelocs) {
         uint32_t size;
-        csc->nrelocs += 10;
+        csc->nrelocs = MAX2(csc->nrelocs + 16, (unsigned)(csc->nrelocs * 1.3));
 
         size = csc->nrelocs * sizeof(csc->relocs_bo[0]);
         csc->relocs_bo = realloc(csc->relocs_bo, size);