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

Eric Anholt eric at anholt.net
Mon Apr 2 18:13:33 UTC 2018


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);
+      }
+   } 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



More information about the mesa-dev mailing list