Browse Source

pipebuffer: New callback to flush all temporary-held buffers.

Used mostly to aid debugging memory issues or to clean up resources when
the drivers are long lived.
tags/mesa_20090313
José Fonseca 17 years ago
parent
commit
1672e8e059

+ 11
- 3
src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c View File

@@ -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
};



+ 10
- 4
src/gallium/auxiliary/pipebuffer/pb_bufmgr.h View File

@@ -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.

+ 16
- 0
src/gallium/auxiliary/pipebuffer/pb_bufmgr_alt.c View File

@@ -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;

+ 8
- 3
src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c View File

@@ -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);

+ 11
- 0
src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c View File

@@ -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;

+ 14
- 0
src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c View File

@@ -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);

+ 9
- 1
src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c View File

@@ -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 */

+ 8
- 0
src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c View File

@@ -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);


+ 26
- 0
src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c View File

@@ -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;

Loading…
Cancel
Save