Signed-off-by: Ilia Mirkin <[email protected]>
---
 .../drivers/freedreno/ir3/ir3_compiler_nir.c       |  3 +-
 src/gallium/drivers/freedreno/ir3/ir3_shader.c     | 42 ++++++++++++++++++++++
 src/gallium/drivers/freedreno/ir3/ir3_shader.h     |  4 ++-
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c 
b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
index 2b9d200..84f1770 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
@@ -264,7 +264,8 @@ compile_init(struct ir3_compiler *compiler,
         */
 
        /* reserve 4 (vec4) slots for ubo base addresses: */
-       so->first_immediate += 4;
+       /* reserve 8 (vec4) slots for buffer base addresses: */
+       so->first_immediate += 12;
 
        if (so->type == SHADER_VERTEX) {
                /* driver params (see ir3_driver_param): */
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c 
b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
index 7b56533..44a4d5e 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
@@ -528,6 +528,34 @@ emit_ubos(struct ir3_shader_variant *v, struct 
fd_ringbuffer *ring,
 }
 
 static void
+emit_buffers(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
+                        struct pipe_shader_buffer *buffers)
+{
+       uint32_t offset = v->first_driver_param + IR3_BUFS_OFF;
+       if (v->constlen > offset) {
+               struct fd_context *ctx = fd_context(v->shader->pctx);
+               uint32_t params = MIN2(4, v->constlen - offset) * 4;
+               uint32_t offsets[params];
+               struct fd_bo *bos[params];
+
+               for (uint32_t i = 0; i < params; i++) {
+                       struct pipe_shader_buffer *sb = &buffers[i];
+
+                       if (sb->buffer) {
+                               offsets[i] = sb->buffer_offset;
+                               bos[i] = fd_resource(sb->buffer)->bo;
+                       } else {
+                               offsets[i] = 0;
+                               bos[i] = NULL;
+                       }
+               }
+
+               fd_wfi(ctx, ring);
+               ctx->emit_const_bo(ring, v->type, true, offset * 4, params, 
bos, offsets);
+       }
+}
+
+static void
 emit_immediates(struct ir3_shader_variant *v, struct fd_ringbuffer *ring)
 {
        struct fd_context *ctx = fd_context(v->shader->pctx);
@@ -655,6 +683,20 @@ ir3_emit_consts(struct ir3_shader_variant *v, struct 
fd_ringbuffer *ring,
                        emit_immediates(v, ring);
        }
 
+       if (dirty & (FD_DIRTY_PROG | FD_DIRTY_BUFFERS)) {
+               struct pipe_shader_buffer *buffers;
+
+               if (v->type == SHADER_VERTEX) {
+                       buffers = ctx->buffers[PIPE_SHADER_VERTEX];
+               } else if (v->type == SHADER_FRAGMENT) {
+                       buffers = ctx->buffers[PIPE_SHADER_FRAGMENT];
+               } else {
+                       unreachable("bad shader type");
+               }
+
+               emit_buffers(v, ring, buffers);
+       }
+
        /* emit driver params every time: */
        /* TODO skip emit if shader doesn't use driver params to avoid WFI.. */
        if (info && (v->type == SHADER_VERTEX)) {
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h 
b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
index 6dc0ce1..25c1709 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
@@ -50,6 +50,7 @@ enum ir3_driver_param {
  *
  *    num_uniform * vec4  -  user consts
  *    4 * vec4            -  UBO addresses
+ *    8 * vec4            -  Buffer addresses
  *    if (vertex shader) {
  *        N * vec4        -  driver params (IR3_DP_*)
  *        1 * vec4        -  stream-out addresses
@@ -59,7 +60,8 @@ enum ir3_driver_param {
  * that we don't need..
  */
 #define IR3_UBOS_OFF         0  /* UBOs after user consts */
-#define IR3_DRIVER_PARAM_OFF 4  /* driver params after UBOs */
+#define IR3_BUFS_OFF         4  /* Buffers after UBOs */
+#define IR3_DRIVER_PARAM_OFF 12 /* driver params after buffers */
 #define IR3_TFBOS_OFF       (IR3_DRIVER_PARAM_OFF + IR3_DP_COUNT/4)
 
 /* Configuration key used to identify a shader variant.. different
-- 
2.4.9

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to