diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.c | 33 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.h | 4 |
2 files changed, 37 insertions, 0 deletions
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; |