[Mesa-dev] [PATCH] radeonsi/nir: set shader_buffers_declared properly

Dieter Nützel Dieter at nuetzel-hh.de
Thu Feb 14 03:02:18 UTC 2019


Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

Am 12.02.2019 04:46, schrieb Timothy Arceri:
> ---
>  src/gallium/drivers/radeonsi/si_shader_nir.c | 32 ++++++++++++++------
>  1 file changed, 22 insertions(+), 10 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c
> b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index 55a950a675c..c547f5f1c30 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -687,10 +687,15 @@ void si_nir_scan_shader(const struct nir_shader 
> *nir,
> 
>  	struct set *ubo_set = _mesa_set_create(NULL, _mesa_hash_pointer,
>  					       _mesa_key_pointer_equal);
> +	struct set *ssbo_set = _mesa_set_create(NULL, _mesa_hash_pointer,
> +						_mesa_key_pointer_equal);
> 
>  	/* Intialise const_file_max[0] */
>  	info->const_file_max[0] = -1;
> 
> +	/* The first 8 are reserved for atomic counters using ssbo */
> +	unsigned ssbo_idx = 8;
> +
>  	unsigned ubo_idx = 1;
>  	nir_foreach_variable(variable, &nir->uniforms) {
>  		const struct glsl_type *type = variable->type;
> @@ -705,12 +710,16 @@ void si_nir_scan_shader(const struct nir_shader 
> *nir,
>  		 */
>  		if (variable->interface_type != NULL) {
>  			if (variable->data.mode == nir_var_uniform ||
> -			    variable->data.mode == nir_var_mem_ubo) {
> +			    variable->data.mode == nir_var_mem_ubo ||
> +			    variable->data.mode == nir_var_mem_ssbo) {
> +
> +				struct set *buf_set = variable->data.mode == nir_var_mem_ssbo ?
> +					ssbo_set : ubo_set;
> 
>  				unsigned block_count;
>  				if (base_type != GLSL_TYPE_INTERFACE) {
>  					struct set_entry *entry =
> -						_mesa_set_search(ubo_set, variable->interface_type);
> +						_mesa_set_search(buf_set, variable->interface_type);
> 
>  					/* Check if we have already processed
>  					 * a member from this ubo.
> @@ -723,16 +732,18 @@ void si_nir_scan_shader(const struct nir_shader 
> *nir,
>  					block_count = aoa_size;
>  				}
> 
> -				info->const_buffers_declared |= u_bit_consecutive(ubo_idx, 
> block_count);
> -				ubo_idx += block_count;
> +				if (variable->data.mode == nir_var_uniform ||
> +				    variable->data.mode == nir_var_mem_ubo) {
> +					info->const_buffers_declared |= u_bit_consecutive(ubo_idx, 
> block_count);
> +					ubo_idx += block_count;
> +				} else {
> +					assert(variable->data.mode == nir_var_mem_ssbo);
> 
> -				_mesa_set_add(ubo_set, variable->interface_type);
> -			}
> +					info->shader_buffers_declared |= u_bit_consecutive(ssbo_idx, 
> block_count);
> +					ssbo_idx += block_count;
> +				}
> 
> -			if (variable->data.mode == nir_var_mem_ssbo) {
> -				/* TODO: make this more accurate */
> -				info->shader_buffers_declared =
> -					u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS);
> +				_mesa_set_add(buf_set, variable->interface_type);
>  			}
> 
>  			continue;
> @@ -776,6 +787,7 @@ void si_nir_scan_shader(const struct nir_shader 
> *nir,
>  	}
> 
>  	_mesa_set_destroy(ubo_set, NULL);
> +	_mesa_set_destroy(ssbo_set, NULL);
> 
>  	info->num_written_clipdistance = nir->info.clip_distance_array_size;
>  	info->num_written_culldistance = nir->info.cull_distance_array_size;


More information about the mesa-dev mailing list