Used mostly to aid debugging memory issues or to clean up resources when the drivers are long lived.tags/mesa_20090313
@@ -129,7 +129,7 @@ pb_malloc_buffer_create(size_t size, | |||
static struct pb_buffer * | |||
pb_malloc_buffer_create_buffer(struct pb_manager *mgr, | |||
pb_malloc_bufmgr_create_buffer(struct pb_manager *mgr, | |||
size_t size, | |||
const struct pb_desc *desc) | |||
{ | |||
@@ -137,6 +137,13 @@ pb_malloc_buffer_create_buffer(struct pb_manager *mgr, | |||
} | |||
static void | |||
pb_malloc_bufmgr_flush(struct pb_manager *mgr) | |||
{ | |||
/* No-op */ | |||
} | |||
static void | |||
pb_malloc_bufmgr_destroy(struct pb_manager *mgr) | |||
{ | |||
@@ -146,8 +153,9 @@ pb_malloc_bufmgr_destroy(struct pb_manager *mgr) | |||
static struct pb_manager | |||
pb_malloc_bufmgr = { | |||
pb_malloc_buffer_create_buffer, | |||
pb_malloc_bufmgr_destroy | |||
pb_malloc_bufmgr_destroy, | |||
pb_malloc_bufmgr_create_buffer, | |||
pb_malloc_bufmgr_flush | |||
}; | |||
@@ -69,13 +69,22 @@ struct pipe_winsys; | |||
*/ | |||
struct pb_manager | |||
{ | |||
void | |||
(*destroy)( struct pb_manager *mgr ); | |||
struct pb_buffer * | |||
(*create_buffer)( struct pb_manager *mgr, | |||
size_t size, | |||
const struct pb_desc *desc); | |||
/** | |||
* Flush all temporary-held buffers. | |||
* | |||
* Used mostly to aid debugging memory issues or to clean up resources when | |||
* the drivers are long lived. | |||
*/ | |||
void | |||
(*destroy)( struct pb_manager *mgr ); | |||
(*flush)( struct pb_manager *mgr ); | |||
}; | |||
@@ -153,9 +162,6 @@ struct pb_manager * | |||
pb_cache_manager_create(struct pb_manager *provider, | |||
unsigned usecs); | |||
void | |||
pb_cache_flush(struct pb_manager *mgr); | |||
/** | |||
* Fenced buffer manager. |
@@ -75,6 +75,21 @@ pb_alt_manager_create_buffer(struct pb_manager *_mgr, | |||
} | |||
static void | |||
pb_alt_manager_flush(struct pb_manager *_mgr) | |||
{ | |||
struct pb_alt_manager *mgr = pb_alt_manager(_mgr); | |||
assert(mgr->provider1->flush); | |||
if(mgr->provider1->flush) | |||
mgr->provider1->flush(mgr->provider1); | |||
assert(mgr->provider2->flush); | |||
if(mgr->provider2->flush) | |||
mgr->provider2->flush(mgr->provider2); | |||
} | |||
static void | |||
pb_alt_manager_destroy(struct pb_manager *mgr) | |||
{ | |||
@@ -97,6 +112,7 @@ pb_alt_manager_create(struct pb_manager *provider1, | |||
mgr->base.destroy = pb_alt_manager_destroy; | |||
mgr->base.create_buffer = pb_alt_manager_create_buffer; | |||
mgr->base.flush = pb_alt_manager_flush; | |||
mgr->provider1 = provider1; | |||
mgr->provider2 = provider2; | |||
@@ -306,8 +306,8 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr, | |||
} | |||
void | |||
pb_cache_flush(struct pb_manager *_mgr) | |||
static void | |||
pb_cache_manager_flush(struct pb_manager *_mgr) | |||
{ | |||
struct pb_cache_manager *mgr = pb_cache_manager(_mgr); | |||
struct list_head *curr, *next; | |||
@@ -323,13 +323,17 @@ pb_cache_flush(struct pb_manager *_mgr) | |||
next = curr->next; | |||
} | |||
pipe_mutex_unlock(mgr->mutex); | |||
assert(mgr->provider->flush); | |||
if(mgr->provider->flush) | |||
mgr->provider->flush(mgr->provider); | |||
} | |||
static void | |||
pb_cache_manager_destroy(struct pb_manager *mgr) | |||
{ | |||
pb_cache_flush(mgr); | |||
pb_cache_manager_flush(mgr); | |||
FREE(mgr); | |||
} | |||
@@ -349,6 +353,7 @@ pb_cache_manager_create(struct pb_manager *provider, | |||
mgr->base.destroy = pb_cache_manager_destroy; | |||
mgr->base.create_buffer = pb_cache_manager_create_buffer; | |||
mgr->base.flush = pb_cache_manager_flush; | |||
mgr->provider = provider; | |||
mgr->usecs = usecs; | |||
LIST_INITHEAD(&mgr->delayed); |
@@ -313,6 +313,16 @@ pb_debug_manager_create_buffer(struct pb_manager *_mgr, | |||
} | |||
static void | |||
pb_debug_manager_flush(struct pb_manager *_mgr) | |||
{ | |||
struct pb_debug_manager *mgr = pb_debug_manager(_mgr); | |||
assert(mgr->provider->flush); | |||
if(mgr->provider->flush) | |||
mgr->provider->flush(mgr->provider); | |||
} | |||
static void | |||
pb_debug_manager_destroy(struct pb_manager *_mgr) | |||
{ | |||
@@ -336,6 +346,7 @@ pb_debug_manager_create(struct pb_manager *provider, size_t band_size) | |||
mgr->base.destroy = pb_debug_manager_destroy; | |||
mgr->base.create_buffer = pb_debug_manager_create_buffer; | |||
mgr->base.flush = pb_debug_manager_flush; | |||
mgr->provider = provider; | |||
mgr->band_size = band_size; | |||
@@ -94,6 +94,19 @@ fenced_bufmgr_create_buffer(struct pb_manager *mgr, | |||
} | |||
static void | |||
fenced_bufmgr_flush(struct pb_manager *mgr) | |||
{ | |||
struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr); | |||
fenced_buffer_list_check_free(fenced_mgr->fenced_list, TRUE); | |||
assert(fenced_mgr->provider->flush); | |||
if(fenced_mgr->provider->flush) | |||
fenced_mgr->provider->flush(fenced_mgr->provider); | |||
} | |||
static void | |||
fenced_bufmgr_destroy(struct pb_manager *mgr) | |||
{ | |||
@@ -123,6 +136,7 @@ fenced_bufmgr_create(struct pb_manager *provider, | |||
fenced_mgr->base.destroy = fenced_bufmgr_destroy; | |||
fenced_mgr->base.create_buffer = fenced_bufmgr_create_buffer; | |||
fenced_mgr->base.flush = fenced_bufmgr_flush; | |||
fenced_mgr->provider = provider; | |||
fenced_mgr->fenced_list = fenced_buffer_list_create(winsys); |
@@ -199,6 +199,13 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr, | |||
} | |||
static void | |||
mm_bufmgr_flush(struct pb_manager *mgr) | |||
{ | |||
/* No-op */ | |||
} | |||
static void | |||
mm_bufmgr_destroy(struct pb_manager *mgr) | |||
{ | |||
@@ -230,8 +237,9 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer, | |||
if (!mm) | |||
return NULL; | |||
mm->base.create_buffer = mm_bufmgr_create_buffer; | |||
mm->base.destroy = mm_bufmgr_destroy; | |||
mm->base.create_buffer = mm_bufmgr_create_buffer; | |||
mm->base.flush = mm_bufmgr_flush; | |||
mm->size = size; | |||
mm->align2 = align2; /* 64-byte alignment */ |
@@ -202,6 +202,13 @@ pool_bufmgr_create_buffer(struct pb_manager *mgr, | |||
} | |||
static void | |||
pool_bufmgr_flush(struct pb_manager *mgr) | |||
{ | |||
/* No-op */ | |||
} | |||
static void | |||
pool_bufmgr_destroy(struct pb_manager *mgr) | |||
{ | |||
@@ -238,6 +245,7 @@ pool_bufmgr_create(struct pb_manager *provider, | |||
pool->base.destroy = pool_bufmgr_destroy; | |||
pool->base.create_buffer = pool_bufmgr_create_buffer; | |||
pool->base.flush = pool_bufmgr_flush; | |||
LIST_INITHEAD(&pool->free); | |||
@@ -406,6 +406,17 @@ pb_slab_manager_create_buffer(struct pb_manager *_mgr, | |||
} | |||
static void | |||
pb_slab_manager_flush(struct pb_manager *_mgr) | |||
{ | |||
struct pb_slab_manager *mgr = pb_slab_manager(_mgr); | |||
assert(mgr->provider->flush); | |||
if(mgr->provider->flush) | |||
mgr->provider->flush(mgr->provider); | |||
} | |||
static void | |||
pb_slab_manager_destroy(struct pb_manager *_mgr) | |||
{ | |||
@@ -430,6 +441,7 @@ pb_slab_manager_create(struct pb_manager *provider, | |||
mgr->base.destroy = pb_slab_manager_destroy; | |||
mgr->base.create_buffer = pb_slab_manager_create_buffer; | |||
mgr->base.flush = pb_slab_manager_flush; | |||
mgr->provider = provider; | |||
mgr->bufSize = bufSize; | |||
@@ -465,6 +477,19 @@ pb_slab_range_manager_create_buffer(struct pb_manager *_mgr, | |||
} | |||
static void | |||
pb_slab_range_manager_flush(struct pb_manager *_mgr) | |||
{ | |||
struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr); | |||
/* Individual slabs don't hold any temporary buffers so no need to call them */ | |||
assert(mgr->provider->flush); | |||
if(mgr->provider->flush) | |||
mgr->provider->flush(mgr->provider); | |||
} | |||
static void | |||
pb_slab_range_manager_destroy(struct pb_manager *_mgr) | |||
{ | |||
@@ -499,6 +524,7 @@ pb_slab_range_manager_create(struct pb_manager *provider, | |||
mgr->base.destroy = pb_slab_range_manager_destroy; | |||
mgr->base.create_buffer = pb_slab_range_manager_create_buffer; | |||
mgr->base.flush = pb_slab_range_manager_flush; | |||
mgr->provider = provider; | |||
mgr->minBufSize = minBufSize; |