glsl: fix explicit locations for the glsl linker
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 5 Mar 2020 03:46:26 +0000 (14:46 +1100)
committerMarge Bot <eric+marge@anholt.net>
Sat, 18 Apr 2020 11:50:44 +0000 (11:50 +0000)
We already reserved explicit locations in the GLSL linker.

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4623>

src/compiler/glsl/gl_nir_link_uniforms.c

index ef19ced288ce382e22b3c7465f9ea73d4f118585..69d7aa57022971d44266c1e0d28598775a1d6c38 100644 (file)
@@ -48,9 +48,17 @@ static void
 nir_setup_uniform_remap_tables(struct gl_context *ctx,
                                struct gl_shader_program *prog)
 {
-   prog->UniformRemapTable = rzalloc_array(prog,
-                                           struct gl_uniform_storage *,
-                                           prog->NumUniformRemapTable);
+   /* For glsl this may have been allocated by reserve_explicit_locations() so
+    * that we can keep track of unused uniforms with explicit locations.
+    */
+   assert(!prog->data->spirv ||
+          (prog->data->spirv && !prog->UniformRemapTable));
+   if (!prog->UniformRemapTable) {
+      prog->UniformRemapTable = rzalloc_array(prog,
+                                              struct gl_uniform_storage *,
+                                              prog->NumUniformRemapTable);
+   }
+
    union gl_constant_value *data =
       rzalloc_array(prog->data,
                     union gl_constant_value, prog->data->NumUniformDataSlots);
@@ -93,7 +101,8 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx,
    }
 
    /* Reserve locations for rest of the uniforms. */
-   link_util_update_empty_uniform_locations(prog);
+   if (prog->data->spirv)
+      link_util_update_empty_uniform_locations(prog);
 
    for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
       struct gl_uniform_storage *uniform = &prog->data->UniformStorage[i];
@@ -1396,9 +1405,11 @@ gl_nir_link_uniforms(struct gl_context *ctx,
    }
 
    prog->data->NumHiddenUniforms = state.num_hidden_uniforms;
-   prog->NumUniformRemapTable = state.max_uniform_location;
    prog->data->NumUniformDataSlots = state.num_values;
 
+   if (prog->data->spirv)
+      prog->NumUniformRemapTable = state.max_uniform_location;
+
    nir_setup_uniform_remap_tables(ctx, prog);
    gl_nir_set_uniform_initializers(ctx, prog);