mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 07:28:42 +02:00
[libdrm/intel] Eliminate extra dri_gem_bo_bucket_entry structure
Place the buffer reuse links right into the dri_bo_gem object.
This commit is contained in:
parent
5a55b48a41
commit
329e086225
1 changed files with 14 additions and 28 deletions
|
|
@ -57,14 +57,8 @@
|
|||
|
||||
typedef struct _dri_bo_gem dri_bo_gem;
|
||||
|
||||
struct dri_gem_bo_bucket_entry {
|
||||
dri_bo_gem *bo_gem;
|
||||
struct dri_gem_bo_bucket_entry *next;
|
||||
};
|
||||
|
||||
struct dri_gem_bo_bucket {
|
||||
struct dri_gem_bo_bucket_entry *head;
|
||||
struct dri_gem_bo_bucket_entry **tail;
|
||||
dri_bo_gem *head, **tail;
|
||||
/**
|
||||
* Limit on the number of entries in this bucket.
|
||||
*
|
||||
|
|
@ -129,6 +123,9 @@ struct _dri_bo_gem {
|
|||
int reloc_count;
|
||||
/** Mapped address for the buffer */
|
||||
void *virtual;
|
||||
|
||||
/** free list */
|
||||
dri_bo_gem *next;
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
@ -285,22 +282,19 @@ dri_gem_bo_alloc(dri_bufmgr *bufmgr, const char *name,
|
|||
|
||||
/* Get a buffer out of the cache if available */
|
||||
if (bucket != NULL && bucket->num_entries > 0) {
|
||||
struct dri_gem_bo_bucket_entry *entry = bucket->head;
|
||||
struct drm_i915_gem_busy busy;
|
||||
|
||||
bo_gem = entry->bo_gem;
|
||||
bo_gem = bucket->head;
|
||||
busy.handle = bo_gem->gem_handle;
|
||||
|
||||
ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_BUSY, &busy);
|
||||
alloc_from_cache = (ret == 0 && busy.busy == 0);
|
||||
|
||||
if (alloc_from_cache) {
|
||||
bucket->head = entry->next;
|
||||
if (entry->next == NULL)
|
||||
bucket->head = bo_gem->next;
|
||||
if (bo_gem->next == NULL)
|
||||
bucket->tail = &bucket->head;
|
||||
bucket->num_entries--;
|
||||
|
||||
free(entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -417,20 +411,15 @@ dri_gem_bo_unreference(dri_bo *bo)
|
|||
(bucket->max_entries > 0 &&
|
||||
bucket->num_entries < bucket->max_entries)))
|
||||
{
|
||||
struct dri_gem_bo_bucket_entry *entry;
|
||||
|
||||
bo_gem->name = 0;
|
||||
bo_gem->validate_index = -1;
|
||||
bo_gem->relocs = NULL;
|
||||
bo_gem->reloc_target_bo = NULL;
|
||||
bo_gem->reloc_count = 0;
|
||||
|
||||
entry = calloc(1, sizeof(*entry));
|
||||
entry->bo_gem = bo_gem;
|
||||
|
||||
entry->next = NULL;
|
||||
*bucket->tail = entry;
|
||||
bucket->tail = &entry->next;
|
||||
bo_gem->next = NULL;
|
||||
*bucket->tail = bo_gem;
|
||||
bucket->tail = &bo_gem->next;
|
||||
bucket->num_entries++;
|
||||
} else {
|
||||
struct drm_gem_close close;
|
||||
|
|
@ -599,19 +588,17 @@ dri_bufmgr_gem_destroy(dri_bufmgr *bufmgr)
|
|||
/* Free any cached buffer objects we were going to reuse */
|
||||
for (i = 0; i < INTEL_GEM_BO_BUCKETS; i++) {
|
||||
struct dri_gem_bo_bucket *bucket = &bufmgr_gem->cache_bucket[i];
|
||||
struct dri_gem_bo_bucket_entry *entry;
|
||||
dri_bo_gem *bo_gem;
|
||||
|
||||
while ((entry = bucket->head) != NULL) {
|
||||
while ((bo_gem = bucket->head) != NULL) {
|
||||
struct drm_gem_close close;
|
||||
dri_bo_gem *bo_gem;
|
||||
int ret;
|
||||
|
||||
bucket->head = entry->next;
|
||||
if (entry->next == NULL)
|
||||
bucket->head = bo_gem->next;
|
||||
if (bo_gem->next == NULL)
|
||||
bucket->tail = &bucket->head;
|
||||
bucket->num_entries--;
|
||||
|
||||
bo_gem = entry->bo_gem;
|
||||
if (bo_gem->mapped)
|
||||
munmap (bo_gem->virtual, bo_gem->bo.size);
|
||||
|
||||
|
|
@ -624,7 +611,6 @@ dri_bufmgr_gem_destroy(dri_bufmgr *bufmgr)
|
|||
}
|
||||
|
||||
free(bo_gem);
|
||||
free(entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue