<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jun 1, 2018 at 3:57 AM, Bas Nieuwenhuizen <span dir="ltr"><<a href="mailto:bas@basnieuwenhuizen.nl" target="_blank">bas@basnieuwenhuizen.nl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, Jun 1, 2018 at 7:07 AM, Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> From: Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl">bas@basnieuwenhuizen.nl</a>><br>
><br>
> ---<br>
>  src/amd/common/ac_nir_to_llvm.<wbr>c | 404 +++++-------------------------<wbr>----------<br>
>  1 file changed, 50 insertions(+), 354 deletions(-)<br>
><br>
> diff --git a/src/amd/common/ac_nir_to_<wbr>llvm.c b/src/amd/common/ac_nir_to_<wbr>llvm.c<br>
> index 60ac8c4..38d6b31 100644<br>
> --- a/src/amd/common/ac_nir_to_<wbr>llvm.c<br>
> +++ b/src/amd/common/ac_nir_to_<wbr>llvm.c<br>
> @@ -54,7 +54,6 @@ struct ac_nir_context {<br>
>  };<br>
><br>
>  static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,<br>
> -                                    const nir_deref_var *deref,<br>
>                                      nir_deref_instr *deref_instr,<br>
>                                      enum ac_descriptor_type desc_type,<br>
>                                      const nir_tex_instr *instr,<br>
> @@ -1323,7 +1322,7 @@ static LLVMValueRef build_tex_intrinsic(struct ac_nir_context *ctx,<br>
><br>
>         if (instr->op == nir_texop_tg4 && ctx->ac.chip_class <= VI) {<br>
>                 nir_deref_instr *texture_deref_instr = get_tex_texture_deref(instr);<br>
> -               nir_variable *var = texture_deref_instr ? nir_deref_instr_get_variable(<wbr>texture_deref_instr) : instr->texture->var;<br>
> +               nir_variable *var = nir_deref_instr_get_variable(<wbr>texture_deref_instr);<br>
>                 enum glsl_base_type stype = glsl_get_sampler_result_type(<wbr>var->type);<br>
>                 if (stype == GLSL_TYPE_UINT || stype == GLSL_TYPE_INT) {<br>
>                         return lower_gather4_integer(&ctx-><wbr>ac, var, args, instr);<br>
> @@ -1629,10 +1628,10 @@ static LLVMValueRef visit_load_ubo_buffer(struct ac_nir_context *ctx,<br>
>  }<br>
><br>
>  static void<br>
> -get_deref_instr_offset(struct ac_nir_context *ctx, nir_deref_instr *instr,<br>
> -                      bool vs_in, unsigned *vertex_index_out,<br>
> -                      LLVMValueRef *vertex_index_ref,<br>
> -                      unsigned *const_out, LLVMValueRef *indir_out)<br>
> +get_deref_offset(struct ac_nir_context *ctx, nir_deref_instr *instr,<br>
> +                 bool vs_in, unsigned *vertex_index_out,<br>
> +                 LLVMValueRef *vertex_index_ref,<br>
> +                 unsigned *const_out, LLVMValueRef *indir_out)<br>
>  {<br>
>         nir_variable *var = nir_deref_instr_get_variable(<wbr>instr);<br>
>         nir_deref_path path;<br>
> @@ -1697,124 +1696,6 @@ out:<br>
>         *indir_out = offset;<br>
>  }<br>
><br>
> -static void<br>
> -get_deref_offset(struct ac_nir_context *ctx, nir_deref_var *deref,<br>
> -                bool vs_in, unsigned *vertex_index_out,<br>
> -                LLVMValueRef *vertex_index_ref,<br>
> -                unsigned *const_out, LLVMValueRef *indir_out)<br>
> -{<br>
> -       unsigned const_offset = 0;<br>
> -       nir_deref *tail = &deref->deref;<br>
> -       LLVMValueRef offset = NULL;<br>
> -<br>
> -       if (vertex_index_out != NULL || vertex_index_ref != NULL) {<br>
> -               tail = tail->child;<br>
> -               nir_deref_array *deref_array = nir_deref_as_array(tail);<br>
> -               if (vertex_index_out)<br>
> -                       *vertex_index_out = deref_array->base_offset;<br>
> -<br>
> -               if (vertex_index_ref) {<br>
> -                       LLVMValueRef vtx = LLVMConstInt(ctx->ac.i32, deref_array->base_offset, false);<br>
> -                       if (deref_array->deref_array_type == nir_deref_array_type_indirect) {<br>
> -                               vtx = LLVMBuildAdd(ctx->ac.builder, vtx, get_src(ctx, deref_array->indirect), "");<br>
> -                       }<br>
> -                       *vertex_index_ref = vtx;<br>
> -               }<br>
> -       }<br>
> -<br>
> -       if (deref->var->data.compact) {<br>
> -               assert(tail->child->deref_type == nir_deref_type_array);<br>
> -               assert(glsl_type_is_scalar(<wbr>glsl_without_array(deref->var-<wbr>>type)));<br>
> -               nir_deref_array *deref_array = nir_deref_as_array(tail-><wbr>child);<br>
> -               /* We always lower indirect dereferences for "compact" array vars. */<br>
> -               assert(deref_array->deref_<wbr>array_type == nir_deref_array_type_direct);<br>
> -<br>
> -               const_offset = deref_array->base_offset;<br>
> -               goto out;<br>
> -       }<br>
> -<br>
> -       while (tail->child != NULL) {<br>
> -               const struct glsl_type *parent_type = tail->type;<br>
> -               tail = tail->child;<br>
> -<br>
> -               if (tail->deref_type == nir_deref_type_array) {<br>
> -                       nir_deref_array *deref_array = nir_deref_as_array(tail);<br>
> -                       LLVMValueRef index, stride, local_offset;<br>
> -                       unsigned size = glsl_count_attribute_slots(<wbr>tail->type, vs_in);<br>
> -<br>
> -                       const_offset += size * deref_array->base_offset;<br>
> -                       if (deref_array->deref_array_type == nir_deref_array_type_direct)<br>
> -                               continue;<br>
> -<br>
> -                       assert(deref_array->deref_<wbr>array_type == nir_deref_array_type_indirect)<wbr>;<br>
> -                       index = get_src(ctx, deref_array->indirect);<br>
> -                       stride = LLVMConstInt(ctx->ac.i32, size, 0);<br>
> -                       local_offset = LLVMBuildMul(ctx->ac.builder, stride, index, "");<br>
> -<br>
> -                       if (offset)<br>
> -                               offset = LLVMBuildAdd(ctx->ac.builder, offset, local_offset, "");<br>
> -                       else<br>
> -                               offset = local_offset;<br>
> -               } else if (tail->deref_type == nir_deref_type_struct) {<br>
> -                       nir_deref_struct *deref_struct = nir_deref_as_struct(tail);<br>
> -<br>
> -                       for (unsigned i = 0; i < deref_struct->index; i++) {<br>
> -                               const struct glsl_type *ft = glsl_get_struct_field(parent_<wbr>type, i);<br>
> -                               const_offset += glsl_count_attribute_slots(ft, vs_in);<br>
> -                       }<br>
> -               } else<br>
> -                       unreachable("unsupported deref type");<br>
> -<br>
> -       }<br>
> -out:<br>
> -       if (const_offset && offset)<br>
> -               offset = LLVMBuildAdd(ctx->ac.builder, offset,<br>
> -                                     LLVMConstInt(ctx->ac.i32, const_offset, 0),<br>
> -                                     "");<br>
> -<br>
> -       *const_out = const_offset;<br>
> -       *indir_out = offset;<br>
> -}<br>
> -<br>
> -static LLVMValueRef<br>
> -build_gep_for_deref(struct ac_nir_context *ctx,<br>
> -                   nir_deref_var *deref)<br>
> -{<br>
> -       struct hash_entry *entry = _mesa_hash_table_search(ctx-><wbr>vars, deref->var);<br>
> -       assert(entry->data);<br>
> -       LLVMValueRef val = entry->data;<br>
> -       nir_deref *tail = deref->deref.child;<br>
> -       while (tail != NULL) {<br>
> -               LLVMValueRef offset;<br>
> -               switch (tail->deref_type) {<br>
> -               case nir_deref_type_array: {<br>
> -                       nir_deref_array *array = nir_deref_as_array(tail);<br>
> -                       offset = LLVMConstInt(ctx->ac.i32, array->base_offset, 0);<br>
> -                       if (array->deref_array_type ==<br>
> -                           nir_deref_array_type_indirect) {<br>
> -                               offset = LLVMBuildAdd(ctx->ac.builder, offset,<br>
> -                                                     get_src(ctx,<br>
> -                                                             array->indirect),<br>
> -                                                     "");<br>
> -                       }<br>
> -                       break;<br>
> -               }<br>
> -               case nir_deref_type_struct: {<br>
> -                       nir_deref_struct *deref_struct =<br>
> -                               nir_deref_as_struct(tail);<br>
> -                       offset = LLVMConstInt(ctx->ac.i32,<br>
> -                                             deref_struct->index, 0);<br>
> -                       break;<br>
> -               }<br>
> -               default:<br>
> -                       unreachable("bad deref type");<br>
> -               }<br>
> -               val = ac_build_gep0(&ctx->ac, val, offset);<br>
> -               tail = tail->child;<br>
> -       }<br>
> -       return val;<br>
> -}<br>
> -<br>
>  static LLVMValueRef load_tess_varyings(struct ac_nir_context *ctx,<br>
>                                        nir_intrinsic_instr *instr,<br>
>                                        bool load_inputs)<br>
> @@ -1824,24 +1705,16 @@ static LLVMValueRef load_tess_varyings(struct ac_nir_context *ctx,<br>
>         LLVMValueRef indir_index = NULL;<br>
>         unsigned const_index = 0;<br>
><br>
> -       bool uses_deref_chain = instr->intrinsic == nir_intrinsic_load_var;<br>
> -       nir_variable *var = uses_deref_chain ? instr->variables[0]->var :<br>
> -                            nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
> +       nir_variable *var = nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
><br>
>         unsigned location = var->data.location;<br>
>         unsigned driver_location = var->data.driver_location;<br>
>         const bool is_patch =  var->data.patch;<br>
>         const bool is_compact = var->data.compact;<br>
><br>
> -       if (uses_deref_chain) {<br>
> -               get_deref_offset(ctx, instr->variables[0],<br>
> -                                false, NULL, is_patch ? NULL : &vertex_index,<br>
> -                                &const_index, &indir_index);<br>
> -       } else {<br>
> -               get_deref_instr_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> -                                      false, NULL, is_patch ? NULL : &vertex_index,<br>
> -                                      &const_index, &indir_index);<br>
> -       }<br>
> +       get_deref_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> +                        false, NULL, is_patch ? NULL : &vertex_index,<br>
> +                        &const_index, &indir_index);<br>
><br>
>         LLVMTypeRef dest_type = get_def_type(ctx, &instr->dest.ssa);<br>
><br>
> @@ -1863,9 +1736,7 @@ static LLVMValueRef load_tess_varyings(struct ac_nir_context *ctx,<br>
>  static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,<br>
>                                    nir_intrinsic_instr *instr)<br>
>  {<br>
> -       bool uses_deref_chain = instr->intrinsic == nir_intrinsic_load_var;<br>
> -       nir_variable *var = uses_deref_chain ? instr->variables[0]->var :<br>
> -                           nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
> +       nir_variable *var = nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
><br>
>         LLVMValueRef values[8];<br>
>         int idx = var->data.driver_location;<br>
> @@ -1878,13 +1749,8 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,<br>
>         bool vs_in = ctx->stage == MESA_SHADER_VERTEX &&<br>
>                      var->data.mode == nir_var_shader_in;<br>
><br>
> -       if (uses_deref_chain) {<br>
> -               get_deref_offset(ctx, instr->variables[0], vs_in, NULL, NULL,<br>
> -                                &const_index, &indir_index);<br>
> -       } else {<br>
> -               get_deref_instr_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), vs_in, NULL, NULL,<br>
> -                                      &const_index, &indir_index);<br>
> -       }<br>
> +       get_deref_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), vs_in, NULL, NULL,<br>
> +                        &const_index, &indir_index);<br>
><br>
>         if (instr->dest.ssa.bit_size == 64)<br>
>                 ve *= 2;<br>
> @@ -1900,14 +1766,8 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,<br>
>                         LLVMTypeRef type = LLVMIntTypeInContext(ctx->ac.<wbr>context, instr->dest.ssa.bit_size);<br>
>                         LLVMValueRef indir_index;<br>
>                         unsigned const_index, vertex_index;<br>
> -                       if (uses_deref_chain) {<br>
> -                               get_deref_offset(ctx, instr->variables[0],<br>
> -                                                false, &vertex_index, NULL,<br>
> -                                                &const_index, &indir_index);<br>
> -                       } else {<br>
> -                               get_deref_instr_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> -                                                      false, &vertex_index, NULL, &const_index, &indir_index);<br>
> -                       }<br>
> +                       get_deref_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> +                                        false, &vertex_index, NULL, &const_index, &indir_index);<br>
><br>
>                         return ctx->abi->load_inputs(ctx-><wbr>abi, var->data.location,<br>
>                                                      var->data.driver_location,<br>
> @@ -1951,9 +1811,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,<br>
>                 }<br>
>                 break;<br>
>         case nir_var_shared: {<br>
> -               LLVMValueRef address = uses_deref_chain ?<br>
> -                                          build_gep_for_deref(ctx, instr->variables[0])<br>
> -                                        : get_src(ctx, instr->src[0]);<br>
> +               LLVMValueRef address = get_src(ctx, instr->src[0]);<br>
>                 LLVMValueRef val = LLVMBuildLoad(ctx->ac.builder, address, "");<br>
>                 return LLVMBuildBitCast(ctx->ac.<wbr>builder, val,<br>
>                                         get_def_type(ctx, &instr->dest.ssa),<br>
> @@ -1994,25 +1852,18 @@ static void<br>
>  visit_store_var(struct ac_nir_context *ctx,<br>
>                 nir_intrinsic_instr *instr)<br>
>  {<br>
> -        bool uses_deref_chain = instr->intrinsic == nir_intrinsic_store_var;<br>
> -        nir_variable *var = uses_deref_chain ? instr->variables[0]->var :<br>
> -                            nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
> +        nir_variable *var = nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
><br>
>         LLVMValueRef temp_ptr, value;<br>
>         int idx = var->data.driver_location;<br>
>         unsigned comp = var->data.location_frac;<br>
> -       LLVMValueRef src = ac_to_float(&ctx->ac, get_src(ctx, instr->src[uses_deref_chain ? 0 : 1]));<br>
> +       LLVMValueRef src = ac_to_float(&ctx->ac, get_src(ctx, instr->src[1]));<br>
>         int writemask = instr->const_index[0];<br>
>         LLVMValueRef indir_index;<br>
>         unsigned const_index;<br>
><br>
> -       if (uses_deref_chain) {<br>
> -               get_deref_offset(ctx, instr->variables[0], false,<br>
> -                                NULL, NULL, &const_index, &indir_index);<br>
> -       } else {<br>
> -               get_deref_instr_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), false,<br>
> -                                      NULL, NULL, &const_index, &indir_index);<br>
> -       }<br>
> +       get_deref_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), false,<br>
> +                        NULL, NULL, &const_index, &indir_index);<br>
><br>
>         if (ac_get_elem_bits(&ctx->ac, LLVMTypeOf(src)) == 64) {<br>
><br>
> @@ -2034,15 +1885,9 @@ visit_store_var(struct ac_nir_context *ctx,<br>
>                         unsigned const_index = 0;<br>
>                         const bool is_patch = var->data.patch;<br>
><br>
> -                       if (uses_deref_chain) {<br>
> -                               get_deref_offset(ctx, instr->variables[0],<br>
> -                                                false, NULL, is_patch ? NULL : &vertex_index,<br>
> -                                                &const_index, &indir_index);<br>
> -                       } else {<br>
> -                               get_deref_instr_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> -                                                false, NULL, is_patch ? NULL : &vertex_index,<br>
> -                                                &const_index, &indir_index);<br>
> -                       }<br>
> +                       get_deref_offset(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr),<br>
> +                                        false, NULL, is_patch ? NULL : &vertex_index,<br>
> +                                        &const_index, &indir_index);<br>
><br>
>                         ctx->abi->store_tcs_outputs(<wbr>ctx->abi, var,<br>
>                                                     vertex_index, indir_index,<br>
> @@ -2106,10 +1951,8 @@ visit_store_var(struct ac_nir_context *ctx,<br>
>                 break;<br>
>         case nir_var_shared: {<br>
>                 int writemask = instr->const_index[0];<br>
> -               LLVMValueRef address = uses_deref_chain ?<br>
> -                                            build_gep_for_deref(ctx, instr->variables[0])<br>
> -                                          : get_src(ctx, instr->src[0]);<br>
> -               LLVMValueRef val = get_src(ctx, instr->src[uses_deref_chain ? 0 : 1]);<br>
> +               LLVMValueRef address = get_src(ctx, instr->src[0]);<br>
> +               LLVMValueRef val = get_src(ctx, instr->src[1]);<br>
>                 if (util_is_power_of_two_nonzero(<wbr>writemask)) {<br>
>                         val = LLVMBuildBitCast(<br>
>                            ctx->ac.builder, val,<br>
> @@ -2236,32 +2079,8 @@ static LLVMValueRef adjust_sample_index_using_<wbr>fmask(struct ac_llvm_context *ctx,<br>
>         return sample_index;<br>
>  }<br>
><br>
> -static bool is_var_image_intrinsic(const nir_intrinsic_instr *instr)<br>
> -{<br>
> -       switch(instr->intrinsic) {<br>
> -       case nir_intrinsic_image_var_<wbr>samples:<br>
> -       case nir_intrinsic_image_var_load:<br>
> -       case nir_intrinsic_image_var_store:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_add:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_min:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_max:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_and:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_or:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_xor:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_exchange:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_comp_swap:<br>
> -       case nir_intrinsic_image_var_size:<br>
> -               return true;<br>
> -       default:<br>
> -               return false;<br>
> -       }<br>
> -}<br>
> -<br>
>  static nir_variable *get_image_variable(const nir_intrinsic_instr *instr)<br>
>  {<br>
> -       if (is_var_image_intrinsic(instr)<wbr>)<br>
> -               return instr->variables[0]->var;<br>
> -<br>
>         assert(instr->src[0].is_ssa);<br>
>         return nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
>  }<br>
> @@ -2271,26 +2090,21 @@ static LLVMValueRef get_image_descriptor(struct ac_nir_context *ctx,<br>
>                                           enum ac_descriptor_type desc_type,<br>
>                                           bool write)<br>
>  {<br>
> -       if (is_var_image_intrinsic(instr)<wbr>)<br>
> -               return get_sampler_desc(ctx, instr->variables[0], NULL, desc_type, NULL, true, true);<br>
> -<br>
> -       return get_sampler_desc(ctx, NULL, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), desc_type, NULL, true, true);<br>
> +       return get_sampler_desc(ctx, nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr), desc_type, NULL, true, true);<br>
>  }<br>
><br>
>  static void get_image_coords(struct ac_nir_context *ctx,<br>
>                              const nir_intrinsic_instr *instr,<br>
>                              struct ac_image_args *args)<br>
>  {<br>
> -       /* As the deref instrinsics have the deref as src 0, everything is shifted. */<br>
> -       int src_shift = is_var_image_intrinsic(instr) ? 0 : 1;<br>
>         const struct glsl_type *type = glsl_without_array(get_image_<wbr>variable(instr)->type);<br>
><br>
> -       LLVMValueRef src0 = get_src(ctx, instr->src[src_shift]);<br>
> +       LLVMValueRef src0 = get_src(ctx, instr->src[1]);<br>
>         LLVMValueRef masks[] = {<br>
>                 LLVMConstInt(ctx->ac.i32, 0, false), LLVMConstInt(ctx->ac.i32, 1, false),<br>
>                 LLVMConstInt(ctx->ac.i32, 2, false), LLVMConstInt(ctx->ac.i32, 3, false),<br>
>         };<br>
> -       LLVMValueRef sample_index = ac_llvm_extract_elem(&ctx->ac, get_src(ctx, instr->src[src_shift + 1]), 0);<br>
> +       LLVMValueRef sample_index = ac_llvm_extract_elem(&ctx->ac, get_src(ctx, instr->src[2]), 0);<br>
><br>
>         int count;<br>
>         enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);<br>
> @@ -2328,7 +2142,7 @@ static void get_image_coords(struct ac_nir_context *ctx,<br>
>                                                                get_image_descriptor(ctx, instr, AC_DESC_FMASK, false));<br>
>         }<br>
>         if (count == 1 && !gfx9_1d) {<br>
> -               if (instr->src[src_shift].ssa-><wbr>num_components)<br>
> +               if (instr->src[1].ssa->num_<wbr>components)<br>
>                         args->coords[0] = LLVMBuildExtractElement(ctx-><wbr>ac.builder, src0, masks[0], "");<br>
>                 else<br>
>                         args->coords[0] = src0;<br>
> @@ -2398,15 +2212,12 @@ static LLVMValueRef visit_image_load(struct ac_nir_context *ctx,<br>
><br>
>         const enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);<br>
>         if (dim == GLSL_SAMPLER_DIM_BUF) {<br>
> -               /* As the deref instrinsics have the deref as src 0, everything is shifted. */<br>
> -               int src_shift = is_var_image_intrinsic(instr) ? 0 : 1;<br>
> -<br>
>                 unsigned mask = nir_ssa_def_components_read(&<wbr>instr->dest.ssa);<br>
>                 unsigned num_channels = util_last_bit(mask);<br>
>                 LLVMValueRef rsrc, vindex;<br>
><br>
>                 rsrc = get_image_buffer_descriptor(<wbr>ctx, instr, false);<br>
> -               vindex = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[src_shift]),<br>
> +               vindex = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[1]),<br>
>                                                  ctx->ac.i32_0, "");<br>
><br>
>                 /* TODO: set "glc" and "can_speculate" when OpenGL needs it. */<br>
> @@ -2446,15 +2257,12 @@ static void visit_image_store(struct ac_nir_context *ctx,<br>
>         if (force_glc)<br>
>                 glc = ctx->ac.i1true;<br>
><br>
> -       /* As the deref instrinsics have the deref as src 0, everything is shifted. */<br>
> -       int src_shift = is_var_image_intrinsic(instr) ? 0 : 1;<br>
> -<br>
>         if (dim == GLSL_SAMPLER_DIM_BUF) {<br>
>                 LLVMValueRef rsrc = get_image_buffer_descriptor(<wbr>ctx, instr, true);<br>
><br>
> -               params[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[src_shift + 2])); /* data */<br>
> +               params[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[3])); /* data */<br>
>                 params[1] = rsrc;<br>
> -               params[2] = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[src_shift]),<br>
> +               params[2] = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[1]),<br>
>                                                     ctx->ac.i32_0, ""); /* vindex */<br>
>                 params[3] = ctx->ac.i32_0; /* voffset */<br>
>                 params[4] = glc;  /* glc */<br>
> @@ -2464,9 +2272,9 @@ static void visit_image_store(struct ac_nir_context *ctx,<br>
>         } else {<br>
>                 struct ac_image_args args = {};<br>
>                 args.opcode = ac_image_store;<br>
> -               args.data[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[2]));<br>
> +               args.data[0] = ac_to_float(&ctx->ac, get_src(ctx, instr->src[3]));<br>
>                 get_image_coords(ctx, instr, &args);<br>
> -               args.resource = get_image_descriptor(ctx, instr, AC_DESC_IMAGE, true);;<br>
> +               args.resource = get_image_descriptor(ctx, instr, AC_DESC_IMAGE, true);<br>
>                 args.dim = get_ac_image_dim(&ctx->ac, glsl_get_sampler_dim(type),<br>
>                                             glsl_sampler_type_is_array(<wbr>type));<br>
>                 args.dmask = 15;<br>
> @@ -2485,8 +2293,7 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,<br>
>         int param_count = 0;<br>
>         const nir_variable *var = get_image_variable(instr);<br>
><br>
> -       bool cmpswap = instr->intrinsic == nir_intrinsic_image_var_<wbr>atomic_comp_swap ||<br>
> -                      instr->intrinsic == nir_intrinsic_image_deref_<wbr>atomic_comp_swap;<br>
> +       bool cmpswap = instr->intrinsic == nir_intrinsic_image_deref_<wbr>atomic_comp_swap;<br>
>         const char *atomic_name;<br>
>         char intrinsic_name[41];<br>
>         enum ac_atomic_op atomic_subop;<br>
> @@ -2496,42 +2303,34 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,<br>
>         bool is_unsigned = glsl_get_sampler_result_type(<wbr>type) == GLSL_TYPE_UINT;<br>
><br>
>         switch (instr->intrinsic) {<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_add:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_add:<br>
>                 atomic_name = "add";<br>
>                 atomic_subop = ac_atomic_add;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_min:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_min:<br>
>                 atomic_name = is_unsigned ? "umin" : "smin";<br>
>                 atomic_subop = is_unsigned ? ac_atomic_umin : ac_atomic_smin;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_max:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_max:<br>
>                 atomic_name = is_unsigned ? "umax" : "smax";<br>
>                 atomic_subop = is_unsigned ? ac_atomic_umax : ac_atomic_smax;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_and:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_and:<br>
>                 atomic_name = "and";<br>
>                 atomic_subop = ac_atomic_and;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_or:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_or:<br>
>                 atomic_name = "or";<br>
>                 atomic_subop = ac_atomic_or;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_xor:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_xor:<br>
>                 atomic_name = "xor";<br>
>                 atomic_subop = ac_atomic_xor;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_exchange:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_exchange:<br>
>                 atomic_name = "swap";<br>
>                 atomic_subop = ac_atomic_swap;<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_comp_swap:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_comp_swap:<br>
>                 atomic_name = "cmpswap";<br>
>                 atomic_subop = 0; /* not used */<br>
> @@ -2540,16 +2339,13 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx,<br>
>                 abort();<br>
>         }<br>
><br>
> -       /* As the deref instrinsics have the deref as src 0, everything is shifted. */<br>
> -       int src_shift = is_var_image_intrinsic(instr) ? 0 : 1;<br>
> -<br>
>         if (cmpswap)<br>
> -               params[param_count++] = get_src(ctx, instr->src[src_shift + 3]);<br>
> -       params[param_count++] = get_src(ctx, instr->src[src_shift + 2]);<br>
> +               params[param_count++] = get_src(ctx, instr->src[4]);<br>
> +       params[param_count++] = get_src(ctx, instr->src[3]);<br>
><br>
>         if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {<br>
>                 params[param_count++] = get_image_buffer_descriptor(<wbr>ctx, instr, true);<br>
> -               params[param_count++] = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[src_shift]),<br>
> +               params[param_count++] = LLVMBuildExtractElement(ctx-><wbr>ac.builder, get_src(ctx, instr->src[1]),<br>
>                                                                 ctx->ac.i32_0, ""); /* vindex */<br>
>                 params[param_count++] = ctx->ac.i32_0; /* voffset */<br>
>                 params[param_count++] = ctx->ac.i1false;  /* slc */<br>
> @@ -2805,8 +2601,7 @@ static LLVMValueRef visit_var_atomic(struct ac_nir_context *ctx,<br>
>         LLVMValueRef result;<br>
>         LLVMValueRef src = get_src(ctx, instr->src[src_idx]);<br>
><br>
> -       if (instr->intrinsic == nir_intrinsic_var_atomic_comp_<wbr>swap ||<br>
> -           instr->intrinsic == nir_intrinsic_shared_atomic_<wbr>comp_swap ||<br>
> +       if (instr->intrinsic == nir_intrinsic_shared_atomic_<wbr>comp_swap ||<br>
>             instr->intrinsic == nir_intrinsic_deref_atomic_<wbr>comp_swap) {<br>
>                 LLVMValueRef src1 = get_src(ctx, instr->src[src_idx + 1]);<br>
>                 result = LLVMBuildAtomicCmpXchg(ctx-><wbr>ac.builder,<br>
> @@ -2818,47 +2613,38 @@ static LLVMValueRef visit_var_atomic(struct ac_nir_context *ctx,<br>
>         } else {<br>
>                 LLVMAtomicRMWBinOp op;<br>
>                 switch (instr->intrinsic) {<br>
> -               case nir_intrinsic_var_atomic_add:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>add:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>add:<br>
>                         op = LLVMAtomicRMWBinOpAdd;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_umin:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>umin:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>umin:<br>
>                         op = LLVMAtomicRMWBinOpUMin;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_umax:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>umax:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>umax:<br>
>                         op = LLVMAtomicRMWBinOpUMax;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_imin:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>imin:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>imin:<br>
>                         op = LLVMAtomicRMWBinOpMin;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_imax:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>imax:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>imax:<br>
>                         op = LLVMAtomicRMWBinOpMax;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_and:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>and:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>and:<br>
>                         op = LLVMAtomicRMWBinOpAnd;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_or:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>or:<br>
>                 case nir_intrinsic_deref_atomic_or:<br>
>                         op = LLVMAtomicRMWBinOpOr;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_xor:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>xor:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>xor:<br>
>                         op = LLVMAtomicRMWBinOpXor;<br>
>                         break;<br>
> -               case nir_intrinsic_var_atomic_<wbr>exchange:<br>
>                 case nir_intrinsic_shared_atomic_<wbr>exchange:<br>
>                 case nir_intrinsic_deref_atomic_<wbr>exchange:<br>
>                         op = LLVMAtomicRMWBinOpXchg;<br>
> @@ -2897,42 +2683,26 @@ static LLVMValueRef visit_interp(struct ac_nir_context *ctx,<br>
>         LLVMValueRef src_c0 = NULL;<br>
>         LLVMValueRef src_c1 = NULL;<br>
>         LLVMValueRef src0 = NULL;<br>
> -       bool uses_deref_chain;<br>
> -       switch (instr->intrinsic) {<br>
> -       case nir_intrinsic_interp_var_at_<wbr>centroid:<br>
> -       case nir_intrinsic_interp_var_at_<wbr>sample:<br>
> -       case nir_intrinsic_interp_var_at_<wbr>offset:<br>
> -               uses_deref_chain = true;<br>
> -               break;<br>
> -       default:<br>
> -               uses_deref_chain = false;<br>
> -               break;<br>
> -       }<br>
><br>
> -       nir_variable *var = uses_deref_chain ? instr->variables[0]->var : nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
> +       nir_variable *var = nir_deref_instr_get_variable(<wbr>nir_instr_as_deref(instr->src[<wbr>0].ssa->parent_instr));<br>
>         int input_index = var->data.location - VARYING_SLOT_VAR0;<br>
>         switch (instr->intrinsic) {<br>
> -       case nir_intrinsic_interp_var_at_<wbr>centroid:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>centroid:<br>
>                 location = INTERP_CENTROID;<br>
>                 break;<br>
> -       case nir_intrinsic_interp_var_at_<wbr>sample:<br>
> -       case nir_intrinsic_interp_var_at_<wbr>offset:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>sample:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>offset:<br>
>                 location = INTERP_CENTER;<br>
> -               src0 = get_src(ctx, instr->src[uses_deref_chain ? 0 : 1]);<br>
> +               src0 = get_src(ctx, instr->src[11]);<br>
<br>
</div></div>Stupid mistake here, 11 -> 1<br>
<br>
Not sure why I did not catch this before :(<br><div class="HOEnZb"><div class="h5"></div></div></blockquote><div><br></div><div>Fixed.  I also force-pushed the branch with the change.</div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
>                 break;<br>
>         default:<br>
>                 break;<br>
>         }<br>
><br>
> -       if (instr->intrinsic == nir_intrinsic_interp_var_at_<wbr>offset ||<br>
> -           instr->intrinsic == nir_intrinsic_interp_deref_at_<wbr>offset) {<br>
> +       if (instr->intrinsic == nir_intrinsic_interp_deref_at_<wbr>offset) {<br>
>                 src_c0 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx-><wbr>ac.builder, src0, ctx->ac.i32_0, ""));<br>
>                 src_c1 = ac_to_float(&ctx->ac, LLVMBuildExtractElement(ctx-><wbr>ac.builder, src0, ctx->ac.i32_1, ""));<br>
> -       } else if (instr->intrinsic == nir_intrinsic_interp_var_at_<wbr>sample ||<br>
> -                  instr->intrinsic == nir_intrinsic_interp_deref_at_<wbr>sample) {<br>
> +       } else if (instr->intrinsic == nir_intrinsic_interp_deref_at_<wbr>sample) {<br>
>                 LLVMValueRef sample_position;<br>
>                 LLVMValueRef halfval = LLVMConstReal(ctx->ac.f32, 0.5f);<br>
><br>
> @@ -3168,11 +2938,9 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>                 result = visit_get_buffer_size(ctx, instr);<br>
>                 break;<br>
>         case nir_intrinsic_load_deref:<br>
> -       case nir_intrinsic_load_var:<br>
>                 result = visit_load_var(ctx, instr);<br>
>                 break;<br>
>         case nir_intrinsic_store_deref:<br>
> -       case nir_intrinsic_store_var:<br>
>                 visit_store_var(ctx, instr);<br>
>                 break;<br>
>         case nir_intrinsic_load_shared:<br>
> @@ -3181,26 +2949,15 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>         case nir_intrinsic_store_shared:<br>
>                 visit_store_shared(ctx, instr);<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>samples:<br>
>         case nir_intrinsic_image_deref_<wbr>samples:<br>
>                 result = visit_image_samples(ctx, instr);<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_load:<br>
>         case nir_intrinsic_image_deref_<wbr>load:<br>
>                 result = visit_image_load(ctx, instr);<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_store:<br>
>         case nir_intrinsic_image_deref_<wbr>store:<br>
>                 visit_image_store(ctx, instr);<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_add:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_min:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_max:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_and:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_or:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_xor:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_exchange:<br>
> -       case nir_intrinsic_image_var_<wbr>atomic_comp_swap:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_add:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_min:<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_max:<br>
> @@ -3211,7 +2968,6 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>         case nir_intrinsic_image_deref_<wbr>atomic_comp_swap:<br>
>                 result = visit_image_atomic(ctx, instr);<br>
>                 break;<br>
> -       case nir_intrinsic_image_var_size:<br>
>         case nir_intrinsic_image_deref_<wbr>size:<br>
>                 result = visit_image_size(ctx, instr);<br>
>                 break;<br>
> @@ -3247,20 +3003,6 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>                 result = visit_var_atomic(ctx, instr, ptr, 1);<br>
>                 break;<br>
>         }<br>
> -       case nir_intrinsic_var_atomic_add:<br>
> -       case nir_intrinsic_var_atomic_imin:<br>
> -       case nir_intrinsic_var_atomic_umin:<br>
> -       case nir_intrinsic_var_atomic_imax:<br>
> -       case nir_intrinsic_var_atomic_umax:<br>
> -       case nir_intrinsic_var_atomic_and:<br>
> -       case nir_intrinsic_var_atomic_or:<br>
> -       case nir_intrinsic_var_atomic_xor:<br>
> -       case nir_intrinsic_var_atomic_<wbr>exchange:<br>
> -       case nir_intrinsic_var_atomic_comp_<wbr>swap: {<br>
> -               LLVMValueRef ptr = build_gep_for_deref(ctx, instr->variables[0]);<br>
> -               result = visit_var_atomic(ctx, instr, ptr, 0);<br>
> -               break;<br>
> -       }<br>
>         case nir_intrinsic_deref_atomic_<wbr>add:<br>
>         case nir_intrinsic_deref_atomic_<wbr>imin:<br>
>         case nir_intrinsic_deref_atomic_<wbr>umin:<br>
> @@ -3275,9 +3017,6 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>                 result = visit_var_atomic(ctx, instr, ptr, 1);<br>
>                 break;<br>
>         }<br>
> -       case nir_intrinsic_interp_var_at_<wbr>centroid:<br>
> -       case nir_intrinsic_interp_var_at_<wbr>sample:<br>
> -       case nir_intrinsic_interp_var_at_<wbr>offset:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>centroid:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>sample:<br>
>         case nir_intrinsic_interp_deref_at_<wbr>offset:<br>
> @@ -3358,7 +3097,6 @@ static void visit_intrinsic(struct ac_nir_context *ctx,<br>
>  }<br>
><br>
>  static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,<br>
> -                                    const nir_deref_var *deref,<br>
>                                      nir_deref_instr *deref_instr,<br>
>                                      enum ac_descriptor_type desc_type,<br>
>                                      const nir_tex_instr *tex_instr,<br>
> @@ -3370,11 +3108,11 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,<br>
>         unsigned base_index;<br>
>         bool bindless = false;<br>
><br>
> -       if (!deref && !deref_instr) {<br>
> +       if (!deref_instr) {<br>
>                 assert(tex_instr && !image);<br>
>                 descriptor_set = 0;<br>
>                 base_index = tex_instr->sampler_index;<br>
> -       } else if(deref_instr) {<br>
> +       } else {<br>
>                 while(deref_instr->deref_type != nir_deref_type_var) {<br>
>                         unsigned array_size = glsl_get_aoa_size(deref_instr-<wbr>>type);<br>
>                         if (!array_size)<br>
> @@ -3400,41 +3138,6 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,<br>
>                 }<br>
>                 descriptor_set = deref_instr->var->data.<wbr>descriptor_set;<br>
>                 base_index = deref_instr->var->data.<wbr>binding;<br>
> -        } else {<br>
> -               const nir_deref *tail = &deref->deref;<br>
> -               while (tail->child) {<br>
> -                       const nir_deref_array *child = nir_deref_as_array(tail-><wbr>child);<br>
> -                       unsigned array_size = glsl_get_aoa_size(tail->child-<wbr>>type);<br>
> -<br>
> -                       if (!array_size)<br>
> -                               array_size = 1;<br>
> -<br>
> -                       assert(child->deref_array_type != nir_deref_array_type_wildcard)<wbr>;<br>
> -<br>
> -                       if (child->deref_array_type == nir_deref_array_type_indirect) {<br>
> -                               LLVMValueRef indirect = get_src(ctx, child->indirect);<br>
> -<br>
> -                               indirect = LLVMBuildMul(ctx->ac.builder, indirect,<br>
> -                                       LLVMConstInt(ctx->ac.i32, array_size, false), "");<br>
> -<br>
> -                               if (!index)<br>
> -                                       index = indirect;<br>
> -                               else<br>
> -                                       index = LLVMBuildAdd(ctx->ac.builder, index, indirect, "");<br>
> -                       }<br>
> -<br>
> -                       constant_index += child->base_offset * array_size;<br>
> -<br>
> -                       tail = &child->deref;<br>
> -               }<br>
> -               descriptor_set = deref->var->data.descriptor_<wbr>set;<br>
> -<br>
> -               if (deref->var->data.bindless) {<br>
> -                       bindless = deref->var->data.bindless;<br>
> -                       base_index = deref->var->data.driver_<wbr>location;<br>
> -               } else {<br>
> -                       base_index = deref->var->data.binding;<br>
> -               }<br>
>         }<br>
><br>
>         return ctx->abi->load_sampler_desc(<wbr>ctx->abi,<br>
> @@ -3480,8 +3183,6 @@ static void tex_fetch_ptrs(struct ac_nir_context *ctx,<br>
>  {<br>
>         nir_deref_instr *texture_deref_instr = NULL;<br>
>         nir_deref_instr *sampler_deref_instr = NULL;<br>
> -       nir_deref_var *texture_deref_var = NULL;<br>
> -       nir_deref_var *sampler_deref_var = NULL;<br>
><br>
>         for (unsigned i = 0; i < instr->num_srcs; i++) {<br>
>                 switch (instr->src[i].src_type) {<br>
> @@ -3499,23 +3200,18 @@ static void tex_fetch_ptrs(struct ac_nir_context *ctx,<br>
>         if (!sampler_deref_instr)<br>
>                 sampler_deref_instr = texture_deref_instr;<br>
><br>
> -       if (!texture_deref_instr) {<br>
> -               texture_deref_var = instr->texture;<br>
> -               sampler_deref_var = instr->sampler ? instr->sampler : instr->texture;<br>
> -       }<br>
> -<br>
>         if (instr->sampler_dim  == GLSL_SAMPLER_DIM_BUF)<br>
> -               *res_ptr = get_sampler_desc(ctx, texture_deref_var, texture_deref_instr, AC_DESC_BUFFER, instr, false, false);<br>
> +               *res_ptr = get_sampler_desc(ctx, texture_deref_instr, AC_DESC_BUFFER, instr, false, false);<br>
>         else<br>
> -               *res_ptr = get_sampler_desc(ctx, texture_deref_var, texture_deref_instr, AC_DESC_IMAGE, instr, false, false);<br>
> +               *res_ptr = get_sampler_desc(ctx, texture_deref_instr, AC_DESC_IMAGE, instr, false, false);<br>
>         if (samp_ptr) {<br>
> -               *samp_ptr = get_sampler_desc(ctx, sampler_deref_var, sampler_deref_instr, AC_DESC_SAMPLER, instr, false, false);<br>
> +               *samp_ptr = get_sampler_desc(ctx, sampler_deref_instr, AC_DESC_SAMPLER, instr, false, false);<br>
>                 if (instr->sampler_dim < GLSL_SAMPLER_DIM_RECT)<br>
>                         *samp_ptr = sici_fix_sampler_aniso(ctx, *res_ptr, *samp_ptr);<br>
>         }<br>
> -       if (fmask_ptr && !instr->sampler && (instr->op == nir_texop_txf_ms ||<br>
> -                                            instr->op == nir_texop_samples_identical))<br>
> -               *fmask_ptr = get_sampler_desc(ctx, instr->texture, texture_deref_instr, AC_DESC_FMASK, instr, false, false);<br>
> +       if (fmask_ptr && (instr->op == nir_texop_txf_ms ||<br>
> +                         instr->op == nir_texop_samples_identical))<br>
> +               *fmask_ptr = get_sampler_desc(ctx, texture_deref_instr, AC_DESC_FMASK, instr, false, false);<br>
>  }<br>
><br>
>  static LLVMValueRef apply_round_slice(struct ac_llvm_context *ctx,<br>
> --<br>
> 2.5.0.400.gff86faf<br>
><br>
</div></div></blockquote></div><br></div></div>