tgsi: add ATOMFADD operation
This is supported by at least NVIDIA hardware, and exposeable via GL extensions. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
bac8534267
commit
5574414edc
|
@ -4253,6 +4253,9 @@ exec_atomop_mem(struct tgsi_exec_machine *mach,
|
||||||
if (val == value[0].u[0])
|
if (val == value[0].u[0])
|
||||||
val = value2[0].u[0];
|
val = value2[0].u[0];
|
||||||
break;
|
break;
|
||||||
|
case TGSI_OPCODE_ATOMFADD:
|
||||||
|
val = fui(r[0].f[0] + value[0].f[0]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -5933,6 +5936,7 @@ exec_instruction(
|
||||||
case TGSI_OPCODE_ATOMUMAX:
|
case TGSI_OPCODE_ATOMUMAX:
|
||||||
case TGSI_OPCODE_ATOMIMIN:
|
case TGSI_OPCODE_ATOMIMIN:
|
||||||
case TGSI_OPCODE_ATOMIMAX:
|
case TGSI_OPCODE_ATOMIMAX:
|
||||||
|
case TGSI_OPCODE_ATOMFADD:
|
||||||
exec_atomop(mach, inst);
|
exec_atomop(mach, inst);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -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, BGNSUB, .post_indent = 1)
|
||||||
OPCODE(0, 0, NONE, ENDLOOP, .is_branch = 1, .pre_dedent = 1)
|
OPCODE(0, 0, NONE, ENDLOOP, .is_branch = 1, .pre_dedent = 1)
|
||||||
OPCODE(0, 0, NONE, ENDSUB, .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, TXQS, .is_tex = 1)
|
||||||
OPCODE(1, 1, OTHR, RESQ)
|
OPCODE(1, 1, OTHR, RESQ)
|
||||||
OPCODE(1, 1, COMP, READ_FIRST)
|
OPCODE(1, 1, COMP, READ_FIRST)
|
||||||
|
|
|
@ -391,6 +391,7 @@ scan_instruction(struct tgsi_shader_info *info,
|
||||||
case TGSI_OPCODE_ATOMUMAX:
|
case TGSI_OPCODE_ATOMUMAX:
|
||||||
case TGSI_OPCODE_ATOMIMIN:
|
case TGSI_OPCODE_ATOMIMIN:
|
||||||
case TGSI_OPCODE_ATOMIMAX:
|
case TGSI_OPCODE_ATOMIMAX:
|
||||||
|
case TGSI_OPCODE_ATOMFADD:
|
||||||
if (tgsi_is_bindless_image_file(fullinst->Src[0].Register.File)) {
|
if (tgsi_is_bindless_image_file(fullinst->Src[0].Register.File)) {
|
||||||
info->uses_bindless_images = true;
|
info->uses_bindless_images = true;
|
||||||
|
|
||||||
|
|
|
@ -385,6 +385,7 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
|
||||||
case TGSI_OPCODE_ATOMUMAX:
|
case TGSI_OPCODE_ATOMUMAX:
|
||||||
case TGSI_OPCODE_ATOMIMIN:
|
case TGSI_OPCODE_ATOMIMIN:
|
||||||
case TGSI_OPCODE_ATOMIMAX:
|
case TGSI_OPCODE_ATOMIMAX:
|
||||||
|
case TGSI_OPCODE_ATOMFADD:
|
||||||
if (src_idx == 0) {
|
if (src_idx == 0) {
|
||||||
read_mask = TGSI_WRITEMASK_XY; /* bindless handle possible */
|
read_mask = TGSI_WRITEMASK_XY; /* bindless handle possible */
|
||||||
} else if (src_idx == 1) {
|
} else if (src_idx == 1) {
|
||||||
|
|
|
@ -2684,6 +2684,21 @@ These atomic operations may only be used with 32-bit integer image formats.
|
||||||
resource[offset] = dst_x + src_x
|
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
|
.. opcode:: ATOMXCHG - Atomic exchange
|
||||||
|
|
||||||
Syntax: ``ATOMXCHG dst, resource, offset, src``
|
Syntax: ``ATOMXCHG dst, resource, offset, src``
|
||||||
|
|
|
@ -442,7 +442,7 @@ enum tgsi_opcode {
|
||||||
TGSI_OPCODE_BGNSUB = 100,
|
TGSI_OPCODE_BGNSUB = 100,
|
||||||
TGSI_OPCODE_ENDLOOP = 101,
|
TGSI_OPCODE_ENDLOOP = 101,
|
||||||
TGSI_OPCODE_ENDSUB = 102,
|
TGSI_OPCODE_ENDSUB = 102,
|
||||||
/* gap */
|
TGSI_OPCODE_ATOMFADD = 103,
|
||||||
TGSI_OPCODE_TXQS = 104,
|
TGSI_OPCODE_TXQS = 104,
|
||||||
TGSI_OPCODE_RESQ = 105,
|
TGSI_OPCODE_RESQ = 105,
|
||||||
TGSI_OPCODE_READ_FIRST = 106,
|
TGSI_OPCODE_READ_FIRST = 106,
|
||||||
|
|
Loading…
Reference in New Issue