From 46e48d404417ffe3c619287d6504f0504357d8b2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 24 Apr 2017 16:29:22 +0200 Subject: [PATCH] tgsi/scan: record compute shader system value usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit v2: just do indexing with swizzle[i] Reviewed-by: Nicolai Hähnle --- src/gallium/auxiliary/tgsi/tgsi_scan.c | 33 ++++++++++++++++++++++++++ src/gallium/auxiliary/tgsi/tgsi_scan.h | 4 ++++ 2 files changed, 37 insertions(+) diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index bf614db8060..d1ef769ec4d 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -115,6 +115,39 @@ scan_src_operand(struct tgsi_shader_info *info, { int ind = src->Register.Index; + if (info->processor == PIPE_SHADER_COMPUTE && + src->Register.File == TGSI_FILE_SYSTEM_VALUE) { + unsigned swizzle[4], i, name; + + name = info->system_value_semantic_name[src->Register.Index]; + swizzle[0] = src->Register.SwizzleX; + swizzle[1] = src->Register.SwizzleY; + swizzle[2] = src->Register.SwizzleZ; + swizzle[3] = src->Register.SwizzleW; + + switch (name) { + case TGSI_SEMANTIC_THREAD_ID: + case TGSI_SEMANTIC_BLOCK_ID: + for (i = 0; i < 4; i++) { + if (swizzle[i] <= TGSI_SWIZZLE_Z) { + if (name == TGSI_SEMANTIC_THREAD_ID) + info->uses_thread_id[swizzle[i]] = true; + else + info->uses_block_id[swizzle[i]] = true; + } + } + break; + case TGSI_SEMANTIC_BLOCK_SIZE: + /* The block size is translated to IMM with a fixed block size. */ + if (info->properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] == 0) + info->uses_block_size = true; + break; + case TGSI_SEMANTIC_GRID_SIZE: + info->uses_grid_size = true; + break; + } + } + /* Mark which inputs are effectively used */ if (src->Register.File == TGSI_FILE_INPUT) { if (src->Register.Indirect) { diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index 3854827e5cb..98387c982c6 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -121,6 +121,10 @@ struct tgsi_shader_info boolean uses_primid; boolean uses_frontface; boolean uses_invocationid; + boolean uses_thread_id[3]; + boolean uses_block_id[3]; + boolean uses_block_size; + boolean uses_grid_size; boolean writes_position; boolean writes_psize; boolean writes_clipvertex; -- 2.30.2