nir/linker: Add BUFFER_VARIABLEs to the prog resource list
authorAntia Puentes <apuentes@igalia.com>
Sat, 15 Dec 2018 17:25:41 +0000 (18:25 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Fri, 12 Jul 2019 21:42:41 +0000 (23:42 +0200)
v2: use link_util_should_add_buffer_variable() (Arcady)
Signed-off-by: Arcady Goldmints-Orlov <agoldmints@igalia.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/gl_nir_linker.c

index 13d4e839c1be5c5fce875e3754100a1102766dbb..4bf94c05a1504a8911b3731628d37c30578f6673 100644 (file)
@@ -159,6 +159,10 @@ nir_build_program_resource_list(struct gl_context *ctx,
     * Here, it is expected that nir_link_uniforms() has already been
     * called, so that UniformStorage table is already available.
     */
+   int top_level_array_base_offset = -1;
+   int top_level_array_size_in_bytes = -1;
+   int second_element_offset = -1;
+   int block_index = -1;
    for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
       struct gl_uniform_storage *uniform = &prog->data->UniformStorage[i];
 
@@ -166,7 +170,33 @@ nir_build_program_resource_list(struct gl_context *ctx,
       if (uniform->hidden)
          continue;
 
-      if (!link_util_add_program_resource(prog, resource_set, GL_UNIFORM, uniform,
+      if (!link_util_should_add_buffer_variable(prog, uniform,
+                                                top_level_array_base_offset,
+                                                top_level_array_size_in_bytes,
+                                                second_element_offset, block_index))
+         continue;
+
+
+      if (prog->data->UniformStorage[i].offset >= second_element_offset) {
+         top_level_array_base_offset =
+            prog->data->UniformStorage[i].offset;
+
+         top_level_array_size_in_bytes =
+            prog->data->UniformStorage[i].top_level_array_size *
+            prog->data->UniformStorage[i].top_level_array_stride;
+
+         /* Set or reset the second element offset. For non arrays this
+          * will be set to -1.
+          */
+         second_element_offset = top_level_array_size_in_bytes ?
+            top_level_array_base_offset +
+            prog->data->UniformStorage[i].top_level_array_stride : -1;
+      }
+      block_index = uniform->block_index;
+
+
+      GLenum interface = uniform->is_shader_storage ? GL_BUFFER_VARIABLE : GL_UNIFORM;
+      if (!link_util_add_program_resource(prog, resource_set, interface, uniform,
                                           uniform->active_shader_mask)) {
          return;
       }