glsl: move some uniform linking code to new link_assign_uniform_storage()
authorTimothy Arceri <timothy.arceri@collabora.com>
Sun, 25 Sep 2016 12:50:25 +0000 (22:50 +1000)
committerTimothy Arceri <timothy.arceri@collabora.com>
Tue, 27 Sep 2016 01:29:05 +0000 (11:29 +1000)
This makes link_assign_uniform_locations() easier to follow.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/link_uniforms.cpp

index 11204fc5a3f18703e1e054d8844bf9e40f206bdb..b3c3c5a279defb0c68fdfa093c6f2421b3c2d8b3 100644 (file)
@@ -1152,13 +1152,77 @@ link_setup_uniform_remap_tables(struct gl_context *ctx,
    }
 }
 
+static void
+link_assign_uniform_storage(struct gl_context *ctx,
+                            struct gl_shader_program *prog,
+                            const unsigned num_data_slots,
+                            unsigned num_explicit_uniform_locs)
+{
+   /* On the outside chance that there were no uniforms, bail out.
+    */
+   if (prog->NumUniformStorage == 0)
+      return;
+
+   unsigned int boolean_true = ctx->Const.UniformBooleanTrue;
+
+   prog->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage,
+                                        prog->NumUniformStorage);
+   union gl_constant_value *data = rzalloc_array(prog->UniformStorage,
+                                                 union gl_constant_value,
+                                                 num_data_slots);
+#ifndef NDEBUG
+   union gl_constant_value *data_end = &data[num_data_slots];
+#endif
+
+   parcel_out_uniform_storage parcel(prog, prog->UniformHash,
+                                     prog->UniformStorage, data);
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+      if (prog->_LinkedShaders[i] == NULL)
+         continue;
+
+      parcel.start_shader((gl_shader_stage)i);
+
+      foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) {
+         ir_variable *const var = node->as_variable();
+
+         if ((var == NULL) || (var->data.mode != ir_var_uniform &&
+                               var->data.mode != ir_var_shader_storage))
+            continue;
+
+         parcel.set_and_process(var);
+      }
+
+      prog->_LinkedShaders[i]->active_samplers = parcel.shader_samplers_used;
+      prog->_LinkedShaders[i]->shadow_samplers = parcel.shader_shadow_samplers;
+
+      STATIC_ASSERT(sizeof(prog->_LinkedShaders[i]->SamplerTargets) ==
+                    sizeof(parcel.targets));
+      memcpy(prog->_LinkedShaders[i]->SamplerTargets, parcel.targets,
+             sizeof(prog->_LinkedShaders[i]->SamplerTargets));
+   }
+
+#ifndef NDEBUG
+   for (unsigned i = 0; i < prog->NumUniformStorage; i++) {
+      assert(prog->UniformStorage[i].storage != NULL ||
+             prog->UniformStorage[i].builtin ||
+             prog->UniformStorage[i].is_shader_storage ||
+             prog->UniformStorage[i].block_index != -1);
+   }
+
+   assert(parcel.values == data_end);
+#endif
+
+   link_setup_uniform_remap_tables(ctx, prog, num_explicit_uniform_locs);
+
+   link_set_uniform_initializers(prog, boolean_true);
+}
+
 void
 link_assign_uniform_locations(struct gl_shader_program *prog,
                               struct gl_context *ctx,
                               unsigned int num_explicit_uniform_locs)
 {
-   unsigned int boolean_true = ctx->Const.UniformBooleanTrue;
-
    ralloc_free(prog->UniformStorage);
    prog->UniformStorage = NULL;
    prog->NumUniformStorage = 0;
@@ -1224,70 +1288,12 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
    }
 
    prog->NumUniformStorage = uniform_size.num_active_uniforms;
-   const unsigned num_data_slots = uniform_size.num_values;
-   const unsigned hidden_uniforms = uniform_size.num_hidden_uniforms;
+   prog->NumHiddenUniforms = uniform_size.num_hidden_uniforms;
 
    /* assign hidden uniforms a slot id */
    hiddenUniforms->iterate(assign_hidden_uniform_slot_id, &uniform_size);
    delete hiddenUniforms;
 
-   /* On the outside chance that there were no uniforms, bail out.
-    */
-   if (prog->NumUniformStorage == 0)
-      return;
-
-   prog->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage,
-                                        prog->NumUniformStorage);
-   union gl_constant_value *data = rzalloc_array(prog->UniformStorage,
-                                                 union gl_constant_value,
-                                                 num_data_slots);
-#ifndef NDEBUG
-   union gl_constant_value *data_end = &data[num_data_slots];
-#endif
-
-   parcel_out_uniform_storage parcel(prog, prog->UniformHash,
-                                     prog->UniformStorage, data);
-
-   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
-      if (prog->_LinkedShaders[i] == NULL)
-         continue;
-
-      parcel.start_shader((gl_shader_stage)i);
-
-      foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) {
-         ir_variable *const var = node->as_variable();
-
-         if ((var == NULL) || (var->data.mode != ir_var_uniform &&
-                               var->data.mode != ir_var_shader_storage))
-            continue;
-
-         parcel.set_and_process(var);
-      }
-
-      prog->_LinkedShaders[i]->active_samplers = parcel.shader_samplers_used;
-      prog->_LinkedShaders[i]->shadow_samplers = parcel.shader_shadow_samplers;
-
-      STATIC_ASSERT(sizeof(prog->_LinkedShaders[i]->SamplerTargets) ==
-                    sizeof(parcel.targets));
-      memcpy(prog->_LinkedShaders[i]->SamplerTargets, parcel.targets,
-             sizeof(prog->_LinkedShaders[i]->SamplerTargets));
-   }
-
-#ifndef NDEBUG
-   for (unsigned i = 0; i < prog->NumUniformStorage; i++) {
-      assert(prog->UniformStorage[i].storage != NULL ||
-             prog->UniformStorage[i].builtin ||
-             prog->UniformStorage[i].is_shader_storage ||
-             prog->UniformStorage[i].block_index != -1);
-   }
-
-   assert(parcel.values == data_end);
-#endif
-
-   prog->NumHiddenUniforms = hidden_uniforms;
-   link_setup_uniform_remap_tables(ctx, prog, num_explicit_uniform_locs);
-
-   link_set_uniform_initializers(prog, boolean_true);
-
-   return;
+   link_assign_uniform_storage(ctx, prog, uniform_size.num_values,
+                               num_explicit_uniform_locs);
 }