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

Karol Herbst kherbst at redhat.com
Thu Apr 12 16:51:11 UTC 2018


On Thu, Apr 12, 2018 at 6:33 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> 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.
>

I think we should add a field and add a is_opaque method to fix
glsl_type::contains_opaque, which is also broken, but we could do that
with a new type as well :(

>>
>> >>
>> >> +
>> >>     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
>> >>
>> >
>
>


More information about the mesa-dev mailing list