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