Supply buffer usage hints to winsys.

Winsys driver needs some hints in order to allocate the appropriate kind of
memory for the buffer.
This commit is contained in:
José Fonseca
2007-11-05 18:04:35 +00:00
parent 4f79dbd5aa
commit fa1a66d7fc
10 changed files with 60 additions and 19 deletions

View File

@@ -107,7 +107,8 @@ intel_buffer_reference(struct pipe_winsys *sws,
*/ */
static void intel_buffer_data(struct pipe_winsys *sws, static void intel_buffer_data(struct pipe_winsys *sws,
struct pipe_buffer_handle *buf, struct pipe_buffer_handle *buf,
unsigned size, const void *data ) unsigned size, const void *data,
unsigned usage )
{ {
struct intel_context *intel = intel_pipe_winsys(sws)->intel; struct intel_context *intel = intel_pipe_winsys(sws)->intel;
@@ -229,7 +230,8 @@ intel_i915_region_alloc(struct pipe_winsys *winsys,
winsys->buffer_data( winsys, winsys->buffer_data( winsys,
region->buffer, region->buffer,
pitch * cpp * height, pitch * cpp * height,
NULL ); NULL,
PIPE_BUFFER_USAGE_PIXEL );
return region; return region;
} }

View File

@@ -140,7 +140,7 @@ xm_buffer_reference(struct pipe_winsys *pws,
static void static void
xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
unsigned size, const void *data ) unsigned size, const void *data, unsigned usage)
{ {
struct xm_buffer *xm_buf = xm_bo(buf); struct xm_buffer *xm_buf = xm_bo(buf);
assert(!xm_buf->userBuffer); assert(!xm_buf->userBuffer);
@@ -265,7 +265,8 @@ xm_region_alloc(struct pipe_winsys *winsys,
winsys->buffer_data( winsys, winsys->buffer_data( winsys,
region->buffer, region->buffer,
region->pitch * cpp * height, region->pitch * cpp * height,
NULL ); NULL,
PIPE_BUFFER_USAGE_PIXEL );
return region; return region;
} }

View File

@@ -376,7 +376,9 @@ static void vbuf_flush_elements( struct draw_stage *stage )
/* FIXME: handle failure */ /* FIXME: handle failure */
if(!vbuf->buf) if(!vbuf->buf)
vbuf->buf = winsys->buffer_create(winsys, 64); vbuf->buf = winsys->buffer_create(winsys, 64);
winsys->buffer_data(winsys, vbuf->buf, VBUF_SIZE, NULL); winsys->buffer_data( winsys, vbuf->buf,
VBUF_SIZE, NULL,
PIPE_BUFFER_USAGE_VERTEX );
vbuf->vertex_map = winsys->buffer_map(winsys, vbuf->vertex_map = winsys->buffer_map(winsys,
vbuf->buf, vbuf->buf,
PIPE_BUFFER_FLAG_WRITE ); PIPE_BUFFER_FLAG_WRITE );

View File

@@ -168,15 +168,19 @@
/** /**
* Buffer flags * Buffer access flags
*/ */
#define PIPE_BUFFER_FLAG_READ 0x1 #define PIPE_BUFFER_FLAG_READ 0x1
#define PIPE_BUFFER_FLAG_WRITE 0x2 #define PIPE_BUFFER_FLAG_WRITE 0x2
#define PIPE_BUFFER_USE_TEXTURE 0x1
#define PIPE_BUFFER_USE_VERTEX_BUFFER 0x2 /**
#define PIPE_BUFFER_USE_INDEX_BUFFER 0x4 * Buffer usage flags
#define PIPE_BUFFER_USE_RENDER_TARGET 0x8 */
#define PIPE_BUFFER_USAGE_PIXEL 0x1
#define PIPE_BUFFER_USAGE_VERTEX 0x2
#define PIPE_BUFFER_USAGE_INDEX 0x4
#define PIPE_BUFFER_USAGE_CONSTANT 0x8
/** /**

View File

@@ -116,10 +116,17 @@ struct pipe_winsys
struct pipe_buffer_handle **ptr, struct pipe_buffer_handle **ptr,
struct pipe_buffer_handle *buf ); struct pipe_buffer_handle *buf );
/** Create the data store of a buffer and optionally initialize it */ /**
* Create the data store of a buffer and optionally initialize it.
*
* usage is a bitmask of PIPE_BUFFER_USAGE_PIXEL/VERTEX/INDEX/CONSTANT. This
* usage argument is only an optimization hint, not a guarantee, therefore
* proper behavior must be observed in all circumstances.
*/
void (*buffer_data)(struct pipe_winsys *sws, void (*buffer_data)(struct pipe_winsys *sws,
struct pipe_buffer_handle *buf, struct pipe_buffer_handle *buf,
unsigned size, const void *data ); unsigned size, const void *data,
unsigned usage);
/** Modify some or all of the data contained in a buffer's data store */ /** Modify some or all of the data contained in a buffer's data store */
void (*buffer_subdata)(struct pipe_winsys *sws, void (*buffer_subdata)(struct pipe_winsys *sws,

View File

@@ -120,7 +120,7 @@ xm_buffer_reference(struct pipe_winsys *pws,
static void static void
xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
unsigned size, const void *data ) unsigned size, const void *data, unsigned usage )
{ {
struct xm_buffer *xm_buf = xm_bo(buf); struct xm_buffer *xm_buf = xm_bo(buf);
assert(!xm_buf->userBuffer); assert(!xm_buf->userBuffer);
@@ -245,7 +245,8 @@ xm_region_alloc(struct pipe_winsys *winsys,
winsys->buffer_data( winsys, winsys->buffer_data( winsys,
region->buffer, region->buffer,
region->pitch * cpp * height, region->pitch * cpp * height,
NULL ); NULL,
PIPE_BUFFER_USAGE_PIXEL );
return region; return region;
} }

View File

@@ -80,7 +80,8 @@ void st_upload_constants( struct st_context *st,
} }
/* load Mesa constants into the constant buffer */ /* load Mesa constants into the constant buffer */
ws->buffer_data(ws, cbuf->buffer, paramBytes, params->ParameterValues); ws->buffer_data(ws, cbuf->buffer, paramBytes, params->ParameterValues,
PIPE_BUFFER_USAGE_CONSTANT);
cbuf->size = paramBytes; cbuf->size = paramBytes;

View File

@@ -104,11 +104,29 @@ st_bufferobj_data(GLcontext *ctx,
{ {
struct pipe_context *pipe = st_context(ctx)->pipe; struct pipe_context *pipe = st_context(ctx)->pipe;
struct st_buffer_object *st_obj = st_buffer_object(obj); struct st_buffer_object *st_obj = st_buffer_object(obj);
unsigned buffer_usage;
st_obj->Base.Size = size; st_obj->Base.Size = size;
st_obj->Base.Usage = usage; st_obj->Base.Usage = usage;
switch(target) {
case GL_PIXEL_PACK_BUFFER_ARB:
case GL_PIXEL_UNPACK_BUFFER_ARB:
buffer_usage = PIPE_BUFFER_USAGE_PIXEL;
break;
case GL_ARRAY_BUFFER_ARB:
buffer_usage = PIPE_BUFFER_USAGE_VERTEX;
break;
case GL_ELEMENT_ARRAY_BUFFER_ARB:
buffer_usage = PIPE_BUFFER_USAGE_INDEX;
break;
default:
buffer_usage = 0;
}
pipe->winsys->buffer_data( pipe->winsys, st_obj->buffer, size, data ); pipe->winsys->buffer_data( pipe->winsys, st_obj->buffer,
size, data,
buffer_usage );
} }

View File

@@ -282,7 +282,9 @@ st_RasterPos(GLcontext *ctx, const GLfloat v[4])
const unsigned size = sizeof(ctx->Current.Attrib); const unsigned size = sizeof(ctx->Current.Attrib);
const void *data = ctx->Current.Attrib; const void *data = ctx->Current.Attrib;
/* colors, texcoords, etc */ /* colors, texcoords, etc */
pipe->winsys->buffer_data(pipe->winsys, buf, size, data); pipe->winsys->buffer_data(pipe->winsys, buf,
size, data,
PIPE_BUFFER_USAGE_VERTEX);
/* position */ /* position */
pipe->winsys->buffer_subdata(pipe->winsys, buf, pipe->winsys->buffer_subdata(pipe->winsys, buf,
0, /* offset */ 0, /* offset */
@@ -301,7 +303,8 @@ st_RasterPos(GLcontext *ctx, const GLfloat v[4])
fb_buf.start_offset = 0; fb_buf.start_offset = 0;
pipe->winsys->buffer_data(pipe->winsys, fb_buf.buffer, pipe->winsys->buffer_data(pipe->winsys, fb_buf.buffer,
fb_buf.size, fb_buf.size,
NULL); /* data */ NULL, /* data */
PIPE_BUFFER_USAGE_VERTEX);
if (pipe->set_feedback_buffer) if (pipe->set_feedback_buffer)
pipe->set_feedback_buffer(pipe, 0, &fb_buf); pipe->set_feedback_buffer(pipe, 0, &fb_buf);
} }

View File

@@ -289,7 +289,9 @@ st_draw_vertices(GLcontext *ctx, unsigned prim,
/* XXX create one-time */ /* XXX create one-time */
vbuf = pipe->winsys->buffer_create(pipe->winsys, 32); vbuf = pipe->winsys->buffer_create(pipe->winsys, 32);
pipe->winsys->buffer_data(pipe->winsys, vbuf, vertex_bytes, verts); pipe->winsys->buffer_data(pipe->winsys, vbuf,
vertex_bytes, verts,
PIPE_BUFFER_USAGE_VERTEX);
/* tell pipe about the vertex buffer */ /* tell pipe about the vertex buffer */
vbuffer.buffer = vbuf; vbuffer.buffer = vbuf;