diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c index 5db515a0753..99edf33c22e 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c @@ -4253,6 +4253,9 @@ exec_atomop_mem(struct tgsi_exec_machine *mach, if (val == value[0].u[0]) val = value2[0].u[0]; break; + case TGSI_OPCODE_ATOMFADD: + val = fui(r[0].f[0] + value[0].f[0]); + break; default: break; } @@ -5933,6 +5936,7 @@ exec_instruction( case TGSI_OPCODE_ATOMUMAX: case TGSI_OPCODE_ATOMIMIN: case TGSI_OPCODE_ATOMIMAX: + case TGSI_OPCODE_ATOMFADD: exec_atomop(mach, inst); break; diff --git a/src/gallium/auxiliary/tgsi/tgsi_info_opcodes.h b/src/gallium/auxiliary/tgsi/tgsi_info_opcodes.h index c3787c2fbb2..f391b0cea6b 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info_opcodes.h +++ b/src/gallium/auxiliary/tgsi/tgsi_info_opcodes.h @@ -101,7 +101,7 @@ OPCODE(0, 0, NONE, BGNLOOP, .is_branch = 1, .post_indent = 1) OPCODE(0, 0, NONE, BGNSUB, .post_indent = 1) OPCODE(0, 0, NONE, ENDLOOP, .is_branch = 1, .pre_dedent = 1) OPCODE(0, 0, NONE, ENDSUB, .pre_dedent = 1) -OPCODE_GAP(103) /* removed */ +OPCODE(1, 3, OTHR, ATOMFADD, .is_store = 1) OPCODE(1, 1, OTHR, TXQS, .is_tex = 1) OPCODE(1, 1, OTHR, RESQ) OPCODE(1, 1, COMP, READ_FIRST) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 4ca84902dd4..d776fc7bef1 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -391,6 +391,7 @@ scan_instruction(struct tgsi_shader_info *info, case TGSI_OPCODE_ATOMUMAX: case TGSI_OPCODE_ATOMIMIN: case TGSI_OPCODE_ATOMIMAX: + case TGSI_OPCODE_ATOMFADD: if (tgsi_is_bindless_image_file(fullinst->Src[0].Register.File)) { info->uses_bindless_images = true; diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.c b/src/gallium/auxiliary/tgsi/tgsi_util.c index ebbd561f7d0..1e5582ba273 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_util.c +++ b/src/gallium/auxiliary/tgsi/tgsi_util.c @@ -385,6 +385,7 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst, case TGSI_OPCODE_ATOMUMAX: case TGSI_OPCODE_ATOMIMIN: case TGSI_OPCODE_ATOMIMAX: + case TGSI_OPCODE_ATOMFADD: if (src_idx == 0) { read_mask = TGSI_WRITEMASK_XY; /* bindless handle possible */ } else if (src_idx == 1) { diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst index 7d4ebb62674..277f25ca41b 100644 --- a/src/gallium/docs/source/tgsi.rst +++ b/src/gallium/docs/source/tgsi.rst @@ -2684,6 +2684,21 @@ These atomic operations may only be used with 32-bit integer image formats. resource[offset] = dst_x + src_x +.. opcode:: ATOMFADD - Atomic floating point addition + + Syntax: ``ATOMFADD dst, resource, offset, src`` + + Example: ``ATOMFADD TEMP[0], BUFFER[0], TEMP[1], TEMP[2]`` + + The following operation is performed atomically: + +.. math:: + + dst_x = resource[offset] + + resource[offset] = dst_x + src_x + + .. opcode:: ATOMXCHG - Atomic exchange Syntax: ``ATOMXCHG dst, resource, offset, src`` diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h index bef826f23b5..8f290615c3f 100644 --- a/src/gallium/include/pipe/p_shader_tokens.h +++ b/src/gallium/include/pipe/p_shader_tokens.h @@ -442,7 +442,7 @@ enum tgsi_opcode { TGSI_OPCODE_BGNSUB = 100, TGSI_OPCODE_ENDLOOP = 101, TGSI_OPCODE_ENDSUB = 102, - /* gap */ + TGSI_OPCODE_ATOMFADD = 103, TGSI_OPCODE_TXQS = 104, TGSI_OPCODE_RESQ = 105, TGSI_OPCODE_READ_FIRST = 106,