diff options
author | Marek Olšák <[email protected]> | 2016-10-09 19:21:33 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-10-24 21:41:33 +0200 |
commit | d89890d000da36c51484ee170b2d9727d2766a93 (patch) | |
tree | b602ad3892512614975e5ad197e96fa0d602d502 | |
parent | ac37720f51310ad0398c4cd5c8921da5c96a7c9d (diff) |
tgsi/scan: handle indirect image indexing correctly
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.c | 23 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.h | 2 |
2 files changed, 17 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 66f1fdf2138..c27f0c6b89a 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -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; diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index 47528d5f12d..16f00348ac2 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -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. |