[Mesa-dev] [PATCH v2 2/3] nir: add support for bindless_texture samplers
Jason Ekstrand
jason at jlekstrand.net
Thu Apr 12 16:33:52 UTC 2018
On Thu, Apr 12, 2018 at 7:36 AM, Karol Herbst <kherbst at redhat.com> wrote:
> On Tue, Apr 10, 2018 at 5:10 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > 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.
> >
>
> well currently mesa just fails to compile, but even if it would I
> don't see a way how we know with a ir_dereference if we reference a
> bindless or bound sampler.
>
> The glsl_type doesn't tell us either and maybe it makes sense to add a
> is_bindless method to glsl_type so that we can use it in places like
> here? ir->sampler->type gives me the sampler type, but lacks the
> information if it is bindless or not. Any thoughts?
>
That seems like it's probably reasonable. I'm not sure if we really want
different types. Another option would be to handle it as a layout
qualifier on the structure type fields. I'm not sure which is better.
> >>
> >> +
> >> 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/20180412/1d2a9f21/attachment.html>
More information about the mesa-dev
mailing list