On 11.02.2017 17:30, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

This is the only kind of user buffer we can get with the GL core profile.

Patches 1-3:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

---
 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,


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to