[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