agx: Handle layered block image stores

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
Alyssa Rosenzweig
2023-08-28 11:40:39 -04:00
parent c3a208d6d9
commit 175819eec6
3 changed files with 31 additions and 6 deletions

View File

@@ -635,14 +635,33 @@ agx_emit_block_image_store(agx_builder *b, nir_intrinsic_instr *instr)
{
unsigned image = nir_src_as_uint(instr->src[0]);
agx_index offset = agx_src_index(&instr->src[1]);
agx_index layer = agx_src_index(&instr->src[2]);
enum agx_format format = agx_format_for_pipe(nir_intrinsic_format(instr));
enum agx_dim dim = agx_tex_dim(nir_intrinsic_image_dim(instr), false);
bool ms = nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS;
bool array = nir_intrinsic_image_array(instr);
enum agx_dim dim = agx_tex_dim(nir_intrinsic_image_dim(instr), array);
/* Modified coordinate descriptor */
agx_index coords;
if (array) {
coords = agx_temp(b->shader, AGX_SIZE_32);
agx_emit_collect_to(
b, coords, 2,
(agx_index[]){
ms ? agx_mov_imm(b, 16, 0) : layer,
ms ? layer : agx_mov_imm(b, 16, 0xFFFF) /* TODO: Why can't zero? */,
});
} else {
coords = agx_null();
}
// XXX: how does this possibly work
if (format == AGX_FORMAT_F16)
format = AGX_FORMAT_I16;
return agx_block_image_store(b, agx_immediate(image), offset, format, dim);
return agx_block_image_store(b, agx_immediate(image), offset, coords, format,
dim);
}
static agx_instr *