summaryrefslogtreecommitdiff
path: root/src/drm
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-11-07 14:37:05 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2010-11-07 14:37:05 +0000
commit5f2e647dcf94eefd233c84881987b3dead2fbd85 (patch)
treeb2c0a816c36198b9532d0d31c479a7e9076e529d /src/drm
parentb4e55b84e20999e410d0ba04ebb83b81c21c8447 (diff)
drm/intel: Drop the bo cache.
As this remains experimental, rely on the highly experimental kernel caching...
Diffstat (limited to 'src/drm')
-rw-r--r--src/drm/cairo-drm-intel-private.h10
-rw-r--r--src/drm/cairo-drm-intel.c210
2 files changed, 3 insertions, 217 deletions
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index aaba13d1..7fe3623d 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -67,7 +67,6 @@ typedef struct _intel_bo {
uint32_t full_size;
uint16_t stride;
uint16_t _stride;
- uint32_t bucket :4;
uint32_t tiling :4;
uint32_t _tiling :4;
uint32_t purgeable :1;
@@ -191,16 +190,7 @@ typedef struct _intel_device {
size_t gtt_max_size;
size_t gtt_avail_size;
- cairo_mutex_t bo_mutex;
cairo_freepool_t bo_pool;
- struct _intel_bo_cache {
- cairo_list_t list;
- uint16_t min_entries;
- uint16_t num_entries;
- } bo_cache[INTEL_BO_CACHE_BUCKETS];
- size_t bo_cache_size;
- size_t bo_max_cache_size_high;
- size_t bo_max_cache_size_low;
cairo_list_t bo_in_flight;
cairo_mutex_t mutex;
diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c
index ab139d59..d45155eb 100644
--- a/src/drm/cairo-drm-intel.c
+++ b/src/drm/cairo-drm-intel.c
@@ -286,21 +286,6 @@ pot (int v)
return v;
}
-static void
-intel_bo_cache_remove (intel_device_t *device,
- intel_bo_t *bo,
- int bucket)
-{
- _cairo_drm_bo_close (&device->base, &bo->base);
-
- cairo_list_del (&bo->cache_list);
-
- device->bo_cache[bucket].num_entries--;
- device->bo_cache_size -= 4096 * (1 << bucket);
-
- _cairo_freepool_free (&device->bo_pool, bo);
-}
-
cairo_bool_t
intel_bo_madvise (intel_device_t *device,
intel_bo_t *bo,
@@ -345,25 +330,6 @@ intel_bo_set_real_size (intel_device_t *device,
}
}
-static void
-intel_bo_cache_purge (intel_device_t *device)
-{
- int bucket;
-
- for (bucket = 0; bucket < INTEL_BO_CACHE_BUCKETS; bucket++) {
- intel_bo_t *bo, *next;
-
- cairo_list_foreach_entry_safe (bo, next,
- intel_bo_t,
- &device->bo_cache[bucket].list,
- cache_list)
- {
- if (! intel_bo_madvise (device, bo, I915_MADV_DONTNEED))
- intel_bo_cache_remove (device, bo, bucket);
- }
- }
-}
-
intel_bo_t *
intel_bo_create (intel_device_t *device,
uint32_t max_size,
@@ -418,98 +384,10 @@ intel_bo_create (intel_device_t *device,
}
}
- bo = NULL;
-
- CAIRO_MUTEX_LOCK (device->bo_mutex);
- if (bucket < INTEL_BO_CACHE_BUCKETS) {
- int loop = MIN (3, INTEL_BO_CACHE_BUCKETS - bucket);
- /* Our goal is to avoid clflush which occur on CPU->GPU
- * transitions, so we want to minimise reusing CPU
- * write buffers. However, by the time a buffer is freed
- * it is most likely in the GPU domain anyway (readback is rare!).
- */
- do {
- if (gpu_target) {
- intel_bo_t *next;
-
- cairo_list_foreach_entry_reverse_safe (bo, next,
- intel_bo_t,
- &device->bo_cache[bucket].list,
- cache_list)
- {
- if (real_size > bo->base.size)
- continue;
-
- /* For a gpu target, by the time our batch fires, the
- * GPU will have finished using this buffer. However,
- * changing tiling may require a fence deallocation and
- * cause serialisation...
- */
-
- if (tiling && bo->_tiling &&
- (bo->_tiling != tiling || bo->_stride != stride))
- {
- continue;
- }
-
- device->bo_cache[bucket].num_entries--;
- device->bo_cache_size -= 4096 * (1 << bucket);
- cairo_list_del (&bo->cache_list);
-
- if (! intel_bo_madvise (device, bo, I915_MADV_WILLNEED)) {
- _cairo_drm_bo_close (&device->base, &bo->base);
- _cairo_freepool_free (&device->bo_pool, bo);
- } else
- goto INIT;
- }
- }
-
- while (! cairo_list_is_empty (&device->bo_cache[bucket].list)) {
- bo = cairo_list_first_entry (&device->bo_cache[bucket].list,
- intel_bo_t, cache_list);
- if (intel_bo_is_inactive (device, bo)) {
- device->bo_cache[bucket].num_entries--;
- device->bo_cache_size -= 4096 * (1 << bucket);
- cairo_list_del (&bo->cache_list);
-
- if (! intel_bo_madvise (device, bo, I915_MADV_WILLNEED)) {
- _cairo_drm_bo_close (&device->base, &bo->base);
- _cairo_freepool_free (&device->bo_pool, bo);
- } else
- goto SIZE;
- } else
- break;
- }
- } while (--loop && ++bucket);
- }
-
- if (device->bo_cache_size > device->bo_max_cache_size_high) {
- cairo_bool_t not_empty;
-
- intel_bo_cache_purge (device);
-
- /* trim caches by discarding the most recent buffer in each bucket */
- do {
- not_empty = FALSE;
- for (bucket = INTEL_BO_CACHE_BUCKETS; bucket--; ) {
- if (device->bo_cache[bucket].num_entries >
- device->bo_cache[bucket].min_entries)
- {
- bo = cairo_list_last_entry (&device->bo_cache[bucket].list,
- intel_bo_t, cache_list);
-
- intel_bo_cache_remove (device, bo, bucket);
- not_empty = TRUE;
- }
- }
- } while (not_empty && device->bo_cache_size > device->bo_max_cache_size_low);
- }
-
/* no cached buffer available, allocate fresh */
bo = _cairo_freepool_alloc (&device->bo_pool);
if (unlikely (bo == NULL)) {
_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
return bo;
}
@@ -521,10 +399,6 @@ intel_bo_create (intel_device_t *device,
bo->virtual = NULL;
bo->cpu = TRUE;
- bucket = ffs (cache_size / 4096) - 1;
- if (bucket > INTEL_BO_CACHE_BUCKETS)
- bucket = INTEL_BO_CACHE_BUCKETS;
- bo->bucket = bucket;
bo->_tiling = I915_TILING_NONE;
bo->_stride = 0;
bo->purgeable = 0;
@@ -544,18 +418,14 @@ intel_bo_create (intel_device_t *device,
if (unlikely (ret != 0)) {
_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
_cairo_freepool_free (&device->bo_pool, bo);
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
return NULL;
}
bo->base.handle = create.handle;
bo->full_size = bo->base.size = create.size;
-SIZE:
intel_bo_set_real_size (device, bo, real_size);
-INIT:
CAIRO_REFERENCE_COUNT_INIT (&bo->base.ref_count, 1);
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
DONE:
bo->tiling = tiling;
bo->stride = stride;
@@ -570,9 +440,7 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
intel_bo_t *bo;
int ret;
- CAIRO_MUTEX_LOCK (device->bo_mutex);
bo = _cairo_freepool_alloc (&device->bo_pool);
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
if (unlikely (bo == NULL)) {
_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
return NULL;
@@ -591,7 +459,6 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
bo->purgeable = 0;
bo->busy = TRUE;
bo->cpu = FALSE;
- bo->bucket = INTEL_BO_CACHE_BUCKETS;
bo->opaque0 = 0;
bo->opaque1 = 0;
@@ -617,9 +484,7 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
return bo;
FAIL:
- CAIRO_MUTEX_LOCK (device->bo_mutex);
_cairo_freepool_free (&device->bo_pool, bo);
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
return NULL;
}
@@ -628,7 +493,6 @@ intel_bo_release (void *_dev, void *_bo)
{
intel_device_t *device = _dev;
intel_bo_t *bo = _bo;
- int bucket;
if (bo->virtual != NULL)
intel_bo_unmap (bo);
@@ -636,27 +500,8 @@ intel_bo_release (void *_dev, void *_bo)
assert (bo->exec == NULL);
assert (cairo_list_is_empty (&bo->cache_list));
- bucket = bo->bucket;
-
- CAIRO_MUTEX_LOCK (device->bo_mutex);
- if (bo->base.name == 0 &&
- bucket < INTEL_BO_CACHE_BUCKETS &&
- intel_bo_madvise (device, bo, I915_MADV_DONTNEED))
- {
- device->bo_cache[bucket].num_entries++;
- device->bo_cache_size += 4096 * (1 << bucket);
-
- if (bo->busy)
- cairo_list_add_tail (&bo->cache_list, &device->bo_cache[bucket].list);
- else
- cairo_list_add (&bo->cache_list, &device->bo_cache[bucket].list);
- }
- else
- {
- _cairo_drm_bo_close (&device->base, &bo->base);
- _cairo_freepool_free (&device->bo_pool, bo);
- }
- CAIRO_MUTEX_UNLOCK (device->bo_mutex);
+ _cairo_drm_bo_close (&device->base, &bo->base);
+ _cairo_freepool_free (&device->bo_pool, bo);
}
void
@@ -869,36 +714,6 @@ intel_bo_put_image (intel_device_t *device,
return CAIRO_STATUS_SUCCESS;
}
-static void
-_intel_device_init_bo_cache (intel_device_t *device)
-{
- int i;
-
- CAIRO_MUTEX_INIT (device->bo_mutex);
- device->bo_cache_size = 0;
- device->bo_max_cache_size_high = device->gtt_max_size / 2;
- device->bo_max_cache_size_low = device->gtt_max_size / 4;
- cairo_list_init (&device->bo_in_flight);
-
- for (i = 0; i < INTEL_BO_CACHE_BUCKETS; i++) {
- struct _intel_bo_cache *cache = &device->bo_cache[i];
-
- cairo_list_init (&cache->list);
-
- /* 256*4k ... 4*16MiB */
- if (i <= 6)
- cache->min_entries = 1 << (6 - i);
- else
- cache->min_entries = 0;
- cache->num_entries = 0;
- }
-
- _cairo_freepool_init (&device->bo_pool, sizeof (intel_bo_t));
-
- device->base.surface.flink = _cairo_drm_surface_flink;
- device->base.surface.map_to_image = intel_surface_map_to_image;
-}
-
static cairo_bool_t
_intel_snapshot_cache_entry_can_remove (const void *closure)
{
@@ -934,8 +749,6 @@ intel_device_init (intel_device_t *device, int fd)
device->gtt_avail_size = aperture.aper_available_size;
device->gtt_avail_size -= device->gtt_avail_size >> 5;
- _intel_device_init_bo_cache (device);
-
size = aperture.aper_size / 8;
device->snapshot_cache_max_size = size / 4;
status = _cairo_cache_init (&device->snapshot_cache,
@@ -960,23 +773,6 @@ intel_device_init (intel_device_t *device, int fd)
}
static void
-_intel_bo_cache_fini (intel_device_t *device)
-{
- int bucket;
-
- for (bucket = 0; bucket < INTEL_BO_CACHE_BUCKETS; bucket++) {
- struct _intel_bo_cache *cache = &device->bo_cache[bucket];
- intel_bo_t *bo;
-
- cairo_list_foreach_entry (bo, intel_bo_t, &cache->list, cache_list)
- _cairo_drm_bo_close (&device->base, &bo->base);
- }
-
- _cairo_freepool_fini (&device->bo_pool);
- CAIRO_MUTEX_FINI (device->bo_mutex);
-}
-
-static void
_intel_gradient_cache_fini (intel_device_t *device)
{
unsigned int n;
@@ -1020,7 +816,7 @@ intel_device_fini (intel_device_t *device)
_cairo_cache_fini (&device->snapshot_cache);
_intel_gradient_cache_fini (device);
- _intel_bo_cache_fini (device);
+ _cairo_freepool_fini (&device->bo_pool);
_cairo_drm_device_fini (&device->base);
}