summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-09-28 13:05:12 -0400
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2019-09-30 08:40:13 -0400
commit7be00b2a06d09e8f3cf2257c7449219a4685ed7f (patch)
tree21ff94568045ad0d1f5cdfe0cf9552ea3bf5b0d2
parentc20063aa4af5d31ff706bcd4026a5c9fa575dd8b (diff)
downloadmesa-sched-h.tar.gz
pan/midgard: Allow scheduling conditions with constantssched-h
Now that we have constant adjustment logic abstracted, we can do this safely. Along with the csel inversion patch, this allows many more common csel ops to inline their condition in the bundle. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
-rw-r--r--src/panfrost/midgard/midgard_schedule.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c
index 7ed36a5e739..d5fd17bc6db 100644
--- a/src/panfrost/midgard/midgard_schedule.c
+++ b/src/panfrost/midgard/midgard_schedule.c
@@ -654,6 +654,7 @@ static unsigned
mir_comparison_mobile(
compiler_context *ctx,
midgard_instruction **instructions,
+ struct midgard_predicate *predicate,
unsigned count,
unsigned cond)
{
@@ -676,9 +677,9 @@ mir_comparison_mobile(
if (GET_CHANNEL_COUNT(alu_opcode_props[instructions[i]->alu.op].props))
return ~0;
- /* TODO: moving conditionals with constants */
+ /* Ensure it will fit with constants */
- if (instructions[i]->has_constants)
+ if (!mir_adjust_constants(instructions[i], predicate, false))
return ~0;
/* Ensure it is written only once */
@@ -689,6 +690,10 @@ mir_comparison_mobile(
ret = i;
}
+ /* Inject constants now that we are sure we want to */
+ if (ret != ~0)
+ mir_adjust_constants(instructions[ret], predicate, true);
+
return ret;
}
@@ -700,6 +705,7 @@ static midgard_instruction *
mir_schedule_comparison(
compiler_context *ctx,
midgard_instruction **instructions,
+ struct midgard_predicate *predicate,
BITSET_WORD *worklist, unsigned count,
unsigned cond, bool vector, unsigned swizzle,
midgard_instruction *user)
@@ -707,7 +713,7 @@ mir_schedule_comparison(
/* TODO: swizzle when scheduling */
unsigned comp_i =
(!vector && (swizzle == 0)) ?
- mir_comparison_mobile(ctx, instructions, count, cond) : ~0;
+ mir_comparison_mobile(ctx, instructions, predicate, count, cond) : ~0;
/* If we can, schedule the condition immediately */
if ((comp_i != ~0) && BITSET_TEST(worklist, comp_i)) {
@@ -747,7 +753,7 @@ mir_schedule_condition(compiler_context *ctx,
/* Grab the conditional instruction */
midgard_instruction *cond = mir_schedule_comparison(
- ctx, instructions, worklist, count, last->src[condition_index],
+ ctx, instructions, predicate, worklist, count, last->src[condition_index],
vector, last->cond_swizzle, last);
/* We have exclusive reign over this (possibly move) conditional