From d89890d000da36c51484ee170b2d9727d2766a93 Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Sun, 9 Oct 2016 19:21:33 +0200 Subject: tgsi/scan: handle indirect image indexing correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 23 +++++++++++++++-------- src/gallium/auxiliary/tgsi/tgsi_scan.h | 2 ++ 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'src/gallium/auxiliary') 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. -- cgit v1.2.3