[Mesa-dev] [RFC PATCH 23/65] mesa: get rid of a workaround for bindless in _mesa_get_uniform()

Nicolai Hähnle nhaehnle at gmail.com
Wed May 24 11:02:27 UTC 2017


On 19.05.2017 18:52, Samuel Pitoiset wrote:
> The ARB_bindless_texture spec says:
> 
>     "When a sampler or image uniform's value is queried via any
>      of the GetUniform* commands, the returned value will reflect
>      the most recently set value through either UniformHandle* or
>      Uniform1i*, converted to the requested type."

This is probably unnecessary, depending on what happens with the 
previous patch.

Cheers,
Nicolai


> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   src/compiler/glsl/ir_uniform.h     |  6 ++++++
>   src/compiler/glsl/shader_cache.cpp |  2 ++
>   src/mesa/main/uniform_query.cpp    | 22 +++++++++++++++++-----
>   3 files changed, 25 insertions(+), 5 deletions(-)
> 
> diff --git a/src/compiler/glsl/ir_uniform.h b/src/compiler/glsl/ir_uniform.h
> index 9841df8cde..f375d8359d 100644
> --- a/src/compiler/glsl/ir_uniform.h
> +++ b/src/compiler/glsl/ir_uniform.h
> @@ -207,6 +207,12 @@ struct gl_uniform_storage {
>       * layout qualifier as specified by ARB_bindless_texture.
>       */
>      bool is_bindless;
> +
> +   /**
> +    * Whether this uniform variable is declared with the bindless_sampler or
> +    * bindless_image and used with a texture/image handle.
> +    */
> +   bool is_bindless_handle;
>   };
>   
>   #ifdef __cplusplus
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index 6811cb2f50..3fe3135bd7 100644
> --- a/src/compiler/glsl/shader_cache.cpp
> +++ b/src/compiler/glsl/shader_cache.cpp
> @@ -579,6 +579,7 @@ write_uniforms(struct blob *metadata, struct gl_shader_program *prog)
>         blob_write_uint32(metadata, prog->data->UniformStorage[i].matrix_stride);
>         blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major);
>         blob_write_uint32(metadata, prog->data->UniformStorage[i].is_bindless);
> +      blob_write_uint32(metadata, prog->data->UniformStorage[i].is_bindless_handle);
>         blob_write_uint32(metadata,
>                           prog->data->UniformStorage[i].num_compatible_subroutines);
>         blob_write_uint32(metadata,
> @@ -644,6 +645,7 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
>         uniforms[i].matrix_stride = blob_read_uint32(metadata);
>         uniforms[i].row_major = blob_read_uint32(metadata);
>         uniforms[i].is_bindless = blob_read_uint32(metadata);
> +      uniforms[i].is_bindless_handle = blob_read_uint32(metadata);
>         uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata);
>         uniforms[i].top_level_array_size = blob_read_uint32(metadata);
>         uniforms[i].top_level_array_stride = blob_read_uint32(metadata);
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index be04e48d53..78a852377d 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -322,12 +322,20 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>   
>      {
>         unsigned elements = uni->type->components();
> -      /* XXX: Remove the sampler/image check workarounds when bindless is fully
> -       * implemented.
> -       */
> -      const int dmul =
> -         (uni->type->is_64bit() && !uni->type->is_sampler() && !uni->type->is_image()) ? 2 : 1;
>         const int rmul = glsl_base_type_is_64bit(returnType) ? 2 : 1;
> +      int dmul = uni->type->is_64bit() ? 2 : 1;
> +
> +      if ((uni->type->is_sampler() || uni->type->is_image()) &&
> +          !uni->is_bindless_handle) {
> +         /* The ARB_bindless_texture spec says:
> +          *
> +          * "When a sampler or image uniform's value is queried via any of the
> +          *  GetUniform* commands, the returned value will reflect the most
> +          *  recently set value through either UniformHandle* or Uniform1i*,
> +          *  converted to the requested type."
> +          */
> +         dmul = 1;
> +      }
>   
>         /* Calculate the source base address *BEFORE* modifying elements to
>          * account for the size of the user's buffer.
> @@ -1007,6 +1015,7 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
>                  }
>                  sampler->bound = true;
>                  sh->Program->sh.HasBoundBindlessSampler = true;
> +               uni->is_bindless_handle = false;
>               } else {
>                  if (sh->Program->SamplerUnits[unit] != value) {
>                     sh->Program->SamplerUnits[unit] = value;
> @@ -1053,6 +1062,7 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
>                  image->unit = value;
>                  image->bound = true;
>                  sh->Program->sh.HasBoundBindlessImage = true;
> +               uni->is_bindless_handle = false;
>               } else {
>                  sh->Program->sh.ImageUnits[unit] = value;
>               }
> @@ -1318,6 +1328,7 @@ _mesa_uniform_handle(GLint location, GLsizei count, const GLvoid *values,
>                  &sh->Program->sh.BindlessSamplers[unit];
>   
>               sampler->bound = false;
> +            uni->is_bindless_handle = true;
>            }
>   
>            update_bound_bindless_sampler_flag(sh->Program);
> @@ -1341,6 +1352,7 @@ _mesa_uniform_handle(GLint location, GLsizei count, const GLvoid *values,
>                  &sh->Program->sh.BindlessImages[unit];
>   
>               image->bound = false;
> +            uni->is_bindless_handle = true;
>            }
>   
>            update_bound_bindless_image_flag(sh->Program);
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list