aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-10-11 14:27:26 -0500
committerJason Ekstrand <[email protected]>2018-12-11 21:26:23 -0600
commit4a691cfa7e79c4b843fbbd8a7823636e10951ca1 (patch)
treea05ab8f8e3eb6dac4aed5054ebeea25bbd5c72bb /src/compiler
parent5a968ae473a11bd074281c5d1c4825a295e1dd13 (diff)
nir/lower_tex: Modify txd instructions instead of replacing them
I don't know if one is better than the other or not but this approach has the advantage that we never forget to copy information over and we're not hard-coding quite as many assumptions. It's also a lot simpler and much less code. Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/nir/nir_lower_tex.c48
1 files changed, 7 insertions, 41 deletions
diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c
index 86da6537d2d..cd93c4f1749 100644
--- a/src/compiler/nir/nir_lower_tex.c
+++ b/src/compiler/nir/nir_lower_tex.c
@@ -363,53 +363,19 @@ lower_ayuv_external(nir_builder *b, nir_tex_instr *tex)
}
/*
- * Emits a textureLod operation used to replace an existing
- * textureGrad instruction.
+ * Converts a nir_texop_txd instruction to nir_texop_txl with the given lod
+ * computed from the gradients.
*/
static void
replace_gradient_with_lod(nir_builder *b, nir_ssa_def *lod, nir_tex_instr *tex)
{
- /* We are going to emit a textureLod() with the same parameters except that
- * we replace ddx/ddy with lod.
- */
- int num_srcs = tex->num_srcs - 1;
- nir_tex_instr *txl = nir_tex_instr_create(b->shader, num_srcs);
-
- txl->op = nir_texop_txl;
- txl->sampler_dim = tex->sampler_dim;
- txl->texture_index = tex->texture_index;
- txl->dest_type = tex->dest_type;
- txl->is_array = tex->is_array;
- txl->is_shadow = tex->is_shadow;
- txl->is_new_style_shadow = tex->is_new_style_shadow;
- txl->sampler_index = tex->sampler_index;
- txl->coord_components = tex->coord_components;
-
- nir_ssa_dest_init(&txl->instr, &txl->dest, 4, 32, NULL);
-
- int src_num = 0;
- for (int i = 0; i < tex->num_srcs; i++) {
- if (tex->src[i].src_type == nir_tex_src_ddx ||
- tex->src[i].src_type == nir_tex_src_ddy)
- continue;
- nir_src_copy(&txl->src[src_num].src, &tex->src[i].src, txl);
- txl->src[src_num].src_type = tex->src[i].src_type;
- src_num++;
- }
-
- txl->src[src_num].src = nir_src_for_ssa(lod);
- txl->src[src_num].src_type = nir_tex_src_lod;
- src_num++;
-
- assert(src_num == num_srcs);
-
- nir_ssa_dest_init(&txl->instr, &txl->dest,
- tex->dest.ssa.num_components, 32, NULL);
- nir_builder_instr_insert(b, &txl->instr);
+ assert(tex->op == nir_texop_txd);
- nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(&txl->dest.ssa));
+ nir_tex_instr_remove_src(tex, nir_tex_instr_src_index(tex, nir_tex_src_ddx));
+ nir_tex_instr_remove_src(tex, nir_tex_instr_src_index(tex, nir_tex_src_ddy));
- nir_instr_remove(&tex->instr);
+ nir_tex_instr_add_src(tex, nir_tex_src_lod, nir_src_for_ssa(lod));
+ tex->op = nir_texop_txl;
}
static void