r600g: need to reference upload buffer as the might still live accross flush
authorJerome Glisse <jglisse@redhat.com>
Wed, 15 Dec 2010 17:07:09 +0000 (12:07 -0500)
committerJerome Glisse <jglisse@redhat.com>
Wed, 15 Dec 2010 17:07:09 +0000 (12:07 -0500)
Can't get away from referencing upload buffer as after flush a vertex buffer
using the upload buffer might still be active. Likely need to simplify the
pipe_refence a bit so we don't waste so much cpu time in it.

candidates for 7.10 branch

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_upload.c

index 7d29f76..a17c54d 100644 (file)
@@ -103,7 +103,7 @@ static void r600_buffer_destroy(struct pipe_screen *screen,
 {
        struct r600_resource_buffer *rbuffer = r600_buffer(buf);
 
-       if (!rbuffer->uploaded && rbuffer->r.bo) {
+       if (rbuffer->r.bo) {
                r600_bo_reference((struct radeon*)screen->winsys, &rbuffer->r.bo, NULL);
        }
        rbuffer->r.bo = NULL;
index ac72854..44102ff 100644 (file)
@@ -69,6 +69,7 @@ void r600_upload_flush(struct r600_upload *upload)
        upload->default_size = MAX2(upload->total_alloc_size, upload->default_size);
        upload->total_alloc_size = 0;
        upload->size = 0;
+       upload->offset = 0;
        upload->ptr = NULL;
        upload->buffer = NULL;
 }
@@ -105,7 +106,8 @@ int r600_upload_buffer(struct r600_upload *upload, unsigned offset,
        memcpy(upload->ptr + upload->offset, (uint8_t *) in_ptr + offset, size);
        *out_offset = upload->offset;
        *out_size = upload->size;
-       *out_buffer = upload->buffer;
+       *out_buffer = NULL;
+       r600_bo_reference(upload->rctx->radeon, out_buffer, upload->buffer);
        upload->offset += alloc_size;
 
        return 0;