diff options
Diffstat (limited to 'src/mesa/program')
-rw-r--r-- | src/mesa/program/prog_to_nir.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/mesa/program/prog_to_nir.c b/src/mesa/program/prog_to_nir.c index afa490cdb36..9d4f6d63dcc 100644 --- a/src/mesa/program/prog_to_nir.c +++ b/src/mesa/program/prog_to_nir.c @@ -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)); |