[Mesa-dev] [PATCH 1/2] tgsi/scan: record compute shader system value usage
Nicolai Hähnle
nhaehnle at gmail.com
Tue Apr 25 06:23:24 UTC 2017
On 24.04.2017 18:22, Marek Olšák wrote:
> 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;
> + }
This should be simplified by using swizzle[i] directly as an index into
the arrays, and a guard (or possibly even assert?) against SWIZZLE_W.
With that fixed,
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
> + }
> + 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;
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list