<div dir="ltr">Ping. Thanks.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 16, 2019 at 10:16 AM Marek Olšák <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
<br>
This fixes KHR-GL45.compute_shader.resources-max on radeonsi.<br>
<br>
Fixes: 4e1e8f684bf "glsl: remember which SSBOs are not read-only and pass it to gallium"<br>
<br>
v2: use is_interface_array, protect again assertion failures in u_bit_consecutive<br>
---<br>
 src/compiler/glsl/link_uniforms.cpp | 22 +++++++++++++++++++---<br>
 1 file changed, 19 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp<br>
index ef124111991..aa96227a7e1 100644<br>
--- a/src/compiler/glsl/link_uniforms.cpp<br>
+++ b/src/compiler/glsl/link_uniforms.cpp<br>
@@ -515,44 +515,60 @@ public:<br>
       this->record_next_bindless_sampler = new string_to_uint_map;<br>
       this->record_next_image = new string_to_uint_map;<br>
       this->record_next_bindless_image = new string_to_uint_map;<br>
<br>
       buffer_block_index = -1;<br>
       if (var->is_in_buffer_block()) {<br>
          struct gl_uniform_block *blks = var->is_in_shader_storage_block() ?<br>
             prog->data->ShaderStorageBlocks : prog->data->UniformBlocks;<br>
          unsigned num_blks = var->is_in_shader_storage_block() ?<br>
             prog->data->NumShaderStorageBlocks : prog->data->NumUniformBlocks;<br>
+         bool is_interface_array =<br>
+            var->is_interface_instance() && var->type->is_array();<br>
<br>
-         if (var->is_interface_instance() && var->type->is_array()) {<br>
+         if (is_interface_array) {<br>
             unsigned l = strlen(var->get_interface_type()->name);<br>
<br>
             for (unsigned i = 0; i < num_blks; i++) {<br>
                if (strncmp(var->get_interface_type()->name, blks[i].Name, l)<br>
                    == 0 && blks[i].Name[l] == '[') {<br>
                   buffer_block_index = i;<br>
                   break;<br>
                }<br>
             }<br>
          } else {<br>
             for (unsigned i = 0; i < num_blks; i++) {<br>
                if (strcmp(var->get_interface_type()->name, blks[i].Name) == 0) {<br>
                   buffer_block_index = i;<br>
                   break;<br>
                }<br>
             }<br>
          }<br>
          assert(buffer_block_index != -1);<br>
<br>
          if (var->is_in_shader_storage_block() &&<br>
-             !var->data.memory_read_only)<br>
-            shader_storage_blocks_write_access |= 1 << buffer_block_index;<br>
+             !var->data.memory_read_only) {<br>
+            unsigned array_size = is_interface_array ?<br>
+                                     var->type->array_size() : 1;<br>
+<br>
+            STATIC_ASSERT(MAX_SHADER_STORAGE_BUFFERS <= 32);<br>
+<br>
+            /* Shaders that use too many SSBOs will fail to compile, which<br>
+             * we don't care about.<br>
+             *<br>
+             * This is true for shaders that do not use too many SSBOs:<br>
+             */<br>
+            if (buffer_block_index + array_size <= 32) {<br>
+               shader_storage_blocks_write_access |=<br>
+                  u_bit_consecutive(buffer_block_index, array_size);<br>
+            }<br>
+         }<br>
<br>
          /* Uniform blocks that were specified with an instance name must be<br>
           * handled a little bit differently.  The name of the variable is the<br>
           * name used to reference the uniform block instead of being the name<br>
           * of a variable within the block.  Therefore, searching for the name<br>
           * within the block will fail.<br>
           */<br>
          if (var->is_interface_instance()) {<br>
             ubo_byte_offset = 0;<br>
             process(var->get_interface_type(),<br>
-- <br>
2.17.1<br>
<br>
</blockquote></div>