[Mesa-dev] [PATCH 3/4] radeonsi: implement uploading zero-stride vertex attribs

Marek Olšák maraeo at gmail.com
Sat Feb 11 16:30:26 UTC 2017


From: Marek Olšák <marek.olsak at 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



More information about the mesa-dev mailing list