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

View File

@@ -1368,7 +1368,6 @@ get_next_slot(struct gen_mipmap_state *ctx)
static unsigned
set_vertex_data(struct gen_mipmap_state *ctx, float width, float height)
{
void *buf;
unsigned offset;
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 );
buf = pipe_buffer_map(ctx->pipe->screen, ctx->vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy((char *)buf + offset, ctx->vertices, sizeof(ctx->vertices));
pipe_buffer_unmap(ctx->pipe->screen, ctx->vbuf);
pipe_buffer_write(ctx->pipe->screen, ctx->vbuf,
offset, sizeof(ctx->vertices), ctx->vertices);
return offset;
}

View File

@@ -161,6 +161,44 @@ pipe_buffer_unmap(struct pipe_screen *screen,
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!
*/
static INLINE void

View File

@@ -85,12 +85,10 @@ void st_upload_constants( struct st_context *st,
}
/* load Mesa constants into the constant buffer */
if (cbuf->buffer) {
void *map = pipe_buffer_map(pipe->screen, cbuf->buffer,
PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy(map, params->ParameterValues, paramBytes);
pipe_buffer_unmap(pipe->screen, cbuf->buffer);
}
if (cbuf->buffer)
pipe_buffer_write(pipe->screen, cbuf->buffer,
0, paramBytes,
params->ParameterValues);
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 */
{
char *buf = pipe_buffer_map(pipe->screen,
pipe_buffer_write(pipe->screen,
st->bitmap.vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE);
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);
}
st->bitmap.vbuf_slot * sizeof st->bitmap.vertices,
sizeof st->bitmap.vertices,
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 st_buffer_object *st_obj = st_buffer_object(obj);
char *map;
if (offset >= st_obj->size || size > (st_obj->size - offset))
return;
map = pipe_buffer_map(pipe->screen, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy(map + offset, data, size);
pipe_buffer_unmap(pipe->screen, st_obj->buffer);
pipe_buffer_write(pipe->screen, st_obj->buffer, offset, size, data);
}
@@ -123,14 +120,11 @@ st_bufferobj_get_subdata(GLcontext *ctx,
{
struct pipe_context *pipe = st_context(ctx)->pipe;
struct st_buffer_object *st_obj = st_buffer_object(obj);
char *map;
if (offset >= st_obj->size || size > (st_obj->size - offset))
return;
map = pipe_buffer_map(pipe->screen, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_READ);
memcpy(data, map + offset, size);
pipe_buffer_unmap(pipe->screen, st_obj->buffer);
pipe_buffer_read(pipe->screen, st_obj->buffer, offset, size, data);
}

View File

@@ -150,7 +150,6 @@ draw_quad(GLcontext *ctx,
struct pipe_context *pipe = st->pipe;
const GLuint max_slots = 1024 / sizeof(st->clear.vertices);
GLuint i;
void *buf;
if (st->clear.vbuf_slot >= max_slots) {
pipe_buffer_reference(pipe->screen, &st->clear.vbuf, NULL);
@@ -186,13 +185,10 @@ draw_quad(GLcontext *ctx,
}
/* put vertex data into vbuf */
buf = pipe_buffer_map(pipe->screen, st->clear.vbuf, PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy((char *)buf + st->clear.vbuf_slot * sizeof(st->clear.vertices),
st->clear.vertices,
sizeof(st->clear.vertices));
pipe_buffer_unmap(pipe->screen, st->clear.vbuf);
pipe_buffer_write(pipe->screen, st->clear.vbuf,
st->clear.vbuf_slot * sizeof(st->clear.vertices),
sizeof(st->clear.vertices),
st->clear.vertices);
/* draw */
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;
ubyte *map;
/* allocate/load buffer object with vertex data */
buf = pipe_buffer_create(pipe->screen, 32, PIPE_BUFFER_USAGE_VERTEX,
sizeof(verts));
map = pipe_buffer_map(pipe->screen, buf, PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy(map, verts, sizeof(verts));
pipe_buffer_unmap(pipe->screen, buf);
pipe_buffer_write(pipe->screen, buf, 0, sizeof(verts), verts);
util_draw_vertex_buffer(pipe, buf, 0,
PIPE_PRIM_QUADS,