From 982e644d182bb98b13c1d91f24c9f1a9c1f2112a Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 1 Dec 2023 17:24:10 -0400 Subject: [PATCH] agx: don't produce split of immediate can't be consumed, affects KHR-GL42.shader_image_load_store.basic-allTargets-load-ms Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_compile.c | 6 ++++++ src/asahi/compiler/agx_optimizer.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index d69ca2df941..ea3b69779c4 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -249,6 +249,12 @@ agx_subdivide_to(agx_builder *b, agx_index dst, agx_index s0, unsigned comp) assert((s0.size == (dst.size + 1)) && "only 2x subdivide handled"); assert((comp == 0 || comp == 1) && "too many components"); + /* Handle immediates specially so we don't have to constant fold splits. */ + if (s0.type == AGX_INDEX_IMMEDIATE) { + unsigned bits = 16 * agx_size_align_16(dst.size); + return agx_mov_imm_to(b, dst, (s0.value >> bits) & BITFIELD64_MASK(bits)); + } + agx_instr *split = agx_split(b, 2, s0); split->dest[comp] = dst; split->dest[1 - comp] = agx_temp(b->shader, dst.size); diff --git a/src/asahi/compiler/agx_optimizer.c b/src/asahi/compiler/agx_optimizer.c index f017a53c58a..76f54515fca 100644 --- a/src/asahi/compiler/agx_optimizer.c +++ b/src/asahi/compiler/agx_optimizer.c @@ -163,6 +163,8 @@ agx_optimizer_inline_imm(agx_instr **defs, agx_instr *I, unsigned srcs, if ((I->op == AGX_OPCODE_LOCAL_LOAD || I->op == AGX_OPCODE_DEVICE_LOAD) && s != 1) continue; + if (I->op == AGX_OPCODE_SPLIT) + continue; if (I->op == AGX_OPCODE_IMAGE_WRITE && !image_write_source_can_be_immediate(I, s))