From 8a6a8512d4ac6db5e85911de81f156d325dcc343 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 1 Jun 2016 15:37:52 -0400 Subject: [PATCH] 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 --- freedreno/freedreno_bo_cache.c | 17 ++++++++++++----- freedreno/freedreno_device.c | 2 +- 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);