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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 );
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user