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

Marek Olšák maraeo at gmail.com
Thu May 4 18:54:55 UTC 2017


On Wed, Apr 26, 2017 at 9:40 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> 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.

I don't like this. Are you suggesting that a texture bound to unit 5
has to be somehow converted to a bindless texture and made resident
under the hood (in Mesa), so that the bindless shader code works?

Marek


More information about the mesa-dev mailing list