diff options
author | Rob Clark <robclark@freedesktop.org> | 2016-06-01 15:37:52 -0400 |
---|---|---|
committer | Rob Clark <robclark@freedesktop.org> | 2016-07-20 19:42:21 -0400 |
commit | 8a6a8512d4ac6db5e85911de81f156d325dcc343 (patch) | |
tree | 6c3cfb3f88401516a6554e51e7c21226b66c857f | |
parent | 904f1361ae11d53ee4d0cf297d38f4c243ee8d69 (diff) |
freedreno: support either coarse or fine-grained bucket sizes
The normal bo cache uses some intermediate steps between power of two
jumps to reduce memory wastage. But for a ringbuffer bo cache, we do
not need this.
Signed-off-by: Rob Clark <robclark@freedesktop.org>
-rw-r--r-- | freedreno/freedreno_bo_cache.c | 17 | ||||
-rw-r--r-- | freedreno/freedreno_device.c | 2 | ||||
-rw-r--r-- | freedreno/freedreno_priv.h | 2 |
3 files changed, 14 insertions, 7 deletions
diff --git a/freedreno/freedreno_bo_cache.c b/freedreno/freedreno_bo_cache.c index 58d171eb..7becb0d6 100644 --- a/freedreno/freedreno_bo_cache.c +++ b/freedreno/freedreno_bo_cache.c @@ -49,8 +49,12 @@ add_bucket(struct fd_bo_cache *cache, int size) cache->num_buckets++; } +/** + * @coarse: if true, only power-of-two bucket sizes, otherwise + * fill in for a bit smoother size curve.. + */ drm_private void -fd_bo_cache_init(struct fd_bo_cache *cache) +fd_bo_cache_init(struct fd_bo_cache *cache, int course) { unsigned long size, cache_max_size = 64 * 1024 * 1024; @@ -64,14 +68,17 @@ fd_bo_cache_init(struct fd_bo_cache *cache) */ add_bucket(cache, 4096); add_bucket(cache, 4096 * 2); - add_bucket(cache, 4096 * 3); + if (!course) + add_bucket(cache, 4096 * 3); /* Initialize the linked lists for BO reuse cache. */ for (size = 4 * 4096; size <= cache_max_size; size *= 2) { add_bucket(cache, size); - add_bucket(cache, size + size * 1 / 4); - add_bucket(cache, size + size * 2 / 4); - add_bucket(cache, size + size * 3 / 4); + if (!course) { + add_bucket(cache, size + size * 1 / 4); + add_bucket(cache, size + size * 2 / 4); + add_bucket(cache, size + size * 3 / 4); + } } } diff --git a/freedreno/freedreno_device.c b/freedreno/freedreno_device.c index b99bce2f..fcbf1402 100644 --- a/freedreno/freedreno_device.c +++ b/freedreno/freedreno_device.c @@ -85,7 +85,7 @@ out: dev->fd = fd; dev->handle_table = drmHashCreate(); dev->name_table = drmHashCreate(); - fd_bo_cache_init(&dev->bo_cache); + fd_bo_cache_init(&dev->bo_cache, FALSE); return dev; } diff --git a/freedreno/freedreno_priv.h b/freedreno/freedreno_priv.h index 5e8f03d4..9737b322 100644 --- a/freedreno/freedreno_priv.h +++ b/freedreno/freedreno_priv.h @@ -104,7 +104,7 @@ struct fd_device { int closefd; /* call close(fd) upon destruction */ }; -drm_private void fd_bo_cache_init(struct fd_bo_cache *cache); +drm_private void fd_bo_cache_init(struct fd_bo_cache *cache, int coarse); drm_private void fd_bo_cache_cleanup(struct fd_bo_cache *cache, time_t time); drm_private struct fd_bo * fd_bo_cache_alloc(struct fd_bo_cache *cache, uint32_t *size, uint32_t flags); |