tgsi/scan: handle indirect image indexing correctly
authorMarek Olšák <marek.olsak@amd.com>
Sun, 9 Oct 2016 17:21:33 +0000 (19:21 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 24 Oct 2016 19:41:33 +0000 (21:41 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/tgsi/tgsi_scan.c
src/gallium/auxiliary/tgsi/tgsi_scan.h

index 66f1fdf2138e242164cb7198f35f3b888b1eb8b1..c27f0c6b89acba70c9da39a763a52e9410cd1cac 100644 (file)
@@ -334,9 +334,12 @@ scan_instruction(struct tgsi_shader_info *info,
          if (tgsi_get_opcode_info(fullinst->Instruction.Opcode)->is_store) {
             info->writes_memory = TRUE;
 
-            if (src->Register.File == TGSI_FILE_IMAGE &&
-                !src->Register.Indirect)
-               info->images_writemask |= 1 << src->Register.Index;
+            if (src->Register.File == TGSI_FILE_IMAGE) {
+               if (src->Register.Indirect)
+                  info->images_writemask = info->images_declared;
+               else
+                  info->images_writemask |= 1 << src->Register.Index;
+            }
          }
       }
    }
@@ -358,9 +361,12 @@ scan_instruction(struct tgsi_shader_info *info,
          is_mem_inst = true;
          info->writes_memory = TRUE;
 
-         if (dst->Register.File == TGSI_FILE_IMAGE &&
-             !dst->Register.Indirect)
-            info->images_writemask |= 1 << dst->Register.Index;
+         if (dst->Register.File == TGSI_FILE_IMAGE) {
+            if (dst->Register.Indirect)
+               info->images_writemask = info->images_declared;
+            else
+               info->images_writemask |= 1 << dst->Register.Index;
+         }
       }
    }
 
@@ -419,8 +425,9 @@ scan_declaration(struct tgsi_shader_info *info,
          info->const_file_max[buffer] =
             MAX2(info->const_file_max[buffer], (int)reg);
          info->const_buffers_declared |= 1u << buffer;
-      }
-      else if (file == TGSI_FILE_INPUT) {
+      } else if (file == TGSI_FILE_IMAGE) {
+         info->images_declared |= 1u << reg;
+      } else if (file == TGSI_FILE_INPUT) {
          info->input_semantic_name[reg] = (ubyte) semName;
          info->input_semantic_index[reg] = (ubyte) semIndex;
          info->input_interpolate[reg] = (ubyte)fulldecl->Interp.Interpolate;
index 47528d5f12deffcfb230204412ebac191b46d72e..16f00348ac225204a07e53c90840133f730388bc 100644 (file)
@@ -122,6 +122,8 @@ struct tgsi_shader_info
    unsigned culldist_writemask;
    unsigned num_written_culldistance;
    unsigned num_written_clipdistance;
+
+   unsigned images_declared; /**< bitmask of declared images */
    /**
     * Bitmask indicating which images are written to (STORE / ATOM*).
     * Indirect image accesses are not reflected in this mask.