From 9d78e40735b9ef4e61a474d6b910b2b05334329a Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 2 Jan 2024 18:01:31 -0400 Subject: [PATCH] asahi: cl-ify some xfb logic Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/lib/agx_nir_lower_gs.c | 13 +++++-------- src/asahi/lib/shaders/geometry.cl | 11 +++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/asahi/lib/agx_nir_lower_gs.c b/src/asahi/lib/agx_nir_lower_gs.c index f2943884333..6be6b354900 100644 --- a/src/asahi/lib/agx_nir_lower_gs.c +++ b/src/asahi/lib/agx_nir_lower_gs.c @@ -631,14 +631,6 @@ write_xfb(nir_builder *b, struct lower_gs_state *state, unsigned stream, unsigned count = util_bitcount(output.component_mask); for (unsigned vert = 0; vert < verts; ++vert) { - nir_def *index = nir_iadd_imm(b, base_index, vert); - - nir_def *xfb_offset = - nir_iadd_imm(b, nir_imul_imm(b, index, stride), output.offset); - - nir_def *buf = load_geometry_param(b, xfb_base[buffer]); - nir_def *addr = nir_iadd(b, buf, nir_u2u64(b, xfb_offset)); - /* We write out the vertices backwards, since 0 is the current * emitted vertex (which is actually the last vertex). * @@ -657,6 +649,11 @@ write_xfb(nir_builder *b, struct lower_gs_state *state, unsigned stream, */ value = nir_pad_vector_imm_int(b, value, 0, 4); + nir_def *addr = libagx_xfb_vertex_address( + b, nir_load_geometry_param_buffer_agx(b), base_index, + nir_imm_int(b, vert), nir_imm_int(b, buffer), + nir_imm_int(b, stride), nir_imm_int(b, output.offset)); + nir_store_global(b, addr, 4, nir_channels(b, value, output.component_mask), nir_component_mask(count)); diff --git a/src/asahi/lib/shaders/geometry.cl b/src/asahi/lib/shaders/geometry.cl index e6b8b4bbf10..f13f26480e5 100644 --- a/src/asahi/lib/shaders/geometry.cl +++ b/src/asahi/lib/shaders/geometry.cl @@ -12,6 +12,17 @@ align(uint x, uint y) return (x + 1) & ~(y - 1); } +uint64_t +libagx_xfb_vertex_address(global struct agx_geometry_params *p, uint base_index, + uint vert, uint buffer, uint stride, + uint output_offset) +{ + uint index = base_index + vert; + uint xfb_offset = (index * stride) + output_offset; + + return (uintptr_t)(p->xfb_base[buffer]) + xfb_offset; +} + /* TODO: Primitive restart */ uint libagx_vertex_id_for_topology(enum mesa_prim mode, bool flatshade_first,