[Mesa-dev] [PATCH v2 1/2] radeonsi/nir: set input_usage_mask properly

Timothy Arceri tarceri at itsqueeze.com
Tue Feb 12 02:14:41 UTC 2019



On 12/2/19 11:15 am, Timothy Arceri wrote:
> shader-db results for VEGA64:
> 
> Totals from affected shaders:
> SGPRS: 791528 -> 792616 (0.14 %)
> VGPRS: 421624 -> 410784 (-2.57 %)
> Spilled SGPRs: 1639 -> 1674 (2.14 %)
> Spilled VGPRs: 0 -> 0 (0.00 %)
> Private memory VGPRs: 0 -> 0 (0.00 %)
> Scratch size: 0 -> 0 (0.00 %) dwords per thread
> Code Size: 16103516 -> 16063696 (-0.25 %) bytes
> LDS: 0 -> 0 (0.00 %) blocks
> Max Waves: 136307 -> 137830 (1.12 %)
> Wait states: 0 -> 0 (0.00 %)
> ---
>   src/gallium/drivers/radeonsi/si_shader_nir.c | 53 +++++++++++++-------
>   1 file changed, 36 insertions(+), 17 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index 7554f5b9f8b..4eec57b406d 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -51,7 +51,36 @@ static nir_variable* intrinsic_get_var(nir_intrinsic_instr *instr)
>   	return nir_deref_instr_get_variable(nir_src_as_deref(instr->src[0]));
>   }
>   
> -static void scan_instruction(struct tgsi_shader_info *info,
> +static void gather_intrinsic_load_deref_info(const nir_shader *nir,
> +					     const nir_intrinsic_instr *instr,
> +					     nir_variable *var,
> +					     struct tgsi_shader_info *info)
> +{
> +	assert(var && var->data.mode == nir_var_shader_in);
> +
> +	switch (nir->info.stage) {
> +	case MESA_SHADER_VERTEX: {
> +		unsigned i = var->data.driver_location;
> +		unsigned attrib_count = glsl_count_attribute_slots(var->type, false);
> +
> +		for (unsigned j = 0; j < attrib_count; j++, i++) {
> +			if (glsl_type_is_64bit(glsl_without_array(var->type))) {
> +				/* TODO: set usage mask more accurately for doubles */
> +				info->input_usage_mask[i] = TGSI_WRITEMASK_XYZW;
> +			} else {
> +				uint8_t mask = nir_ssa_def_components_read(&instr->dest.ssa);
> +				info->input_usage_mask[i] |= mask << var->data.location_frac;
> +			}
> +		}
> +		break;
> +	}
> +	default:
> +		break;
> +	}
> +}
> +
> +static void scan_instruction(const struct nir_shader *nir,
> +			     struct tgsi_shader_info *info,
>   			     nir_instr *instr)
>   {
>   	if (instr->type == nir_instr_type_alu) {
> @@ -216,6 +245,8 @@ static void scan_instruction(struct tgsi_shader_info *info,
>   				glsl_get_base_type(glsl_without_array(var->type));
>   
>   			if (mode == nir_var_shader_in) {
> +				gather_intrinsic_load_deref_info(nir, intr, var, info);
> +
>   				switch (var->data.interpolation) {
>   				case INTERP_MODE_NONE:
>   					if (glsl_base_type_is_integer(base_type))
> @@ -390,16 +421,10 @@ void si_nir_scan_shader(const struct nir_shader *nir,
>   		 * variable->data.driver_location.
>   		 */
>   		if (nir->info.stage == MESA_SHADER_VERTEX) {
> -			/* TODO: gather the actual input useage and remove this. */
> -			info->input_usage_mask[i] = TGSI_WRITEMASK_XYZW;
> -
> -			if (glsl_type_is_dual_slot(variable->type)) {
> -				num_inputs += 2;
> -
> -				/* TODO: gather the actual input useage and remove this. */
> -				info->input_usage_mask[i+1] = TGSI_WRITEMASK_XYZW;
> -			} else
> +			if (glsl_type_is_dual_slot(glsl_without_array(variable->type)))
>   				num_inputs++;
> +
> +			num_inputs++;
>   			continue;
>   		}
>   
> @@ -470,12 +495,6 @@ void si_nir_scan_shader(const struct nir_shader *nir,
>   				info->input_interpolate[i] = TGSI_INTERPOLATE_CONSTANT;
>   				break;
>   			}
> -
> -			/* TODO make this more precise */
> -			if (variable->data.location == VARYING_SLOT_COL0)
> -				info->colors_read |= 0x0f;
> -			else if (variable->data.location == VARYING_SLOT_COL1)
> -				info->colors_read |= 0xf0;

Sorry this hunk should be moved to the following patch. Fixed locally.

>   		}
>   	}
>   
> @@ -760,7 +779,7 @@ void si_nir_scan_shader(const struct nir_shader *nir,
>   	func = (struct nir_function *)exec_list_get_head_const(&nir->functions);
>   	nir_foreach_block(block, func->impl) {
>   		nir_foreach_instr(instr, block)
> -			scan_instruction(info, instr);
> +			scan_instruction(nir, info, instr);
>   	}
>   }
>   
> 


More information about the mesa-dev mailing list