From ff032297de942293614ee7b2831847e3e30782af Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 19 Apr 2024 22:05:53 -0400 Subject: [PATCH] asahi: support bigger buffer textures Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/lib/agx_nir_lower_texture.c | 4 ++-- src/asahi/lib/agx_nir_passes.h | 6 ++++++ src/gallium/drivers/asahi/agx_state.c | 6 +++--- src/gallium/drivers/asahi/agx_state.h | 6 ------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/asahi/lib/agx_nir_lower_texture.c b/src/asahi/lib/agx_nir_lower_texture.c index 8eef8406d1b..f1b6b696f9f 100644 --- a/src/asahi/lib/agx_nir_lower_texture.c +++ b/src/asahi/lib/agx_nir_lower_texture.c @@ -113,8 +113,8 @@ lower_tex_crawl(nir_builder *b, nir_instr *instr, UNUSED void *data) static nir_def * coords_for_buffer_texture(nir_builder *b, nir_def *coord) { - return nir_vec2(b, nir_iand_imm(b, coord, BITFIELD_MASK(10)), - nir_ushr_imm(b, coord, 10)); + return nir_vec2(b, nir_umod_imm(b, coord, AGX_TEXTURE_BUFFER_WIDTH), + nir_udiv_imm(b, coord, AGX_TEXTURE_BUFFER_WIDTH)); } /* diff --git a/src/asahi/lib/agx_nir_passes.h b/src/asahi/lib/agx_nir_passes.h index 1d2d4b9edaf..d750eedf845 100644 --- a/src/asahi/lib/agx_nir_passes.h +++ b/src/asahi/lib/agx_nir_passes.h @@ -16,6 +16,12 @@ struct nir_instr; /* Texture backend flags */ #define AGX_TEXTURE_FLAG_NO_CLAMP (1 << 0) +/* Texel buffers lowered to (at most) 16384x16384 2D textures */ +#define AGX_TEXTURE_BUFFER_WIDTH 16384 +#define AGX_TEXTURE_BUFFER_MAX_HEIGHT 16384 +#define AGX_TEXTURE_BUFFER_MAX_SIZE \ + (AGX_TEXTURE_BUFFER_WIDTH * AGX_TEXTURE_BUFFER_MAX_HEIGHT) + bool agx_nir_lower_texture_early(struct nir_shader *s, bool support_lod_bias); bool agx_nir_lower_texture(struct nir_shader *s); bool agx_nir_lower_multisampled_image_store(struct nir_shader *s); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 4df862e7f27..7a4cb130925 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -715,7 +715,7 @@ agx_pack_texture(void *out, struct agx_resource *rsrc, agx_texture_buffer_size_el(format, state->u.buf.size); /* Use a 2D texture to increase the maximum size */ - cfg.width = 1024; + cfg.width = AGX_TEXTURE_BUFFER_WIDTH; cfg.height = DIV_ROUND_UP(size_el, cfg.width); cfg.first_level = cfg.last_level = 0; @@ -1253,7 +1253,7 @@ agx_batch_upload_pbe(struct agx_batch *batch, struct agx_pbe_packed *out, cfg.buffer += view->u.buf.offset; /* Use a 2D texture to increase the maximum size */ - cfg.width = 1024; + cfg.width = AGX_TEXTURE_BUFFER_WIDTH; cfg.height = DIV_ROUND_UP(size_el, cfg.width); cfg.level = 0; cfg.stride = (cfg.width * util_format_get_blocksize(view->format)) - 4; @@ -1273,7 +1273,7 @@ agx_batch_upload_pbe(struct agx_batch *batch, struct agx_pbe_packed *out, cfg.dimension = AGX_TEXTURE_DIMENSION_2D; cfg.layout = AGX_LAYOUT_LINEAR; - cfg.width = 1024; + cfg.width = AGX_TEXTURE_BUFFER_WIDTH; cfg.height = DIV_ROUND_UP(size_px, cfg.width); cfg.stride = (cfg.width * blocksize_B) - 4; cfg.layers = 1; diff --git a/src/gallium/drivers/asahi/agx_state.h b/src/gallium/drivers/asahi/agx_state.h index 76cd5eb7718..0d47fa447a2 100644 --- a/src/gallium/drivers/asahi/agx_state.h +++ b/src/gallium/drivers/asahi/agx_state.h @@ -1160,12 +1160,6 @@ agx_render_condition_check(struct agx_context *ctx) return agx_render_condition_check_inner(ctx); } -/* Texel buffers lowered to (at most) 1024x16384 2D textures */ -#define AGX_TEXTURE_BUFFER_WIDTH 1024 -#define AGX_TEXTURE_BUFFER_MAX_HEIGHT 16384 -#define AGX_TEXTURE_BUFFER_MAX_SIZE \ - (AGX_TEXTURE_BUFFER_WIDTH * AGX_TEXTURE_BUFFER_MAX_HEIGHT) - static inline uint32_t agx_texture_buffer_size_el(enum pipe_format format, uint32_t size) {