mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
gallium: Aggregate all buffer allocation info into a single struct. Obey requested alignment.
This commit is contained in:
parent
ca01ed45e8
commit
65df024146
6 changed files with 52 additions and 21 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue