[Mesa-dev] [PATCH] glsl: fix shader_storage_blocks_write_access for SSBO block arrays (v2)

Marek Olšák maraeo at gmail.com
Mon Apr 22 20:08:17 UTC 2019


Ping. Thanks.

On Tue, Apr 16, 2019 at 10:16 AM Marek Olšák <maraeo at gmail.com> wrote:

> From: Marek Olšák <marek.olsak at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190422/2fd90668/attachment-0001.html>


More information about the mesa-dev mailing list