asahi: Implement load_ssbo_address/get_ssbo_size

More uniforms that get pushed.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21062>
This commit is contained in:
Alyssa Rosenzweig
2022-12-02 21:34:33 -05:00
committed by Marge Bot
parent 78c9344a4d
commit 57e0dbe55b
3 changed files with 30 additions and 0 deletions
@@ -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;
}
+4
View 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 */
+20
View File
@@ -39,6 +39,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)
{
@@ -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);