[Mesa-dev] [PATCH v2 06/31] glsl: allow to declare bindless samplers/images as non-uniform

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


On 24.04.2017 12:35, Samuel Pitoiset wrote:
> The ARB_bindless_texture spec says:
>
>    "Replace Section 4.1.7 (Samplers), p. 25"
>
>    "Samplers may be declared as shader inputs and outputs, as uniform
>     variables, as temporary variables, and as function parameters."
>
>    "Replace Section 4.1.X, (Images)"
>
>    "Images may be declared as shader inputs and outputs, as uniform
>     variables, as temporary variables, and as function parameters."
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

With or without Timothy's suggestions:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

> ---
>  src/compiler/glsl/ast_to_hir.cpp | 67 +++++++++++++++++++++++++++++++++-------
>  1 file changed, 55 insertions(+), 12 deletions(-)
>
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index c9772ff83e..85015e140e 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -3312,11 +3312,26 @@ apply_image_qualifier_to_variable(const struct ast_type_qualifier *qual,
>        return;
>     }
>
> -   if (var->data.mode != ir_var_uniform &&
> -       var->data.mode != ir_var_function_in) {
> -      _mesa_glsl_error(loc, state, "image variables may only be declared as "
> -                       "function parameters or uniform-qualified "
> -                       "global variables");
> +   if (state->has_bindless()) {
> +      if (var->data.mode != ir_var_auto &&
> +          var->data.mode != ir_var_uniform &&
> +          var->data.mode != ir_var_shader_in &&
> +          var->data.mode != ir_var_shader_out &&
> +          var->data.mode != ir_var_function_in &&
> +          var->data.mode != ir_var_function_out &&
> +          var->data.mode != ir_var_function_inout) {
> +         _mesa_glsl_error(loc, state, "bindless image variables may only be "
> +                          "declared as shader inputs and outputs, as uniform "
> +                          "variables, as temporary variables and as function "
> +                          "parameters");
> +      }
> +   } else {
> +      if (var->data.mode != ir_var_uniform &&
> +          var->data.mode != ir_var_function_in) {
> +         _mesa_glsl_error(loc, state, "image variables may only be declared as "
> +                          "function parameters or uniform-qualified "
> +                          "global variables");
> +      }
>     }
>
>     var->data.image_read_only |= qual->flags.q.read_only;
> @@ -3656,11 +3671,26 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual,
>     }
>
>     if (var->type->contains_sampler()) {
> -      if (var->data.mode != ir_var_uniform &&
> -          var->data.mode != ir_var_function_in) {
> -         _mesa_glsl_error(loc, state, "sampler variables may only be declared "
> -                          "as function parameters or uniform-qualified "
> -                          "global variables");
> +      if (state->has_bindless()) {
> +         if (var->data.mode != ir_var_auto &&
> +             var->data.mode != ir_var_uniform &&
> +             var->data.mode != ir_var_shader_in &&
> +             var->data.mode != ir_var_shader_out &&
> +             var->data.mode != ir_var_function_in &&
> +             var->data.mode != ir_var_function_out &&
> +             var->data.mode != ir_var_function_inout) {
> +            _mesa_glsl_error(loc, state, "bindless sampler variables may only "
> +                             "be declared as shader inputs and outputs, as "
> +                             "uniform variables, as temporary variables and as "
> +                             "function parameters");
> +         }
> +      } else {
> +         if (var->data.mode != ir_var_uniform &&
> +             var->data.mode != ir_var_function_in) {
> +            _mesa_glsl_error(loc, state, "sampler variables may only be "
> +                             "declared as function parameters or "
> +                             "uniform-qualified global variables");
> +         }
>        }
>     }
>
> @@ -5268,9 +5298,22 @@ ast_declarator_list::hir(exec_list *instructions,
>         *
>         *    "[Opaque types] can only be declared as function
>         *     parameters or uniform-qualified variables."
> +       *
> +       * The ARB_bindless_texture spec says:
> +       *
> +       * "Replace Section 4.1.7 (Samplers), p. 25"
> +       *
> +       * "Samplers may be declared as shader inputs and outputs, as uniform
> +       *  variables, as temporary variables, and as function parameters."
> +       *
> +       * "Replace Section 4.1.X, (Images)"
> +       *
> +       * "Images may be declared as shader inputs and outputs, as uniform
> +       *  variables, as temporary variables, and as function parameters."
>         */
> -      if (var_type->contains_opaque() &&
> -          !this->type->qualifier.flags.q.uniform) {
> +      if (!this->type->qualifier.flags.q.uniform &&
> +          (var_type->contains_atomic() ||
> +           (!state->has_bindless() && var_type->contains_opaque()))) {
>           _mesa_glsl_error(&loc, state,
>                            "opaque variables must be declared uniform");
>        }
>


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


More information about the mesa-dev mailing list