glsl: store ubo or ssbo index in block index
authorTimothy Arceri <timothy.arceri@collabora.com>
Sat, 2 Apr 2016 02:54:06 +0000 (13:54 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Sat, 2 Apr 2016 06:10:56 +0000 (17:10 +1100)
Previously we store the buffer block index i.e the index of a combined
ubo/ssbo list.

Fixes several dEQP-GLES31.functional tests:
- program_interface_query.uniform.block_index.block_array
- program_interface_query.uniform.block_index.named_block
- program_interface_query.uniform.block_index.unnamed_block
- program_interface_query.uniform.random.10
- program_interface_query.uniform.random.15
- program_interface_query.uniform.random.22
- program_interface_query.uniform.random.24
- program_interface_query.uniform.random.26
- program_interface_query.uniform.random.28
- program_interface_query.uniform.random.3
- program_interface_query.uniform.random.31
- program_interface_query.uniform.random.38
- program_interface_query.uniform.random.5

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94116
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/link_uniforms.cpp
src/compiler/glsl/linker.cpp

index 0a230cad03431b13eaa10f605c1df93db47d71fa..43ff52522ee74f3228785d6819f832618bfc4311 100644 (file)
@@ -460,30 +460,33 @@ public:
       field_counter = 0;
       this->record_next_sampler = new string_to_uint_map;
 
-      ubo_block_index = -1;
+      buffer_block_index = -1;
       if (var->is_in_buffer_block()) {
+         struct gl_uniform_block **blks = var->is_in_shader_storage_block() ?
+            prog->ShaderStorageBlocks : prog->UniformBlocks;
+         unsigned num_blks = var->is_in_shader_storage_block() ?
+            prog->NumShaderStorageBlocks : prog->NumUniformBlocks;
+
          if (var->is_interface_instance() && var->type->is_array()) {
             unsigned l = strlen(var->get_interface_type()->name);
 
-            for (unsigned i = 0; i < prog->NumBufferInterfaceBlocks; i++) {
-               if (strncmp(var->get_interface_type()->name,
-                           prog->BufferInterfaceBlocks[i].Name,
-                           l) == 0
-                   && prog->BufferInterfaceBlocks[i].Name[l] == '[') {
-                  ubo_block_index = i;
+            for (unsigned i = 0; i < num_blks; i++) {
+               if (strncmp(var->get_interface_type()->name, blks[i]->Name, l)
+                   == 0 && blks[i]->Name[l] == '[') {
+                  buffer_block_index = i;
                   break;
                }
             }
          } else {
-            for (unsigned i = 0; i < prog->NumBufferInterfaceBlocks; i++) {
-               if (strcmp(var->get_interface_type()->name,
-                          prog->BufferInterfaceBlocks[i].Name) == 0) {
-                  ubo_block_index = i;
+            for (unsigned i = 0; i < num_blks; i++) {
+               if (strcmp(var->get_interface_type()->name, blks[i]->Name) ==
+                   0) {
+                  buffer_block_index = i;
                   break;
                }
             }
          }
-         assert(ubo_block_index != -1);
+         assert(buffer_block_index != -1);
 
          /* Uniform blocks that were specified with an instance name must be
           * handled a little bit differently.  The name of the variable is the
@@ -497,7 +500,7 @@ public:
                     var->get_interface_type()->name);
          } else {
             const struct gl_uniform_block *const block =
-               &prog->BufferInterfaceBlocks[ubo_block_index];
+               blks[buffer_block_index];
 
             assert(var->data.location != -1);
 
@@ -519,7 +522,7 @@ public:
       delete this->record_next_sampler;
    }
 
-   int ubo_block_index;
+   int buffer_block_index;
    int ubo_byte_offset;
    gl_shader_stage shader_type;
 
@@ -659,7 +662,7 @@ private:
    virtual void enter_record(const glsl_type *type, const char *,
                              bool row_major, const unsigned packing) {
       assert(type->is_record());
-      if (this->ubo_block_index == -1)
+      if (this->buffer_block_index == -1)
          return;
       if (packing == GLSL_INTERFACE_PACKING_STD430)
          this->ubo_byte_offset = glsl_align(
@@ -672,7 +675,7 @@ private:
    virtual void leave_record(const glsl_type *type, const char *,
                              bool row_major, const unsigned packing) {
       assert(type->is_record());
-      if (this->ubo_block_index == -1)
+      if (this->buffer_block_index == -1)
          return;
       if (packing == GLSL_INTERFACE_PACKING_STD430)
          this->ubo_byte_offset = glsl_align(
@@ -719,7 +722,7 @@ private:
       /* For array of arrays or struct arrays the base location may have
        * already been set so don't set it again.
        */
-      if (ubo_block_index == -1 && current_var->data.location == -1) {
+      if (buffer_block_index == -1 && current_var->data.location == -1) {
          current_var->data.location = id;
       }
 
@@ -766,8 +769,8 @@ private:
       this->uniforms[id].is_shader_storage =
          current_var->is_in_shader_storage_block();
 
-      if (this->ubo_block_index != -1) {
-         this->uniforms[id].block_index = this->ubo_block_index;
+      if (this->buffer_block_index != -1) {
+         this->uniforms[id].block_index = this->buffer_block_index;
 
          unsigned alignment = type->std140_base_alignment(row_major);
          if (packing == GLSL_INTERFACE_PACKING_STD430)
index f750f5b7722f6768dccd779170403682a797c9f9..d9a681ccca1da7dd8a37ef862f3e2401f5e0dd69 100644 (file)
@@ -3804,7 +3804,9 @@ calculate_array_size_and_stride(struct gl_shader_program *shProg,
    int array_stride = -1;
    char *var_name = get_top_level_name(uni->name);
    char *interface_name =
-      get_top_level_name(shProg->BufferInterfaceBlocks[block_index].Name);
+      get_top_level_name(uni->is_shader_storage ?
+                         shProg->ShaderStorageBlocks[block_index]->Name :
+                         shProg->UniformBlocks[block_index]->Name);
 
    if (strcmp(var_name, interface_name) == 0) {
       /* Deal with instanced array of SSBOs */
@@ -3941,12 +3943,14 @@ build_program_resource_list(struct gl_context *ctx,
                         ir_var_uniform);
 
       /* Add stagereferences for uniforms in a uniform block. */
+      bool is_shader_storage =  shProg->UniformStorage[i].is_shader_storage;
       int block_index = shProg->UniformStorage[i].block_index;
       if (block_index != -1) {
-         stageref |= shProg->BufferInterfaceBlocks[block_index].stageref;
+         stageref |= is_shader_storage ?
+            shProg->ShaderStorageBlocks[block_index]->stageref :
+            shProg->UniformBlocks[block_index]->stageref;
       }
 
-      bool is_shader_storage =  shProg->UniformStorage[i].is_shader_storage;
       GLenum type = is_shader_storage ? GL_BUFFER_VARIABLE : GL_UNIFORM;
       if (!should_add_buffer_variable(shProg, type,
                                       shProg->UniformStorage[i].name))