[Mesa-dev] [PATCH] nir: Look into uniform structs for samplers when counting num_textures.

Jason Ekstrand jason at jlekstrand.net
Mon Apr 2 18:56:28 UTC 2018


Doesn't st/mesa have a pass for getting rid if the structs?

On Mon, Apr 2, 2018 at 11:13 AM, Eric Anholt <eric at anholt.net> wrote:

> mesa/st decides whether to update samplers after a program change based on
> whether num_textures is nonzero.  By not counting samplers in a uniform
> struct, we would segfault in
> KHR-GLES3.shaders.struct.uniform.sampler_vertex if it was run in the same
> context after a non-vertex-shader-uniform testcase (as is the case during
> a full conformance run).
> ---
>  src/compiler/nir/nir_gather_info.c | 32 ++++++++++++++++++++------------
>  1 file changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/src/compiler/nir/nir_gather_info.c
> b/src/compiler/nir/nir_gather_info.c
> index 5530009255d7..63783f9bc6a2 100644
> --- a/src/compiler/nir/nir_gather_info.c
> +++ b/src/compiler/nir/nir_gather_info.c
> @@ -350,24 +350,32 @@ gather_info_block(nir_block *block, nir_shader
> *shader)
>     }
>  }
>
> +static void
> +nir_gather_uniform_info(nir_shader *shader, const struct glsl_type *type,
> +                        int count)
>
+{
> +   if (glsl_type_is_array(type)) {
> +      nir_gather_uniform_info(shader, glsl_without_array(type),
> +                              count * glsl_get_aoa_size(type));
> +   } else if (glsl_type_is_struct(type)) {
> +      for (int i = 0; i < glsl_get_length(type); i++) {
> +         nir_gather_uniform_info(shader, glsl_get_struct_field(type, i),
> +                                 count);
>

The interaction between in and out parameters is a bit weird here.  Why not
just have a simpler helper:

unsigned
glsl_type_get_image_count(const struct glsl_type *type)
{
   if (glsl_type_is_array(type)) {
      return glsl_type_get_image_count(glsl_without_array(type)) *
glsl_get_aoa_size(type);
   } else if (glsl_type_is_struct(type)) {
      unsigned count = 0;
      for (int i = 0; i < glsl_get_length(type); i++)
         count += glsl_type_get_image_count(glsl_get_struct_field(type, i));
      return count;
   } else if (glsl_type_is_image(type) {
      return 1;
   } else {
      return 0;
}

and another one for samplers.  Yes, it's a bit more code but the new
functions are pure which is nice.

--Jason


> +      }
> +   } else if (glsl_type_is_image(type)) {
> +      shader->info.num_images += count;
> +   } else if (glsl_type_is_sampler(type)) {
> +      shader->info.num_textures += count;
> +   }
> +}
> +
>  void
>  nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint)
>  {
>     shader->info.num_textures = 0;
>     shader->info.num_images = 0;
>     nir_foreach_variable(var, &shader->uniforms) {
> -      const struct glsl_type *type = var->type;
> -      unsigned count = 1;
> -      if (glsl_type_is_array(type)) {
> -         count = glsl_get_aoa_size(type);
> -         type = glsl_without_array(type);
> -      }
> -
> -      if (glsl_type_is_image(type)) {
> -         shader->info.num_images += count;
> -      } else if (glsl_type_is_sampler(type)) {
> -         shader->info.num_textures += count;
> -      }
> +      nir_gather_uniform_info(shader, var->type, 1);
>     }
>
>     shader->info.inputs_read = 0;
> --
> 2.16.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180402/f9a2b322/attachment.html>


More information about the mesa-dev mailing list