mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
pan/bi: Implement image_atomic_comp_swap
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9105>
This commit is contained in:
parent
078a84f474
commit
8081811f2e
1 changed files with 14 additions and 9 deletions
|
|
@ -619,17 +619,15 @@ bi_emit_axchg_to(bi_builder *b, bi_index dst, bi_index addr, nir_src *arg, enum
|
|||
* staging register passes */
|
||||
|
||||
static void
|
||||
bi_emit_acmpxchg(bi_builder *b, nir_intrinsic_instr *instr, enum bi_seg seg)
|
||||
bi_emit_acmpxchg_to(bi_builder *b, bi_index dst, bi_index addr, nir_src *arg_1, nir_src *arg_2, enum bi_seg seg)
|
||||
{
|
||||
assert(seg == BI_SEG_NONE || seg == BI_SEG_WLS);
|
||||
|
||||
bi_index addr = bi_src_index(&instr->src[0]);
|
||||
|
||||
/* hardware is swapped from NIR */
|
||||
bi_index src0 = bi_src_index(&instr->src[2]);
|
||||
bi_index src1 = bi_src_index(&instr->src[1]);
|
||||
bi_index src0 = bi_src_index(arg_2);
|
||||
bi_index src1 = bi_src_index(arg_1);
|
||||
|
||||
unsigned sz = nir_src_bit_size(instr->src[1]);
|
||||
unsigned sz = nir_src_bit_size(*arg_1);
|
||||
assert(sz == 32 || sz == 64);
|
||||
|
||||
bi_index data_words[] = {
|
||||
|
|
@ -654,7 +652,7 @@ bi_emit_acmpxchg(bi_builder *b, nir_intrinsic_instr *instr, enum bi_seg seg)
|
|||
bi_word(inout, 1),
|
||||
};
|
||||
|
||||
bi_make_vec_to(b, bi_dest_index(&instr->dest), inout_words, NULL, sz / 32, 32);
|
||||
bi_make_vec_to(b, dst, inout_words, NULL, sz / 32, 32);
|
||||
}
|
||||
|
||||
/* Extracts an atomic opcode */
|
||||
|
|
@ -1021,11 +1019,18 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr)
|
|||
break;
|
||||
|
||||
case nir_intrinsic_global_atomic_comp_swap:
|
||||
bi_emit_acmpxchg(b, instr, BI_SEG_NONE);
|
||||
bi_emit_acmpxchg_to(b, dst, bi_src_index(&instr->src[0]),
|
||||
&instr->src[1], &instr->src[2], BI_SEG_NONE);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_image_atomic_comp_swap:
|
||||
bi_emit_acmpxchg_to(b, dst, bi_emit_lea_image(b, instr),
|
||||
&instr->src[3], &instr->src[4], BI_SEG_NONE);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_shared_atomic_comp_swap:
|
||||
bi_emit_acmpxchg(b, instr, BI_SEG_WLS);
|
||||
bi_emit_acmpxchg_to(b, dst, bi_src_index(&instr->src[0]),
|
||||
&instr->src[1], &instr->src[2], BI_SEG_WLS);
|
||||
break;
|
||||
|
||||
case nir_intrinsic_load_frag_coord:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue