[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