X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fdrivers%2Fr600%2Fr600_buffer.c;h=6ebe6ab2364ca40712175dcb111d09cf46d4e2cf;hb=8c631cfeae29b5236928f759e222aa35e6e4984c;hp=a17c54d6eeb8958635fb0b4251a1ce1419541a21;hpb=3861a1001c5ad0dd0de3b0befabf3ed69da9dc5e;p=mesa.git diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c index a17c54d6eeb..6ebe6ab2364 100644 --- a/src/gallium/drivers/r600/r600_buffer.c +++ b/src/gallium/drivers/r600/r600_buffer.c @@ -29,15 +29,18 @@ #include #include #include +#include "util/u_upload_mgr.h" + #include "state_tracker/drm_driver.h" + #include #include "radeon_drm.h" + #include "r600.h" #include "r600_pipe.h" extern struct u_resource_vtbl r600_buffer_vtbl; - struct pipe_resource *r600_buffer_create(struct pipe_screen *screen, const struct pipe_resource *templ) { @@ -58,7 +61,6 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen, rbuffer->r.base.vtbl = &r600_buffer_vtbl; rbuffer->r.size = rbuffer->r.base.b.width0; rbuffer->r.bo_size = rbuffer->r.size; - rbuffer->uploaded = FALSE; bo = r600_bo((struct radeon*)screen->winsys, rbuffer->r.base.b.width0, alignment, rbuffer->r.base.b.bind, rbuffer->r.base.b.usage); if (bo == NULL) { FREE(rbuffer); @@ -94,7 +96,6 @@ struct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen, rbuffer->r.bo = NULL; rbuffer->r.bo_size = 0; rbuffer->user_buffer = ptr; - rbuffer->uploaded = FALSE; return &rbuffer->r.base.b; } @@ -198,55 +199,71 @@ struct u_resource_vtbl r600_buffer_vtbl = u_default_transfer_inline_write /* transfer_inline_write */ }; -int r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl *draw) +void r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl *draw) { - if (r600_buffer_is_user_buffer(draw->index_buffer)) { - struct r600_resource_buffer *rbuffer = r600_buffer(draw->index_buffer); - unsigned upload_offset; - int ret = 0; - - ret = r600_upload_buffer(rctx->rupload_vb, - draw->index_buffer_offset, - draw->count * draw->index_size, - rbuffer, - &upload_offset, - &rbuffer->r.bo_size, - &rbuffer->r.bo); - if (ret) - return ret; - rbuffer->uploaded = TRUE; - draw->index_buffer_offset = upload_offset; - } - - return 0; + struct r600_resource_buffer *rbuffer = r600_buffer(draw->index_buffer); + boolean flushed; + + u_upload_data(rctx->upload_vb, 0, + draw->info.count * draw->index_size, + rbuffer->user_buffer, + &draw->index_buffer_offset, + &draw->index_buffer, &flushed); } -int r600_upload_user_buffers(struct r600_pipe_context *rctx) +void r600_upload_user_buffers(struct r600_pipe_context *rctx, + int min_index, int max_index) { - enum pipe_error ret = PIPE_OK; - int i, nr; - - nr = rctx->vertex_elements->count; - nr = rctx->nvertex_buffer; + int i, nr = rctx->vertex_elements->count; + unsigned count = max_index + 1 - min_index; + boolean flushed; + boolean uploaded[32] = {0}; for (i = 0; i < nr; i++) { - struct pipe_vertex_buffer *vb = &rctx->vertex_buffer[i]; - - if (r600_buffer_is_user_buffer(vb->buffer)) { - struct r600_resource_buffer *rbuffer = r600_buffer(vb->buffer); - unsigned upload_offset; - - ret = r600_upload_buffer(rctx->rupload_vb, - 0, vb->buffer->width0, - rbuffer, - &upload_offset, - &rbuffer->r.bo_size, - &rbuffer->r.bo); - if (ret) - return ret; - rbuffer->uploaded = TRUE; - vb->buffer_offset = upload_offset; + unsigned index = rctx->vertex_elements->elements[i].vertex_buffer_index; + struct pipe_vertex_buffer *vb = &rctx->vertex_buffer[index]; + struct r600_resource_buffer *userbuf = r600_buffer(vb->buffer); + + if (userbuf && userbuf->user_buffer && !uploaded[index]) { + unsigned first, size; + + if (vb->stride) { + first = vb->stride * min_index; + size = vb->stride * count; + } else { + first = 0; + size = rctx->vertex_elements->hw_format_size[i]; + } + + u_upload_data(rctx->upload_vb, first, size, + userbuf->user_buffer + first, + &vb->buffer_offset, + &rctx->real_vertex_buffer[index], + &flushed); + + vb->buffer_offset -= first; + + /* vertex_arrays_dirty = TRUE; */ + uploaded[index] = TRUE; + } else { + assert(rctx->real_vertex_buffer[index]); } } - return ret; +} + +void r600_upload_const_buffer(struct r600_pipe_context *rctx, struct r600_resource_buffer **rbuffer, + uint32_t *const_offset) +{ + if ((*rbuffer)->user_buffer) { + uint8_t *ptr = (*rbuffer)->user_buffer; + unsigned size = (*rbuffer)->r.base.b.width0; + boolean flushed; + + *rbuffer = NULL; + + u_upload_data(rctx->upload_const, 0, size, ptr, const_offset, + (struct pipe_resource**)rbuffer, &flushed); + } else { + *const_offset = 0; + } }