gallium: Aggregate all buffer allocation info into a single struct. Obey requested alignment.

This commit is contained in:
José Fonseca 2008-01-17 17:06:16 +09:00
parent ca01ed45e8
commit 65df024146
6 changed files with 52 additions and 21 deletions

View file

@ -53,6 +53,18 @@
struct pb_vtbl;
/**
* Buffer description.
*
* Used when allocating the buffer.
*/
struct pb_desc
{
unsigned alignment;
unsigned usage;
};
/**
* Base class for all pb_* buffers.
*/
@ -159,10 +171,8 @@ pb_user_buffer_create(void *data, unsigned bytes);
* hardware.
*/
struct pb_buffer *
pb_malloc_buffer_create( unsigned alignment,
unsigned usage,
unsigned size );
pb_malloc_buffer_create(size_t size,
const struct pb_desc *desc);
static INLINE struct pipe_buffer *

View file

@ -62,7 +62,7 @@ malloc_buffer(struct pb_buffer *buf)
static void
malloc_buffer_destroy(struct pb_buffer *buf)
{
FREE(malloc_buffer(buf)->data);
align_free(malloc_buffer(buf)->data);
FREE(buf);
}
@ -102,9 +102,8 @@ malloc_buffer_vtbl = {
struct pb_buffer *
pb_malloc_buffer_create( unsigned alignment,
unsigned usage,
unsigned size )
pb_malloc_buffer_create(size_t size,
const struct pb_desc *desc)
{
struct malloc_buffer *buf;
@ -116,11 +115,11 @@ pb_malloc_buffer_create( unsigned alignment,
return NULL;
buf->base.vtbl = &malloc_buffer_vtbl;
buf->base.base.alignment = alignment;
buf->base.base.usage = usage;
buf->base.base.alignment = desc->alignment;
buf->base.base.usage = desc->usage;
buf->base.base.size = size;
buf->data = MALLOC(size);
buf->data = align_malloc(size, desc->alignment < sizeof(void*) ? sizeof(void*) : desc->alignment);
if(!buf->data) {
FREE(buf);
return NULL;

View file

@ -53,6 +53,7 @@
#include <stddef.h>
struct pb_desc;
struct pipe_buffer;
struct pipe_winsys;
@ -65,7 +66,8 @@ struct pb_manager
/* XXX: we will likely need more allocation flags */
struct pb_buffer *
(*create_buffer)( struct pb_manager *mgr,
size_t size );
size_t size,
const struct pb_desc *desc);
void
(*destroy)( struct pb_manager *mgr );
@ -82,7 +84,8 @@ struct pb_manager
*/
struct pb_manager *
pool_bufmgr_create(struct pb_manager *provider,
size_t n, size_t size);
size_t n, size_t size,
const struct pb_desc *desc);
/**

View file

@ -63,7 +63,9 @@ fenced_pb_manager(struct pb_manager *mgr)
static struct pb_buffer *
fenced_bufmgr_create_buffer(struct pb_manager *mgr, size_t size)
fenced_bufmgr_create_buffer(struct pb_manager *mgr,
size_t size,
const struct pb_desc *desc)
{
struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr);
struct pb_buffer *buf;
@ -72,12 +74,12 @@ fenced_bufmgr_create_buffer(struct pb_manager *mgr, size_t size)
/* check for free buffers before allocating new ones */
fenced_buffer_list_check_free(fenced_mgr->fenced_list, 0);
buf = fenced_mgr->provider->create_buffer(fenced_mgr->provider, size);
buf = fenced_mgr->provider->create_buffer(fenced_mgr->provider, size, desc);
if(!buf) {
/* try harder to get a buffer */
fenced_buffer_list_check_free(fenced_mgr->fenced_list, 1);
buf = fenced_mgr->provider->create_buffer(fenced_mgr->provider, size);
buf = fenced_mgr->provider->create_buffer(fenced_mgr->provider, size, desc);
if(!buf) {
/* give up */
return NULL;

View file

@ -447,11 +447,17 @@ mm_buffer_vtbl = {
static struct pb_buffer *
mm_bufmgr_create_buffer(struct pb_manager *mgr,
size_t size)
size_t size,
const struct pb_desc *desc)
{
struct mm_pb_manager *mm = mm_pb_manager(mgr);
struct mm_buffer *mm_buf;
/* We don't handle alignments larger then the one initially setup */
assert(desc->alignment % (1 << mm->align2) == 0);
if(desc->alignment % (1 << mm->align2))
return NULL;
_glthread_LOCK_MUTEX(mm->mutex);
mm_buf = CALLOC_STRUCT(mm_buffer);
@ -559,10 +565,15 @@ mm_bufmgr_create(struct pb_manager *provider,
{
struct pb_buffer *buffer;
struct pb_manager *mgr;
struct pb_desc desc;
assert(provider);
assert(provider->create_buffer);
buffer = provider->create_buffer(provider, size);
memset(&desc, 0, sizeof(desc));
desc.alignment = 1 << align2;
buffer = provider->create_buffer(provider, size, &desc);
if (!buffer)
return NULL;

View file

@ -62,6 +62,7 @@ struct pool_pb_manager
_glthread_Mutex mutex;
size_t bufSize;
size_t bufAlign;
size_t numFree;
size_t numTot;
@ -160,13 +161,16 @@ pool_buffer_vtbl = {
static struct pb_buffer *
pool_bufmgr_create_buffer(struct pb_manager *mgr, size_t size)
pool_bufmgr_create_buffer(struct pb_manager *mgr,
size_t size,
const struct pb_desc *desc)
{
struct pool_pb_manager *pool = pool_pb_manager(mgr);
struct pool_buffer *pool_buf;
struct list_head *item;
assert(size == pool->bufSize);
assert(desc->alignment % pool->bufAlign == 0);
_glthread_LOCK_MUTEX(pool->mutex);
@ -213,7 +217,8 @@ pool_bufmgr_destroy(struct pb_manager *mgr)
struct pb_manager *
pool_bufmgr_create(struct pb_manager *provider,
size_t numBufs,
size_t bufSize)
size_t bufSize,
const struct pb_desc *desc)
{
struct pool_pb_manager *pool;
struct pool_buffer *pool_buf;
@ -231,10 +236,11 @@ pool_bufmgr_create(struct pb_manager *provider,
pool->numTot = numBufs;
pool->numFree = numBufs;
pool->bufSize = bufSize;
pool->bufAlign = desc->alignment;
_glthread_INIT_MUTEX(pool->mutex);
pool->buffer = provider->create_buffer(provider, numBufs*bufSize);
pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc);
if (!pool->buffer)
goto failure;