program: Make prog_to_nir create texture/sampler derefs.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 6 Feb 2019 03:02:44 +0000 (19:02 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 12 Feb 2019 05:34:40 +0000 (21:34 -0800)
Until now, prog_to_nir has been setting texture_index and sampler_index
directly.  This is different than GLSL shaders, which create variable
dereferences and rely on lowering passes to reach this final form.

radeonsi uses variable dereferences for samplers rather than
texture_index and sampler_index, so it doesn't even make sense to set
them there.  By moving to derefs, we ensure that both GLSL and ARB
programs produce the same final form that the driver desires.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/program/prog_to_nir.c

index afa490cdb363720acc93f25f75e5794e06b0d12e..9d4f6d63dccf4cf976782afb1dcb4acef0dcb193 100644 (file)
@@ -529,6 +529,9 @@ ptn_tex(struct ptn_compile *c, nir_alu_dest dest, nir_ssa_def **src,
       abort();
    }
 
+   /* Deref sources */
+   num_srcs += 2;
+
    if (prog_inst->TexShadow)
       num_srcs++;
 
@@ -536,8 +539,6 @@ ptn_tex(struct ptn_compile *c, nir_alu_dest dest, nir_ssa_def **src,
    instr->op = op;
    instr->dest_type = nir_type_float;
    instr->is_shadow = prog_inst->TexShadow;
-   instr->texture_index = prog_inst->TexSrcUnit;
-   instr->sampler_index = prog_inst->TexSrcUnit;
 
    switch (prog_inst->TexSrcTarget) {
    case TEXTURE_1D_INDEX:
@@ -580,17 +581,27 @@ ptn_tex(struct ptn_compile *c, nir_alu_dest dest, nir_ssa_def **src,
       unreachable("can't reach");
    }
 
-   if (!c->sampler_vars[prog_inst->TexSrcUnit]) {
+   nir_variable *var = c->sampler_vars[prog_inst->TexSrcUnit];
+   if (!var) {
       const struct glsl_type *type =
          glsl_sampler_type(instr->sampler_dim, false, false, GLSL_TYPE_FLOAT);
-      nir_variable *var =
-         nir_variable_create(b->shader, nir_var_uniform, type, "sampler");
+      var = nir_variable_create(b->shader, nir_var_uniform, type, "sampler");
       var->data.binding = prog_inst->TexSrcUnit;
+      var->data.explicit_binding = true;
       c->sampler_vars[prog_inst->TexSrcUnit] = var;
    }
 
+   nir_deref_instr *deref = nir_build_deref_var(b, var);
+
    unsigned src_number = 0;
 
+   instr->src[src_number].src = nir_src_for_ssa(&deref->dest.ssa);
+   instr->src[src_number].src_type = nir_tex_src_texture_deref;
+   src_number++;
+   instr->src[src_number].src = nir_src_for_ssa(&deref->dest.ssa);
+   instr->src[src_number].src_type = nir_tex_src_sampler_deref;
+   src_number++;
+
    instr->src[src_number].src =
       nir_src_for_ssa(nir_swizzle(b, src[0], SWIZ(X, Y, Z, W),
                                   instr->coord_components, true));