[Mesa-dev] [PATCH 08/61] radeonsi: turn si_shader_key::mono into a non-union

Nicolai Hähnle nhaehnle at gmail.com
Tue Apr 25 18:18:53 UTC 2017


On 24.04.2017 10:45, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> A merged LS-HS shader needs both fix_fetch and inputs_to_copy
> for compilation.

Patches 5-8:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> ---
>  src/gallium/drivers/radeonsi/si_shader.c        | 10 +++++-----
>  src/gallium/drivers/radeonsi/si_shader.h        | 12 ++++--------
>  src/gallium/drivers/radeonsi/si_state_shaders.c |  4 ++--
>  3 files changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 840742c..0afa888 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -357,21 +357,21 @@ static void declare_input_vs(
>  	t_list_ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_VERTEX_BUFFERS);
>
>  	t_offset = LLVMConstInt(ctx->i32, input_index, 0);
>
>  	t_list = ac_build_indexed_load_const(&ctx->ac, t_list_ptr, t_offset);
>
>  	vertex_index = LLVMGetParam(ctx->main_fn,
>  				    ctx->param_vertex_index0 +
>  				    input_index);
>
> -	fix_fetch = ctx->shader->key.mono.vs.fix_fetch[input_index];
> +	fix_fetch = ctx->shader->key.mono.vs_fix_fetch[input_index];
>
>  	/* Do multiple loads for special formats. */
>  	switch (fix_fetch) {
>  	case SI_FIX_FETCH_RGB_64_FLOAT:
>  		num_fetches = 3; /* 3 2-dword loads */
>  		fetch_stride = 8;
>  		break;
>  	case SI_FIX_FETCH_RGBA_64_FLOAT:
>  		num_fetches = 2; /* 2 4-dword loads */
>  		fetch_stride = 16;
> @@ -2420,21 +2420,21 @@ static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
>  	                LLVMConstInt(ctx->i32, SI_HS_RING_TESS_OFFCHIP, 0));
>
>  	buffer_offset = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);
>
>  	lds_vertex_stride = unpack_param(ctx, SI_PARAM_TCS_IN_LAYOUT, 24, 8);
>  	lds_vertex_offset = LLVMBuildMul(gallivm->builder, invocation_id,
>  	                                 lds_vertex_stride, "");
>  	lds_base = get_tcs_in_current_patch_offset(ctx);
>  	lds_base = LLVMBuildAdd(gallivm->builder, lds_base, lds_vertex_offset, "");
>
> -	inputs = ctx->shader->key.mono.tcs.inputs_to_copy;
> +	inputs = ctx->shader->key.mono.ff_tcs_inputs_to_copy;
>  	while (inputs) {
>  		unsigned i = u_bit_scan64(&inputs);
>
>  		LLVMValueRef lds_ptr = LLVMBuildAdd(gallivm->builder, lds_base,
>  		                            LLVMConstInt(ctx->i32, 4 * i, 0),
>  		                             "");
>
>  		LLVMValueRef buffer_addr = get_tcs_tes_buffer_address(ctx,
>  					      get_rel_patch_id(ctx),
>  		                              invocation_id,
> @@ -6654,29 +6654,29 @@ static void si_dump_shader_key(unsigned shader, struct si_shader_key *key,
>  	case PIPE_SHADER_VERTEX:
>  		fprintf(f, "  part.vs.prolog.instance_divisors = {");
>  		for (i = 0; i < ARRAY_SIZE(key->part.vs.prolog.instance_divisors); i++)
>  			fprintf(f, !i ? "%u" : ", %u",
>  				key->part.vs.prolog.instance_divisors[i]);
>  		fprintf(f, "}\n");
>  		fprintf(f, "  part.vs.epilog.export_prim_id = %u\n", key->part.vs.epilog.export_prim_id);
>  		fprintf(f, "  as_es = %u\n", key->as_es);
>  		fprintf(f, "  as_ls = %u\n", key->as_ls);
>
> -		fprintf(f, "  mono.vs.fix_fetch = {");
> +		fprintf(f, "  mono.vs_fix_fetch = {");
>  		for (i = 0; i < SI_MAX_ATTRIBS; i++)
> -			fprintf(f, !i ? "%u" : ", %u", key->mono.vs.fix_fetch[i]);
> +			fprintf(f, !i ? "%u" : ", %u", key->mono.vs_fix_fetch[i]);
>  		fprintf(f, "}\n");
>  		break;
>
>  	case PIPE_SHADER_TESS_CTRL:
>  		fprintf(f, "  part.tcs.epilog.prim_mode = %u\n", key->part.tcs.epilog.prim_mode);
> -		fprintf(f, "  mono.tcs.inputs_to_copy = 0x%"PRIx64"\n", key->mono.tcs.inputs_to_copy);
> +		fprintf(f, "  mono.ff_tcs_inputs_to_copy = 0x%"PRIx64"\n", key->mono.ff_tcs_inputs_to_copy);
>  		break;
>
>  	case PIPE_SHADER_TESS_EVAL:
>  		fprintf(f, "  part.tes.epilog.export_prim_id = %u\n", key->part.tes.epilog.export_prim_id);
>  		fprintf(f, "  as_es = %u\n", key->as_es);
>  		break;
>
>  	case PIPE_SHADER_GEOMETRY:
>  		fprintf(f, "  part.gs.prolog.tri_strip_adj_fix = %u\n", key->part.gs.prolog.tri_strip_adj_fix);
>  		break;
> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
> index cfa691b..05c0e62 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.h
> +++ b/src/gallium/drivers/radeonsi/si_shader.h
> @@ -444,28 +444,24 @@ struct si_shader_key {
>  		} ps;
>  	} part;
>
>  	/* These two are initially set according to the NEXT_SHADER property,
>  	 * or guessed if the property doesn't seem correct.
>  	 */
>  	unsigned as_es:1; /* export shader, which precedes GS */
>  	unsigned as_ls:1; /* local shader, which precedes TCS */
>
>  	/* Flags for monolithic compilation only. */
> -	union {
> -		struct {
> -			/* One byte for every input: SI_FIX_FETCH_* enums. */
> -			uint8_t		fix_fetch[SI_MAX_ATTRIBS];
> -		} vs;
> -		struct {
> -			uint64_t	inputs_to_copy; /* for fixed-func TCS */
> -		} tcs;
> +	struct {
> +		/* One byte for every input: SI_FIX_FETCH_* enums. */
> +		uint8_t		vs_fix_fetch[SI_MAX_ATTRIBS];
> +		uint64_t	ff_tcs_inputs_to_copy; /* for fixed-func TCS */
>  	} mono;
>
>  	/* Optimization flags for asynchronous compilation only. */
>  	union {
>  		struct {
>  			uint64_t	kill_outputs; /* "get_unique_index" bits */
>  			uint32_t	kill_outputs2; /* "get_unique_index2" bits */
>  			unsigned	clip_disable:1;
>  		} hw_vs; /* HW VS (it can be VS, TES, GS) */
>  	} opt;
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 3a604eb..8afc731 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -1028,42 +1028,42 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
>
>  	switch (sel->type) {
>  	case PIPE_SHADER_VERTEX:
>  		if (sctx->vertex_elements) {
>  			unsigned count = MIN2(sel->info.num_inputs,
>  					      sctx->vertex_elements->count);
>  			for (i = 0; i < count; ++i)
>  				key->part.vs.prolog.instance_divisors[i] =
>  					sctx->vertex_elements->elements[i].instance_divisor;
>
> -			memcpy(key->mono.vs.fix_fetch,
> +			memcpy(key->mono.vs_fix_fetch,
>  			       sctx->vertex_elements->fix_fetch, count);
>  		}
>  		if (sctx->tes_shader.cso)
>  			key->as_ls = 1;
>  		else if (sctx->gs_shader.cso)
>  			key->as_es = 1;
>  		else {
>  			si_shader_selector_key_hw_vs(sctx, sel, key);
>
>  			if (sctx->ps_shader.cso && sctx->ps_shader.cso->info.uses_primid)
>  				key->part.vs.epilog.export_prim_id = 1;
>  		}
>  		break;
>  	case PIPE_SHADER_TESS_CTRL:
>  		key->part.tcs.epilog.prim_mode =
>  			sctx->tes_shader.cso->info.properties[TGSI_PROPERTY_TES_PRIM_MODE];
>  		key->part.tcs.epilog.tes_reads_tess_factors =
>  			sctx->tes_shader.cso->info.reads_tess_factors;
>
>  		if (sel == sctx->fixed_func_tcs_shader.cso)
> -			key->mono.tcs.inputs_to_copy = sctx->vs_shader.cso->outputs_written;
> +			key->mono.ff_tcs_inputs_to_copy = sctx->vs_shader.cso->outputs_written;
>  		break;
>  	case PIPE_SHADER_TESS_EVAL:
>  		if (sctx->gs_shader.cso)
>  			key->as_es = 1;
>  		else {
>  			si_shader_selector_key_hw_vs(sctx, sel, key);
>
>  			if (sctx->ps_shader.cso && sctx->ps_shader.cso->info.uses_primid)
>  				key->part.tes.epilog.export_prim_id = 1;
>  		}
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list