summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2016-06-01 15:37:52 -0400
committerRob Clark <robclark@freedesktop.org>2016-07-20 19:42:21 -0400
commit8a6a8512d4ac6db5e85911de81f156d325dcc343 (patch)
tree6c3cfb3f88401516a6554e51e7c21226b66c857f
parent904f1361ae11d53ee4d0cf297d38f4c243ee8d69 (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.c17
-rw-r--r--freedreno/freedreno_device.c2
-rw-r--r--freedreno/freedreno_priv.h2
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);