[Mesa-dev] [PATCH v2 2/3] nir: add support for bindless_texture samplers

Jason Ekstrand jason at jlekstrand.net
Tue Apr 10 15:10:15 UTC 2018


On Tue, Apr 10, 2018 at 8:05 AM, Karol Herbst <kherbst at redhat.com> wrote:

> v2: add both texture and sampler handles
>
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
> ---
>  src/compiler/glsl/glsl_to_nir.cpp | 17 +++++++++++++++--
>  src/compiler/nir/nir.h            |  2 ++
>  src/compiler/nir/nir_print.c      |  6 ++++++
>  3 files changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/src/compiler/glsl/glsl_to_nir.cpp
> b/src/compiler/glsl/glsl_to_nir.cpp
> index dbb58d82e8f..9f233637306 100644
> --- a/src/compiler/glsl/glsl_to_nir.cpp
> +++ b/src/compiler/glsl/glsl_to_nir.cpp
> @@ -1971,6 +1971,8 @@ nir_visitor::visit(ir_texture *ir)
>  {
>     unsigned num_srcs;
>     nir_texop op;
> +   bool bindless = ir->sampler->variable_referenced()->contains_
> bindless();
>

What happens if I have a uniform struct containing both a regular sampler
and a bindless sampler?  I think this should be possible.


> +
>     switch (ir->op) {
>     case ir_tex:
>        op = nir_texop_tex;
> @@ -2044,6 +2046,8 @@ nir_visitor::visit(ir_texture *ir)
>        num_srcs++;
>     if (ir->offset != NULL)
>        num_srcs++;
> +   if (bindless)
> +      num_srcs++;
>
>     nir_tex_instr *instr = nir_tex_instr_create(this->shader, num_srcs);
>
> @@ -2069,10 +2073,19 @@ nir_visitor::visit(ir_texture *ir)
>        unreachable("not reached");
>     }
>
> -   instr->texture = evaluate_deref(&instr->instr, ir->sampler);
> -
>     unsigned src_number = 0;
>
> +   /* for bindless we use the texture handle src */
> +   if (bindless) {
> +      instr->texture = NULL;
> +      instr->src[src_number].src =
> +         nir_src_for_ssa(evaluate_rvalue(ir->sampler));
> +      instr->src[src_number].src_type = nir_tex_src_texture_handle;
> +      src_number++;
> +   } else {
> +      instr->texture = evaluate_deref(&instr->instr, ir->sampler);
> +   }
> +
>     if (ir->coordinate != NULL) {
>        instr->coord_components = ir->coordinate->type->vector_elements;
>        instr->src[src_number].src =
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index f33049d7134..e395352f89c 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -1218,6 +1218,8 @@ typedef enum {
>     nir_tex_src_texture_offset, /* < dynamically uniform indirect offset */
>     nir_tex_src_sampler_offset, /* < dynamically uniform indirect offset */
>     nir_tex_src_plane,          /* < selects plane for planar textures */
> +   nir_tex_src_texture_handle, /* < handle for bindless texture */
> +   nir_tex_src_sampler_handle, /* < handle for bindless sampler */
>     nir_num_tex_src_types
>  } nir_tex_src_type;
>
> diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c
> index 21f13097651..52f20b1eb10 100644
> --- a/src/compiler/nir/nir_print.c
> +++ b/src/compiler/nir/nir_print.c
> @@ -778,6 +778,12 @@ print_tex_instr(nir_tex_instr *instr, print_state
> *state)
>        case nir_tex_src_plane:
>           fprintf(fp, "(plane)");
>           break;
> +      case nir_tex_src_texture_handle:
> +         fprintf(fp, "(texture_handle)");
> +         break;
> +      case nir_tex_src_sampler_handle:
> +         fprintf(fp, "(sampler_handle)");
> +         break;
>
>        default:
>           unreachable("Invalid texture source type");
> --
> 2.14.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180410/5e1995d5/attachment.html>


More information about the mesa-dev mailing list