aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeonsi/si_state.c
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-02-11 13:12:22 +0100
committerMarek Olšák <[email protected]>2017-02-14 22:04:35 +0100
commitb5eb38f071135003014192b2686713be7ea76fb7 (patch)
tree8fa57ccd2a7cd9947ad485a568d5dec0cc41211a /src/gallium/drivers/radeonsi/si_state.c
parentb8f3b00742eab6ee1868407b876f69195a51f3b6 (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]>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_state.c')
-rw-r--r--src/gallium/drivers/radeonsi/si_state.c31
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++) {