asahi: Implement load_ssbo_address/get_ssbo_size
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sat, 3 Dec 2022 02:34:33 +0000 (21:34 -0500)
committerMarge Bot <emma+marge@anholt.net>
Sat, 4 Feb 2023 17:10:15 +0000 (17:10 +0000)
More uniforms that get pushed.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21062>

src/gallium/drivers/asahi/agx_nir_lower_sysvals.c
src/gallium/drivers/asahi/agx_state.h
src/gallium/drivers/asahi/agx_uniforms.c

index 77568ac..050bab9 100644 (file)
@@ -66,6 +66,12 @@ pass(struct nir_builder *b, nir_instr *instr, void *data)
    case nir_intrinsic_load_blend_const_color_a_float:
       ptr = &u->fs.blend_constant[3];
       break;
+   case nir_intrinsic_load_ssbo_address:
+      ptr = &u->ssbo_base[nir_src_as_uint(intr->src[0])];
+      break;
+   case nir_intrinsic_get_ssbo_size:
+      ptr = &u->ssbo_size[nir_src_as_uint(intr->src[0])];
+      break;
    default:
       return false;
    }
index 3d728ea..6133f4d 100644 (file)
@@ -75,6 +75,10 @@ struct PACKED agx_draw_uniforms {
    /* Uniform buffer objects */
    uint64_t ubo_base[PIPE_MAX_CONSTANT_BUFFERS];
 
+   /* Shader storage buffer objects */
+   uint64_t ssbo_base[PIPE_MAX_SHADER_BUFFERS];
+   uint32_t ssbo_size[PIPE_MAX_SHADER_BUFFERS];
+
    union {
       struct {
          /* Vertex buffer object bases, if present */
index 4d2c5b5..1149cc3 100644 (file)
@@ -40,6 +40,21 @@ agx_const_buffer_ptr(struct agx_batch *batch, struct pipe_constant_buffer *cb)
 }
 
 static uint64_t
+agx_shader_buffer_ptr(struct agx_batch *batch, struct pipe_shader_buffer *sb)
+{
+   if (sb->buffer) {
+      struct agx_resource *rsrc = agx_resource(sb->buffer);
+
+      /* Assume SSBOs are written. TODO: Optimize read-only SSBOs */
+      agx_batch_writes(batch, rsrc);
+
+      return rsrc->bo->ptr.gpu + sb->buffer_offset;
+   } else {
+      return 0;
+   }
+}
+
+static uint64_t
 agx_vertex_buffer_ptr(struct agx_batch *batch, unsigned vbo)
 {
    struct pipe_vertex_buffer vb = batch->ctx->vertex_buffers[vbo];
@@ -68,6 +83,11 @@ agx_upload_uniforms(struct agx_batch *batch, uint64_t textures,
       uniforms.ubo_base[cb] = agx_const_buffer_ptr(batch, &st->cb[cb]);
    }
 
+   u_foreach_bit(cb, st->ssbo_mask) {
+      uniforms.ssbo_base[cb] = agx_shader_buffer_ptr(batch, &st->ssbo[cb]);
+      uniforms.ssbo_size[cb] = st->ssbo[cb].buffer_size;
+   }
+
    if (stage == PIPE_SHADER_VERTEX) {
       u_foreach_bit(vbo, ctx->vb_mask) {
          uniforms.vs.vbo_base[vbo] = agx_vertex_buffer_ptr(batch, vbo);