tgsi: add ATOMICINC_WRAP/ATOMICDEC_WRAP opcode
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Fri, 12 Jul 2019 13:54:17 +0000 (15:54 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 6 Aug 2019 21:40:34 +0000 (17:40 -0400)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/tgsi/tgsi_info.c
src/gallium/auxiliary/tgsi/tgsi_info_opcodes.h
src/gallium/auxiliary/tgsi/tgsi_scan.c
src/gallium/docs/source/tgsi.rst
src/gallium/include/pipe/p_shader_tokens.h
src/mesa/state_tracker/st_glsl_to_tgsi.cpp
src/mesa/state_tracker/st_glsl_to_tgsi_private.h

index 37e16cca4281e0d058018327d8a63b2370bf65ac..477876d7e5284e3d55b6ab6e61ea9eb798ca0145 100644 (file)
@@ -263,7 +263,8 @@ tgsi_opcode_infer_src_type(enum tgsi_opcode opcode, uint src_idx)
       return TGSI_TYPE_UNSIGNED;
 
    if (src_idx == 1 &&
-       opcode >= TGSI_OPCODE_ATOMUADD && opcode <= TGSI_OPCODE_ATOMIMAX)
+       ((opcode >= TGSI_OPCODE_ATOMUADD && opcode <= TGSI_OPCODE_ATOMIMAX) ||
+       opcode == TGSI_OPCODE_ATOMINC_WRAP || opcode == TGSI_OPCODE_ATOMDEC_WRAP))
       return TGSI_TYPE_UNSIGNED;
 
    switch (opcode) {
index f391b0cea6b0fee50bf422652993294bb34956fd..0b9b264bc53384049388da74938e305de880eadd 100644 (file)
@@ -250,3 +250,5 @@ OPCODE(1, 2, COMP, I64MOD)
 OPCODE(1, 2, COMP, U64MOD)
 OPCODE(1, 2, COMP, DDIV)
 OPCODE(1, 3, OTHR, LOD)
+OPCODE(1, 3, OTHR, ATOMINC_WRAP, .is_store = 1)
+OPCODE(1, 3, OTHR, ATOMDEC_WRAP, .is_store = 1)
index 37a223a0f68ee0d7e533b47b80df4b885c8dcf22..3ed8d1a3ed3fd9f4196e321e9672ddb14378afdc 100644 (file)
@@ -392,6 +392,8 @@ scan_instruction(struct tgsi_shader_info *info,
    case TGSI_OPCODE_ATOMIMIN:
    case TGSI_OPCODE_ATOMIMAX:
    case TGSI_OPCODE_ATOMFADD:
+   case TGSI_OPCODE_ATOMINC_WRAP:
+   case TGSI_OPCODE_ATOMDEC_WRAP:
       if (tgsi_is_bindless_image_file(fullinst->Src[0].Register.File)) {
          info->uses_bindless_images = true;
 
index 59410cfd663dd518ac853c31d8f0acdd8ff621ab..17ad097e85e8f072293fdc0b71303ca822cd39fc 100644 (file)
@@ -2834,6 +2834,36 @@ These atomic operations may only be used with 32-bit integer image formats.
   resource[offset] = (dst_x > src_x ? dst_x : src_x)
 
 
+.. opcode:: ATOMINC_WRAP - Atomic increment + wrap around
+
+  Syntax: ``ATOMINC_WRAP dst, resource, offset, src``
+
+  Example: ``ATOMINC_WRAP TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
+
+  The following operation is performed atomically:
+
+.. math::
+
+  dst_x = resource[offset] + 1
+
+  resource[offset] = dst_x < src_x ? dst_x : 0
+
+
+.. opcode:: ATOMDEC_WRAP - Atomic decrement + wrap around
+
+  Syntax: ``ATOMDEC_WRAP dst, resource, offset, src``
+
+  Example: ``ATOMDEC_WRAP TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
+
+  The following operation is performed atomically:
+
+.. math::
+
+  dst_x = resource[offset]
+
+  resource[offset] = (dst_x > 0 && dst_x < src_x) ? dst_x - 1 : 0
+
+
 .. _interlaneopcodes:
 
 Inter-lane opcodes
index 8f290615c3f27622f89782be8b431c1ddc605047..e708f68745fb7c99bfe7ba1f05b0c8174bacd269 100644 (file)
@@ -612,7 +612,10 @@ enum tgsi_opcode {
 
    TGSI_OPCODE_LOD                = 249,
 
-   TGSI_OPCODE_LAST               = 250,
+   TGSI_OPCODE_ATOMINC_WRAP       = 250,
+   TGSI_OPCODE_ATOMDEC_WRAP       = 251,
+
+   TGSI_OPCODE_LAST               = 252,
 };
 
 
index 3c6e9601655e3d8ecba0adc08cf7b7eed803acee..ad5c2f5e623d7f46c3f624d862854375085b1b77 100644 (file)
@@ -6241,6 +6241,8 @@ compile_tgsi_instruction(struct st_translate *t,
    case TGSI_OPCODE_ATOMIMAX:
    case TGSI_OPCODE_ATOMFADD:
    case TGSI_OPCODE_IMG2HND:
+   case TGSI_OPCODE_ATOMINC_WRAP:
+   case TGSI_OPCODE_ATOMDEC_WRAP:
       for (i = num_src - 1; i >= 0; i--)
          src[i + 1] = src[i];
       num_src++;
index 6b5d82780275665a946e6fc58d81159dfc1a450b..939da3b6ae65d52bd873a8f38488fd00e6b9918e 100644 (file)
@@ -182,6 +182,8 @@ is_resource_instruction(unsigned opcode)
    case TGSI_OPCODE_ATOMIMIN:
    case TGSI_OPCODE_ATOMIMAX:
    case TGSI_OPCODE_ATOMFADD:
+   case TGSI_OPCODE_ATOMINC_WRAP:
+   case TGSI_OPCODE_ATOMDEC_WRAP:
    case TGSI_OPCODE_IMG2HND:
       return true;
    default: