[Mesa-dev] [PATCH v2 19/31] glsl: fix explicit binding location for bindless samplers/images

Nicolai Hähnle nhaehnle at gmail.com
Wed Apr 26 07:40:59 UTC 2017


On 24.04.2017 12:35, Samuel Pitoiset wrote:
> The ARB_bindless_texture spec says:
>
>    "Interactions with GLSL 4.20"
>
>    "Without GLSL 4.20 support, sampler and image uniforms may only
>     be initialized through the OpenGL API. With GLSL 4.20, sampler
>     and image uniforms may be initialized in the shader using
>
>     layout(binding = integer-constant)
>
>     as described in section 4.4.4 "Opaque-Uniform Layout Qualifiers".
>     When ARB_bindless_texture is supported, these initial binding
>     values are always taken to mean a texture image or image unit
>     number, not a bindless handle."
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index ae81ed95d8..943c25a224 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -2920,6 +2920,26 @@ apply_explicit_binding(struct _mesa_glsl_parse_state *state,
>        return;
>     }
>
> +   /* The ARB_bindless_texture_spec says:
> +    *
> +    * "Interactions with GLSL 4.20"
> +    *
> +    * "Without GLSL 4.20 support, sampler and image uniforms may only be
> +    *  initialized through the OpenGL API. With GLSL 4.20, sampler and image
> +    *  uniforms may be initialized in the shader using
> +    *
> +    *  layout(binding = integer-constant)
> +    *
> +    *  as described in section 4.4.4 "Opaque-Uniform Layout Qualifiers".  When
> +    *  ARB_bindless_texture is supported, these initial binding values are
> +    *  always taken to mean a texture image or image unit number, not a
> +    *  bindless handle."
> +    */
> +   if (state->has_bindless() &&
> +       (base_type->is_sampler() || base_type->is_image())) {
> +      var->data.bindless = false;
> +   }

I don't think this is correct. The way I understand the spec, saying

   layout (bindless_sampler, binding = 5) uniform sampler2D s;

means that s is still bindless, it's just that it's *initial* value is 
set up as if the application had called

   glUniform1i(index of s, 5);

You're still allowed to later on change it to a bindless handle by 
calling one of the glUniformHandleui64* functions.

Cheers,
Nicolai


> +
>     var->data.explicit_binding = true;
>     var->data.binding = qual_binding;
>
>


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


More information about the mesa-dev mailing list