From: Marek Olšák <marek.ol...@amd.com> This is the only kind of user buffer we can get with the GL core profile. --- src/gallium/drivers/radeonsi/si_state.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 107bc06..df7092e 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -27,20 +27,21 @@ #include "si_pipe.h" #include "sid.h" #include "radeon/r600_cs.h" #include "radeon/r600_query.h" #include "util/u_dual_blend.h" #include "util/u_format.h" #include "util/u_format_s3tc.h" #include "util/u_memory.h" #include "util/u_resource.h" +#include "util/u_upload_mgr.h" /* Initialize an external atom (owned by ../radeon). */ static void si_init_external_atom(struct si_context *sctx, struct r600_atom *atom, struct r600_atom **list_elem) { atom->id = list_elem - sctx->atoms.array; *list_elem = atom; } @@ -3507,28 +3508,42 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, struct si_context *sctx = (struct si_context *)ctx; struct pipe_vertex_buffer *dst = sctx->vertex_buffer + start_slot; int i; assert(start_slot + count <= ARRAY_SIZE(sctx->vertex_buffer)); if (buffers) { for (i = 0; i < count; i++) { const struct pipe_vertex_buffer *src = buffers + i; struct pipe_vertex_buffer *dsti = dst + i; - struct pipe_resource *buf = src->buffer; - - pipe_resource_reference(&dsti->buffer, buf); - dsti->buffer_offset = src->buffer_offset; - dsti->stride = src->stride; - r600_context_add_resource_size(ctx, buf); - if (buf) - r600_resource(buf)->bind_history |= PIPE_BIND_VERTEX_BUFFER; + + if (unlikely(src->user_buffer)) { + /* Zero-stride attribs only. */ + assert(src->stride == 0); + + /* Assume the attrib has 4 dwords like the vbo + * module. This is also a good upper bound. */ + u_upload_data(sctx->b.uploader, 0, 16, 16, + src->user_buffer, + &dsti->buffer_offset, + &dsti->buffer); + dsti->stride = 0; + } else { + struct pipe_resource *buf = src->buffer; + + pipe_resource_reference(&dsti->buffer, buf); + dsti->buffer_offset = src->buffer_offset; + dsti->stride = src->stride; + r600_context_add_resource_size(ctx, buf); + if (buf) + r600_resource(buf)->bind_history |= PIPE_BIND_VERTEX_BUFFER; + } } } else { for (i = 0; i < count; i++) { pipe_resource_reference(&dst[i].buffer, NULL); } } sctx->vertex_buffers_dirty = true; } static void si_set_index_buffer(struct pipe_context *ctx, -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev