From 6447abf3736fef95b7135580ce2e9bbea3eb5f96 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 14 Apr 2017 00:04:05 +0200 Subject: [PATCH] tgsi/scan: record bindless samplers/images usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Samuel Pitoiset Reviewed-by: Nicolai Hähnle Reviewed-by: Marek Olšák --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 39 ++++++++++++++++++++++++++ src/gallium/auxiliary/tgsi/tgsi_scan.h | 10 +++++++ 2 files changed, 49 insertions(+) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 018ca4b5bd4..6e51972e5d5 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -352,6 +352,7 @@ scan_instruction(struct tgsi_shader_info *info, unsigned i; bool is_mem_inst = false; bool is_interp_instruction = false; + unsigned sampler_src; assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST); info->opcode_count[fullinst->Instruction.Opcode]++; @@ -367,6 +368,44 @@ scan_instruction(struct tgsi_shader_info *info, case TGSI_OPCODE_ENDLOOP: (*current_depth)--; break; + case TGSI_OPCODE_TEX: + case TGSI_OPCODE_TEX_LZ: + case TGSI_OPCODE_TXB: + case TGSI_OPCODE_TXD: + case TGSI_OPCODE_TXL: + case TGSI_OPCODE_TXP: + case TGSI_OPCODE_TXQ: + case TGSI_OPCODE_TXQS: + case TGSI_OPCODE_TXF: + case TGSI_OPCODE_TXF_LZ: + case TGSI_OPCODE_TEX2: + case TGSI_OPCODE_TXB2: + case TGSI_OPCODE_TXL2: + case TGSI_OPCODE_TG4: + case TGSI_OPCODE_LODQ: + sampler_src = fullinst->Instruction.NumSrcRegs - 1; + if (fullinst->Src[sampler_src].Register.File != TGSI_FILE_SAMPLER) + info->uses_bindless_samplers = true; + break; + case TGSI_OPCODE_RESQ: + case TGSI_OPCODE_LOAD: + case TGSI_OPCODE_ATOMUADD: + case TGSI_OPCODE_ATOMXCHG: + case TGSI_OPCODE_ATOMCAS: + case TGSI_OPCODE_ATOMAND: + case TGSI_OPCODE_ATOMOR: + case TGSI_OPCODE_ATOMXOR: + case TGSI_OPCODE_ATOMUMIN: + case TGSI_OPCODE_ATOMUMAX: + case TGSI_OPCODE_ATOMIMIN: + case TGSI_OPCODE_ATOMIMAX: + if (tgsi_is_bindless_image_file(fullinst->Src[0].Register.File)) + info->uses_bindless_images = true; + break; + case TGSI_OPCODE_STORE: + if (tgsi_is_bindless_image_file(fullinst->Dst[0].Register.File)) + info->uses_bindless_images = true; + break; default: break; } diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index af1651b7e82..cfec9daede5 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -135,6 +135,8 @@ struct tgsi_shader_info boolean is_msaa_sampler[PIPE_MAX_SAMPLERS]; boolean uses_doubles; /**< uses any of the double instructions */ boolean uses_derivatives; + boolean uses_bindless_samplers; + boolean uses_bindless_images; unsigned clipdist_writemask; unsigned culldist_writemask; unsigned num_written_culldistance; @@ -196,6 +198,14 @@ tgsi_scan_arrays(const struct tgsi_token *tokens, unsigned max_array_id, struct tgsi_array_info *arrays); +inline bool +tgsi_is_bindless_image_file(unsigned file) +{ + return file != TGSI_FILE_IMAGE && + file != TGSI_FILE_MEMORY && + file != TGSI_FILE_BUFFER; +} + #ifdef __cplusplus } // extern "C" #endif -- 2.30.2