summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2019-10-11 11:50:22 -0700
committerRob Clark <[email protected]>2019-10-18 21:11:54 +0000
commit11e467c378212e5aefaaa5246839d72764a54ea2 (patch)
tree7c430addb672fa1400b92bec9269d624997190a4
parentaf817a44c15a387c920ec13a7f70aee4bd4a1a8c (diff)
freedreno/ir3: don't DCE ij_pix if used for pre-fs-texture-fetch
When we enable pre-dispatch texture fetch, we could have a scenario where the barycentric i/j coord sysval is not used in the shader, but only used for the varying fetch for the pre-dispatch texture fetch. In this case we need to take care not to DCE this sysval. Signed-off-by: Rob Clark <[email protected]> Reviewed-by: Kristian H. Kristensen <[email protected]>
-rw-r--r--src/freedreno/ir3/ir3.h4
-rw-r--r--src/freedreno/ir3/ir3_compiler_nir.c2
-rw-r--r--src/freedreno/ir3/ir3_depth.c14
3 files changed, 14 insertions, 6 deletions
diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h
index f7a87ee076a..8b8788a8a97 100644
--- a/src/freedreno/ir3/ir3.h
+++ b/src/freedreno/ir3/ir3.h
@@ -1062,13 +1062,13 @@ void ir3_print(struct ir3 *ir);
void ir3_print_instr(struct ir3_instruction *instr);
/* depth calculation: */
+struct ir3_shader_variant;
int ir3_delayslots(struct ir3_instruction *assigner,
struct ir3_instruction *consumer, unsigned n);
void ir3_insert_by_depth(struct ir3_instruction *instr, struct list_head *list);
-void ir3_depth(struct ir3 *ir);
+void ir3_depth(struct ir3 *ir, struct ir3_shader_variant *so);
/* copy-propagate: */
-struct ir3_shader_variant;
void ir3_cp(struct ir3 *ir, struct ir3_shader_variant *so);
/* group neighbors and insert mov's to resolve conflicts: */
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 081d4cf19ec..39bef63a780 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -3142,7 +3142,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
ir3_print(ir);
}
- ir3_depth(ir);
+ ir3_depth(ir, so);
if (ir3_shader_debug & IR3_DBG_OPTMSGS) {
printf("AFTER DEPTH:\n");
diff --git a/src/freedreno/ir3/ir3_depth.c b/src/freedreno/ir3/ir3_depth.c
index bc42bfdeb3b..49feda7b195 100644
--- a/src/freedreno/ir3/ir3_depth.c
+++ b/src/freedreno/ir3/ir3_depth.c
@@ -27,6 +27,7 @@
#include "util/u_math.h"
#include "ir3.h"
+#include "ir3_shader.h"
/*
* Instruction Depth:
@@ -209,7 +210,7 @@ remove_unused_by_block(struct ir3_block *block)
}
static bool
-compute_depth_and_remove_unused(struct ir3 *ir)
+compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
{
unsigned i;
bool progress = false;
@@ -221,6 +222,13 @@ compute_depth_and_remove_unused(struct ir3 *ir)
*/
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
list_for_each_entry (struct ir3_instruction, instr, &block->instr_list, node) {
+ /* special case, if pre-fs texture fetch used, we cannot
+ * eliminate the barycentric i/j input
+ */
+ if (so->num_sampler_prefetch &&
+ (instr->opc == OPC_META_INPUT) &&
+ (instr->input.sysval == SYSTEM_VALUE_BARYCENTRIC_PIXEL))
+ continue;
instr->flags |= IR3_INSTR_UNUSED;
}
}
@@ -263,10 +271,10 @@ compute_depth_and_remove_unused(struct ir3 *ir)
}
void
-ir3_depth(struct ir3 *ir)
+ir3_depth(struct ir3 *ir, struct ir3_shader_variant *so)
{
bool progress;
do {
- progress = compute_depth_and_remove_unused(ir);
+ progress = compute_depth_and_remove_unused(ir, so);
} while (progress);
}