[Mesa-dev] [PATCH 1/2] tgsi/scan: record compute shader system value usage
Marek Olšák
maraeo at gmail.com
Mon Apr 24 16:22:48 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
---
src/gallium/auxiliary/tgsi/tgsi_scan.c | 47 ++++++++++++++++++++++++++++++++++
src/gallium/auxiliary/tgsi/tgsi_scan.h | 4 +++
2 files changed, 51 insertions(+)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
index bf614db..885a60d 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
@@ -108,20 +108,67 @@ static void
scan_src_operand(struct tgsi_shader_info *info,
const struct tgsi_full_instruction *fullinst,
const struct tgsi_full_src_register *src,
unsigned src_index,
unsigned usage_mask,
bool is_interp_instruction,
bool *is_mem_inst)
{
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++) {
+ switch (swizzle[i]) {
+ case TGSI_SWIZZLE_X:
+ if (name == TGSI_SEMANTIC_THREAD_ID)
+ info->uses_thread_id[0] = true;
+ else
+ info->uses_block_id[0] = true;
+ break;
+ case TGSI_SWIZZLE_Y:
+ if (name == TGSI_SEMANTIC_THREAD_ID)
+ info->uses_thread_id[1] = true;
+ else
+ info->uses_block_id[1] = true;
+ break;
+ case TGSI_SWIZZLE_Z:
+ if (name == TGSI_SEMANTIC_THREAD_ID)
+ info->uses_thread_id[2] = true;
+ else
+ info->uses_block_id[2] = true;
+ break;
+ }
+ }
+ 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) {
for (ind = 0; ind < info->num_inputs; ++ind) {
info->input_usage_mask[ind] |= usage_mask;
}
} else {
assert(ind >= 0);
assert(ind < PIPE_MAX_SHADER_INPUTS);
info->input_usage_mask[ind] |= usage_mask;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h
index 3854827..98387c9 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_scan.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h
@@ -114,20 +114,24 @@ struct tgsi_shader_info
boolean uses_linear_opcode_interp_centroid;
boolean uses_linear_opcode_interp_offset;
boolean uses_linear_opcode_interp_sample;
boolean uses_instanceid;
boolean uses_vertexid;
boolean uses_vertexid_nobase;
boolean uses_basevertex;
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;
boolean writes_primid;
boolean writes_viewport_index;
boolean writes_layer;
boolean writes_memory; /**< contains stores or atomics to buffers or images */
boolean is_msaa_sampler[PIPE_MAX_SAMPLERS];
boolean uses_doubles; /**< uses any of the double instructions */
boolean uses_derivatives;
--
2.7.4
More information about the mesa-dev
mailing list