r300g/swtcl: malloc vertex and index buffers (don't use radeon DRM to get them)

Vertex and index buffers are never used by hardware, only by Draw.
SWTCL chipsets usually have very little memory, so this might help
with stability and reliability.
This commit is contained in:
Marek Olšák 2012-05-11 23:22:21 +02:00
parent 8a963d122d
commit 21b012d3b0
4 changed files with 23 additions and 43 deletions

View file

@ -389,8 +389,9 @@ struct r300_resource
struct radeon_winsys_cs_handle *cs_buf;
enum radeon_bo_domain domain;
/* Constant buffers are in user memory. */
uint8_t *constant_buffer;
/* Constant buffers and SWTCL vertex and index buffers are in user
* memory. */
uint8_t *malloced_buffer;
/* Texture description (addressing, layout, special features). */
struct r300_texture_desc tex;

View file

@ -855,10 +855,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
const struct pipe_draw_info *info)
{
struct r300_context* r300 = r300_context(pipe);
struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS];
struct pipe_transfer *ib_transfer = NULL;
int i;
const void *indices = NULL;
boolean indexed = info->indexed;
if (r300->skip_rendering) {
@ -877,46 +874,26 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
draw_set_mapped_vertex_buffer(r300->draw, i,
r300->vertex_buffer[i].user_buffer);
} else if (r300->vertex_buffer[i].buffer) {
void *buf = pipe_buffer_map(pipe,
r300->vertex_buffer[i].buffer,
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED,
&vb_transfer[i]);
draw_set_mapped_vertex_buffer(r300->draw, i, buf);
draw_set_mapped_vertex_buffer(r300->draw, i,
r300_resource(r300->vertex_buffer[i].buffer)->malloced_buffer);
}
}
if (indexed) {
if (r300->index_buffer.user_buffer) {
indices = r300->index_buffer.user_buffer;
} else {
indices = pipe_buffer_map(pipe, r300->index_buffer.buffer,
PIPE_TRANSFER_READ |
PIPE_TRANSFER_UNSYNCHRONIZED, &ib_transfer);
draw_set_mapped_index_buffer(r300->draw,
r300->index_buffer.user_buffer);
} else if (r300->index_buffer.buffer) {
draw_set_mapped_index_buffer(r300->draw,
r300_resource(r300->index_buffer.buffer)->malloced_buffer);
}
}
draw_set_mapped_index_buffer(r300->draw, indices);
r300->draw_vbo_locked = TRUE;
r300->draw_first_emitted = FALSE;
draw_vbo(r300->draw, info);
draw_flush(r300->draw);
r300->draw_vbo_locked = FALSE;
for (i = 0; i < r300->nr_vertex_buffers; i++) {
if (r300->vertex_buffer[i].buffer) {
if (vb_transfer[i])
pipe_buffer_unmap(pipe, vb_transfer[i]);
draw_set_mapped_vertex_buffer(r300->draw, i, NULL);
}
}
if (indexed) {
if (ib_transfer)
pipe_buffer_unmap(pipe, ib_transfer);
draw_set_mapped_index_buffer(r300->draw, NULL);
}
}
/* Object for rendering using Draw. */
@ -969,7 +946,7 @@ static boolean r300_render_allocate_vertices(struct vbuf_render* render,
{
pipe_resource_reference(&r300->vbo, NULL);
r300->vbo = pipe_buffer_create(screen,
PIPE_BIND_VERTEX_BUFFER,
PIPE_BIND_CUSTOM,
PIPE_USAGE_STREAM,
R300_MAX_DRAW_VBO_SIZE);
r300->draw_vbo_offset = 0;

View file

@ -55,8 +55,8 @@ static void r300_buffer_destroy(struct pipe_screen *screen,
{
struct r300_resource *rbuf = r300_resource(buf);
if (rbuf->constant_buffer)
FREE(rbuf->constant_buffer);
if (rbuf->malloced_buffer)
FREE(rbuf->malloced_buffer);
if (rbuf->buf)
pb_reference(&rbuf->buf, NULL);
@ -107,8 +107,8 @@ r300_buffer_transfer_map( struct pipe_context *pipe,
uint8_t *map;
enum pipe_transfer_usage usage;
if (rbuf->constant_buffer)
return (uint8_t *) rbuf->constant_buffer + transfer->box.x;
if (rbuf->malloced_buffer)
return (uint8_t *) rbuf->malloced_buffer + transfer->box.x;
/* Buffers are never used for write, therefore mapping for read can be
* unsynchronized. */
@ -158,11 +158,13 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
rbuf->b.b.screen = screen;
rbuf->domain = RADEON_DOMAIN_GTT;
rbuf->buf = NULL;
rbuf->constant_buffer = NULL;
rbuf->malloced_buffer = NULL;
/* Alloc constant buffers in RAM. */
if (templ->bind & PIPE_BIND_CONSTANT_BUFFER) {
rbuf->constant_buffer = MALLOC(templ->width0);
/* Alloc constant buffers and SWTCL buffers in RAM. */
if (templ->bind & PIPE_BIND_CONSTANT_BUFFER ||
(!r300screen->caps.has_tcl &&
(templ->bind & (PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER)))) {
rbuf->malloced_buffer = MALLOC(templ->width0);
return &rbuf->b.b;
}

View file

@ -1848,8 +1848,8 @@ static void r300_set_constant_buffer(struct pipe_context *pipe,
else {
struct r300_resource *rbuf = r300_resource(cb->buffer);
if (rbuf && rbuf->constant_buffer)
mapped = (uint32_t*)rbuf->constant_buffer;
if (rbuf && rbuf->malloced_buffer)
mapped = (uint32_t*)rbuf->malloced_buffer;
else
return;
}