gallium: Add pipe_buffer_write/read inlines.

Saves code, and will simplify future interface changes.
This commit is contained in:
José Fonseca
2009-02-24 11:30:25 +00:00
parent c5dd8634c8
commit 693fac8ae2
8 changed files with 60 additions and 58 deletions

View File

@@ -199,7 +199,6 @@ static unsigned
setup_vertex_data(struct blit_state *ctx, setup_vertex_data(struct blit_state *ctx,
float x0, float y0, float x1, float y1, float z) float x0, float y0, float x1, float y1, float z)
{ {
void *buf;
unsigned offset; unsigned offset;
ctx->vertices[0][0][0] = x0; ctx->vertices[0][0][0] = x0;
@@ -228,12 +227,8 @@ setup_vertex_data(struct blit_state *ctx,
offset = get_next_slot( ctx ); offset = get_next_slot( ctx );
buf = pipe_buffer_map(ctx->pipe->screen, ctx->vbuf, pipe_buffer_write(ctx->pipe->screen, ctx->vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE); offset, sizeof(ctx->vertices), ctx->vertices);
memcpy((char *)buf + offset, ctx->vertices, sizeof(ctx->vertices));
pipe_buffer_unmap(ctx->pipe->screen, ctx->vbuf);
return offset; return offset;
} }
@@ -249,7 +244,6 @@ setup_vertex_data_tex(struct blit_state *ctx,
float s0, float t0, float s1, float t1, float s0, float t0, float s1, float t1,
float z) float z)
{ {
void *buf;
unsigned offset; unsigned offset;
ctx->vertices[0][0][0] = x0; ctx->vertices[0][0][0] = x0;
@@ -278,12 +272,8 @@ setup_vertex_data_tex(struct blit_state *ctx,
offset = get_next_slot( ctx ); offset = get_next_slot( ctx );
buf = pipe_buffer_map(ctx->pipe->screen, ctx->vbuf, pipe_buffer_write(ctx->pipe->screen, ctx->vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE); offset, sizeof(ctx->vertices), ctx->vertices);
memcpy((char *)buf + offset, ctx->vertices, sizeof(ctx->vertices));
pipe_buffer_unmap(ctx->pipe->screen, ctx->vbuf);
return offset; return offset;
} }

View File

@@ -1368,7 +1368,6 @@ get_next_slot(struct gen_mipmap_state *ctx)
static unsigned static unsigned
set_vertex_data(struct gen_mipmap_state *ctx, float width, float height) set_vertex_data(struct gen_mipmap_state *ctx, float width, float height)
{ {
void *buf;
unsigned offset; unsigned offset;
ctx->vertices[0][0][0] = 0.0f; /*x*/ ctx->vertices[0][0][0] = 0.0f; /*x*/
@@ -1393,12 +1392,8 @@ set_vertex_data(struct gen_mipmap_state *ctx, float width, float height)
offset = get_next_slot( ctx ); offset = get_next_slot( ctx );
buf = pipe_buffer_map(ctx->pipe->screen, ctx->vbuf, pipe_buffer_write(ctx->pipe->screen, ctx->vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE); offset, sizeof(ctx->vertices), ctx->vertices);
memcpy((char *)buf + offset, ctx->vertices, sizeof(ctx->vertices));
pipe_buffer_unmap(ctx->pipe->screen, ctx->vbuf);
return offset; return offset;
} }

View File

@@ -161,6 +161,44 @@ pipe_buffer_unmap(struct pipe_screen *screen,
screen->buffer_unmap(screen, buf); screen->buffer_unmap(screen, buf);
} }
static INLINE void
pipe_buffer_write(struct pipe_screen *screen,
struct pipe_buffer *buf,
unsigned offset, unsigned size,
const void *data)
{
uint8_t *map;
assert(offset < buf->size);
assert(offset + size <= buf->size);
map = pipe_buffer_map(screen, buf, PIPE_BUFFER_USAGE_CPU_WRITE);
assert(map);
if(map) {
memcpy(map + offset, data, size);
pipe_buffer_unmap(screen, buf);
}
}
static INLINE void
pipe_buffer_read(struct pipe_screen *screen,
struct pipe_buffer *buf,
unsigned offset, unsigned size,
void *data)
{
uint8_t *map;
assert(offset < buf->size);
assert(offset + size <= buf->size);
map = pipe_buffer_map(screen, buf, PIPE_BUFFER_USAGE_CPU_READ);
assert(map);
if(map) {
memcpy(data, map + offset, size);
pipe_buffer_unmap(screen, buf);
}
}
/* XXX: thread safety issues! /* XXX: thread safety issues!
*/ */
static INLINE void static INLINE void

View File

@@ -85,12 +85,10 @@ void st_upload_constants( struct st_context *st,
} }
/* load Mesa constants into the constant buffer */ /* load Mesa constants into the constant buffer */
if (cbuf->buffer) { if (cbuf->buffer)
void *map = pipe_buffer_map(pipe->screen, cbuf->buffer, pipe_buffer_write(pipe->screen, cbuf->buffer,
PIPE_BUFFER_USAGE_CPU_WRITE); 0, paramBytes,
memcpy(map, params->ParameterValues, paramBytes); params->ParameterValues);
pipe_buffer_unmap(pipe->screen, cbuf->buffer);
}
st->pipe->set_constant_buffer(st->pipe, id, 0, cbuf); st->pipe->set_constant_buffer(st->pipe, id, 0, cbuf);
} }

View File

@@ -417,17 +417,11 @@ setup_bitmap_vertex_data(struct st_context *st,
} }
/* put vertex data into vbuf */ /* put vertex data into vbuf */
{ pipe_buffer_write(pipe->screen,
char *buf = pipe_buffer_map(pipe->screen, st->bitmap.vbuf,
st->bitmap.vbuf, st->bitmap.vbuf_slot * sizeof st->bitmap.vertices,
PIPE_BUFFER_USAGE_CPU_WRITE); sizeof st->bitmap.vertices,
st->bitmap.vertices);
memcpy(buf + st->bitmap.vbuf_slot * sizeof st->bitmap.vertices,
st->bitmap.vertices,
sizeof st->bitmap.vertices);
pipe_buffer_unmap(pipe->screen, st->bitmap.vbuf);
}
return st->bitmap.vbuf_slot++ * sizeof st->bitmap.vertices; return st->bitmap.vbuf_slot++ * sizeof st->bitmap.vertices;
} }

View File

@@ -100,14 +100,11 @@ st_bufferobj_subdata(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);
char *map;
if (offset >= st_obj->size || size > (st_obj->size - offset)) if (offset >= st_obj->size || size > (st_obj->size - offset))
return; return;
map = pipe_buffer_map(pipe->screen, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_WRITE); pipe_buffer_write(pipe->screen, st_obj->buffer, offset, size, data);
memcpy(map + offset, data, size);
pipe_buffer_unmap(pipe->screen, st_obj->buffer);
} }
@@ -123,14 +120,11 @@ st_bufferobj_get_subdata(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);
char *map;
if (offset >= st_obj->size || size > (st_obj->size - offset)) if (offset >= st_obj->size || size > (st_obj->size - offset))
return; return;
map = pipe_buffer_map(pipe->screen, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_READ); pipe_buffer_read(pipe->screen, st_obj->buffer, offset, size, data);
memcpy(data, map + offset, size);
pipe_buffer_unmap(pipe->screen, st_obj->buffer);
} }

View File

@@ -150,7 +150,6 @@ draw_quad(GLcontext *ctx,
struct pipe_context *pipe = st->pipe; struct pipe_context *pipe = st->pipe;
const GLuint max_slots = 1024 / sizeof(st->clear.vertices); const GLuint max_slots = 1024 / sizeof(st->clear.vertices);
GLuint i; GLuint i;
void *buf;
if (st->clear.vbuf_slot >= max_slots) { if (st->clear.vbuf_slot >= max_slots) {
pipe_buffer_reference(pipe->screen, &st->clear.vbuf, NULL); pipe_buffer_reference(pipe->screen, &st->clear.vbuf, NULL);
@@ -186,13 +185,10 @@ draw_quad(GLcontext *ctx,
} }
/* put vertex data into vbuf */ /* put vertex data into vbuf */
buf = pipe_buffer_map(pipe->screen, st->clear.vbuf, PIPE_BUFFER_USAGE_CPU_WRITE); pipe_buffer_write(pipe->screen, st->clear.vbuf,
st->clear.vbuf_slot * sizeof(st->clear.vertices),
memcpy((char *)buf + st->clear.vbuf_slot * sizeof(st->clear.vertices), sizeof(st->clear.vertices),
st->clear.vertices, st->clear.vertices);
sizeof(st->clear.vertices));
pipe_buffer_unmap(pipe->screen, st->clear.vbuf);
/* draw */ /* draw */
util_draw_vertex_buffer(pipe, util_draw_vertex_buffer(pipe,

View File

@@ -485,14 +485,11 @@ draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z,
{ {
struct pipe_buffer *buf; struct pipe_buffer *buf;
ubyte *map;
/* allocate/load buffer object with vertex data */ /* allocate/load buffer object with vertex data */
buf = pipe_buffer_create(pipe->screen, 32, PIPE_BUFFER_USAGE_VERTEX, buf = pipe_buffer_create(pipe->screen, 32, PIPE_BUFFER_USAGE_VERTEX,
sizeof(verts)); sizeof(verts));
map = pipe_buffer_map(pipe->screen, buf, PIPE_BUFFER_USAGE_CPU_WRITE); pipe_buffer_write(pipe->screen, buf, 0, sizeof(verts), verts);
memcpy(map, verts, sizeof(verts));
pipe_buffer_unmap(pipe->screen, buf);
util_draw_vertex_buffer(pipe, buf, 0, util_draw_vertex_buffer(pipe, buf, 0,
PIPE_PRIM_QUADS, PIPE_PRIM_QUADS,