Fullfill pipe_winsys->user_buffer_create. Aggregate winsys functions.
This commit is contained in:
@@ -5,13 +5,12 @@ include $(TOP)/configs/current
|
||||
LIBNAME = pipebuffer
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
pb_buffer.c \
|
||||
pb_buffer_client.c \
|
||||
pb_buffer_fenced.c \
|
||||
pb_buffer_malloc.c \
|
||||
pb_bufmgr_fenced.c \
|
||||
pb_bufmgr_mm.c \
|
||||
pb_bufmgr_pool.c
|
||||
pb_bufmgr_pool.c \
|
||||
pb_winsys.c
|
||||
|
||||
C_SOURCES = \
|
||||
$(DRIVER_SOURCES)
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Buffer implementation.
|
||||
*
|
||||
* \author José Fonseca <jrfonseca@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "pb_buffer.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
|
||||
|
||||
|
||||
static void *
|
||||
pb_winsys_map(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *ws_buf,
|
||||
unsigned flags)
|
||||
{
|
||||
struct pb_buffer *buf = pb_buffer(ws_buf);
|
||||
|
||||
return buf->vtbl->map(buf, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
pb_winsys_unmap(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *ws_buf)
|
||||
{
|
||||
struct pb_buffer *buf = pb_buffer(ws_buf);
|
||||
|
||||
buf->vtbl->unmap(buf);
|
||||
}
|
||||
|
||||
static void
|
||||
pb_winsys_destroy(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *ws_buf)
|
||||
{
|
||||
struct pb_buffer *buf = pb_buffer(ws_buf);
|
||||
|
||||
buf->vtbl->destroy(buf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
pb_init_winsys(struct pipe_winsys *winsys)
|
||||
{
|
||||
winsys->buffer_map = pb_winsys_map;
|
||||
winsys->buffer_unmap = pb_winsys_unmap;
|
||||
winsys->buffer_destroy = pb_winsys_destroy;
|
||||
}
|
||||
@@ -48,8 +48,9 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
#include "pipe/p_state.h"
|
||||
#include "pipe/p_inlines.h"
|
||||
|
||||
|
||||
struct pb_vtbl;
|
||||
|
||||
@@ -81,6 +82,7 @@ struct pb_buffer
|
||||
const struct pb_vtbl *vtbl;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Virtual function table for the buffer storage operations.
|
||||
*
|
||||
@@ -116,6 +118,24 @@ struct pb_vtbl
|
||||
};
|
||||
|
||||
|
||||
static INLINE struct pipe_buffer *
|
||||
pb_pipe_buffer( struct pb_buffer *pbuf )
|
||||
{
|
||||
assert(pbuf);
|
||||
return &pbuf->base;
|
||||
}
|
||||
|
||||
|
||||
static INLINE struct pb_buffer *
|
||||
pb_buffer( struct pipe_buffer *buf )
|
||||
{
|
||||
assert(buf);
|
||||
/* Could add a magic cookie check on debug builds.
|
||||
*/
|
||||
return (struct pb_buffer *)buf;
|
||||
}
|
||||
|
||||
|
||||
/* Accessor functions for pb->vtbl:
|
||||
*/
|
||||
static INLINE void *
|
||||
@@ -143,6 +163,7 @@ pb_get_base_buffer( struct pb_buffer *buf,
|
||||
buf->vtbl->get_base_buffer(buf, base_buf, offset);
|
||||
}
|
||||
|
||||
|
||||
static INLINE void
|
||||
pb_destroy(struct pb_buffer *buf)
|
||||
{
|
||||
@@ -151,19 +172,20 @@ pb_destroy(struct pb_buffer *buf)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* User buffers are special buffers that initially reference memory
|
||||
* held by the user but which may if necessary copy that memory into
|
||||
* device memory behind the scenes, for submission to hardware.
|
||||
*
|
||||
* These are particularly useful when the referenced data is never
|
||||
* submitted to hardware at all, in the particular case of software
|
||||
* vertex processing.
|
||||
/* XXX: thread safety issues!
|
||||
*/
|
||||
struct pb_buffer *
|
||||
pb_user_buffer_create(void *data, unsigned bytes);
|
||||
static INLINE void
|
||||
pb_reference(struct pb_buffer **dst,
|
||||
struct pb_buffer *src)
|
||||
{
|
||||
if (src)
|
||||
src->base.refcount++;
|
||||
|
||||
if (*dst && --(*dst)->base.refcount == 0)
|
||||
pb_destroy( *dst );
|
||||
|
||||
*dst = src;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -175,22 +197,8 @@ pb_malloc_buffer_create(size_t size,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
|
||||
static INLINE struct pipe_buffer *
|
||||
pb_pipe_buffer( struct pb_buffer *pbuf )
|
||||
{
|
||||
return &pbuf->base;
|
||||
}
|
||||
|
||||
static INLINE struct pb_buffer *
|
||||
pb_buffer( struct pipe_buffer *buf )
|
||||
{
|
||||
/* Could add a magic cookie check on debug builds.
|
||||
*/
|
||||
return (struct pb_buffer *)buf;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pb_init_winsys(struct pipe_winsys *winsys);
|
||||
|
||||
|
||||
#endif /*PB_BUFFER_H_*/
|
||||
|
||||
@@ -34,10 +34,21 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_util.h"
|
||||
|
||||
#include "pb_buffer.h"
|
||||
|
||||
|
||||
/**
|
||||
* User buffers are special buffers that initially reference memory
|
||||
* held by the user but which may if necessary copy that memory into
|
||||
* device memory behind the scenes, for submission to hardware.
|
||||
*
|
||||
* These are particularly useful when the referenced data is never
|
||||
* submitted to hardware at all, in the particular case of software
|
||||
* vertex processing.
|
||||
*/
|
||||
struct pb_user_buffer
|
||||
{
|
||||
struct pb_buffer base;
|
||||
@@ -67,7 +78,7 @@ pb_user_buffer_destroy(struct pb_buffer *buf)
|
||||
|
||||
static void *
|
||||
pb_user_buffer_map(struct pb_buffer *buf,
|
||||
unsigned flags)
|
||||
unsigned flags)
|
||||
{
|
||||
return pb_user_buffer(buf)->data;
|
||||
}
|
||||
@@ -82,8 +93,8 @@ pb_user_buffer_unmap(struct pb_buffer *buf)
|
||||
|
||||
static void
|
||||
pb_user_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
{
|
||||
*base_buf = buf;
|
||||
*offset = 0;
|
||||
@@ -99,17 +110,61 @@ pb_user_buffer_vtbl = {
|
||||
};
|
||||
|
||||
|
||||
struct pb_buffer *
|
||||
pb_user_buffer_create(void *data, unsigned bytes)
|
||||
static struct pipe_buffer *
|
||||
pb_winsys_user_buffer_create(struct pipe_winsys *winsys,
|
||||
void *data,
|
||||
unsigned bytes)
|
||||
{
|
||||
struct pb_user_buffer *buf = CALLOC_STRUCT(pb_user_buffer);
|
||||
|
||||
if(!buf)
|
||||
return NULL;
|
||||
|
||||
buf->base.vtbl = &pb_user_buffer_vtbl;
|
||||
buf->base.base.refcount = 1;
|
||||
buf->base.base.size = bytes;
|
||||
buf->base.base.alignment = 0;
|
||||
buf->base.base.usage = 0;
|
||||
|
||||
buf->base.vtbl = &pb_user_buffer_vtbl;
|
||||
buf->data = data;
|
||||
|
||||
return &buf->base;
|
||||
return &buf->base.base;
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
pb_winsys_buffer_map(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *buf,
|
||||
unsigned flags)
|
||||
{
|
||||
(void)winsys;
|
||||
return pb_map(pb_buffer(buf), flags);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_winsys_buffer_unmap(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
(void)winsys;
|
||||
pb_unmap(pb_buffer(buf));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pb_winsys_buffer_destroy(struct pipe_winsys *winsys,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
(void)winsys;
|
||||
pb_destroy(pb_buffer(buf));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
pb_init_winsys(struct pipe_winsys *winsys)
|
||||
{
|
||||
winsys->user_buffer_create = pb_winsys_user_buffer_create;
|
||||
winsys->buffer_map = pb_winsys_buffer_map;
|
||||
winsys->buffer_unmap = pb_winsys_buffer_unmap;
|
||||
winsys->buffer_destroy = pb_winsys_buffer_destroy;
|
||||
}
|
||||
Reference in New Issue
Block a user