diff options
author | Marek Olšák <[email protected]> | 2017-02-11 13:12:22 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-02-14 22:04:35 +0100 |
commit | b5eb38f071135003014192b2686713be7ea76fb7 (patch) | |
tree | 8fa57ccd2a7cd9947ad485a568d5dec0cc41211a | |
parent | b8f3b00742eab6ee1868407b876f69195a51f3b6 (diff) |
radeonsi: implement uploading zero-stride vertex attribs
This is the only kind of user buffer we can get with the GL core profile.
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 107bc06597d..4ccca52d04f 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -34,6 +34,7 @@ #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 @@ -3514,14 +3515,28 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, 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.b.stream_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++) { |