summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r300/r300_screen_buffer.c
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2010-07-16 12:53:40 +0200
committerMarek Olšák <maraeo@gmail.com>2010-07-16 21:13:21 +0200
commit3eb557778376bcbbc6f25da88ffbaa269607254c (patch)
treed31597229b8e95288d2aade0cb99159cf1552c92 /src/gallium/drivers/r300/r300_screen_buffer.c
parent80e07c41907cc0ac43d68aeb3abf9de8435e70fd (diff)
r300g: do not make copies of constant buffers, emit them directly
Diffstat (limited to 'src/gallium/drivers/r300/r300_screen_buffer.c')
-rw-r--r--src/gallium/drivers/r300/r300_screen_buffer.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c
index 15d3f25c77..51d044af71 100644
--- a/src/gallium/drivers/r300/r300_screen_buffer.c
+++ b/src/gallium/drivers/r300/r300_screen_buffer.c
@@ -136,6 +136,9 @@ static void r300_buffer_destroy(struct pipe_screen *screen,
struct r300_screen *r300screen = r300_screen(screen);
struct r300_buffer *rbuf = r300_buffer(buf);
+ if (rbuf->constant_buffer)
+ FREE(rbuf->constant_buffer);
+
r300_winsys_buffer_destroy(r300screen, rbuf);
FREE(rbuf);
}
@@ -154,10 +157,8 @@ r300_buffer_transfer_map( struct pipe_context *pipe,
if (rbuf->user_buffer)
return (uint8_t *) rbuf->user_buffer + transfer->box.x;
-
- if (rbuf->b.b.bind & PIPE_BIND_CONSTANT_BUFFER) {
- goto just_map;
- }
+ if (rbuf->constant_buffer)
+ return (uint8_t *) rbuf->constant_buffer + transfer->box.x;
/* check if the mapping is to a range we already flushed */
if (transfer->usage & PIPE_TRANSFER_DISCARD) {
@@ -182,7 +183,6 @@ r300_buffer_transfer_map( struct pipe_context *pipe,
}
}
-just_map:
map = rws->buffer_map(rws, rbuf->buf, r300->cs, transfer->usage);
if (map == NULL)
@@ -208,9 +208,8 @@ static void r300_buffer_transfer_flush_region( struct pipe_context *pipe,
if (rbuf->user_buffer)
return;
-
- if (rbuf->b.b.bind & PIPE_BIND_CONSTANT_BUFFER)
- return;
+ if (rbuf->constant_buffer)
+ return;
/* mark the range as used */
for(i = 0; i < rbuf->num_ranges; ++i) {
@@ -270,6 +269,12 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
rbuf->b.b.screen = screen;
rbuf->domain = R300_DOMAIN_GTT;
+ /* Alloc constant buffers in RAM. */
+ if (templ->bind & PIPE_BIND_CONSTANT_BUFFER) {
+ rbuf->constant_buffer = MALLOC(templ->width0);
+ return &rbuf->b.b;
+ }
+
rbuf->buf =
r300screen->rws->buffer_create(r300screen->rws,
rbuf->b.b.width0, alignment,