mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02:00
freedreno/batch: fix dependency loop detection
We can have a scenario like: A -> B A -> C -> B When adding the A->C dependency, it doesn't really matter that C depends on something that A depends on, that isn't a necessary condition for a dependency loop. Instead what we want to know is that nothing C depends on, directly or indirectly, depends on A. We can detect this by recursively OR'ing the dependents_mask of C and all it's dependencies. Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
e1790c532a
commit
9d5beab441
1 changed files with 10 additions and 11 deletions
|
|
@ -401,31 +401,30 @@ fd_batch_flush(struct fd_batch *batch, bool sync)
|
|||
fd_batch_reference(&tmp, NULL);
|
||||
}
|
||||
|
||||
/* does 'batch' depend directly or indirectly on 'other' ? */
|
||||
static bool
|
||||
batch_depends_on(struct fd_batch *batch, struct fd_batch *other)
|
||||
/* find a batches dependents mask, including recursive dependencies: */
|
||||
static uint32_t
|
||||
recursive_dependents_mask(struct fd_batch *batch)
|
||||
{
|
||||
struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
|
||||
struct fd_batch *dep;
|
||||
uint32_t dependents_mask = batch->dependents_mask;
|
||||
|
||||
if (batch->dependents_mask & (1 << other->idx))
|
||||
return true;
|
||||
foreach_batch(dep, cache, batch->dependents_mask)
|
||||
dependents_mask |= recursive_dependents_mask(dep);
|
||||
|
||||
foreach_batch(dep, cache, other->dependents_mask)
|
||||
if (batch_depends_on(batch, dep))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return dependents_mask;
|
||||
}
|
||||
|
||||
void
|
||||
fd_batch_add_dep(struct fd_batch *batch, struct fd_batch *dep)
|
||||
{
|
||||
pipe_mutex_assert_locked(batch->ctx->screen->lock);
|
||||
|
||||
if (batch->dependents_mask & (1 << dep->idx))
|
||||
return;
|
||||
|
||||
/* a loop should not be possible */
|
||||
debug_assert(!batch_depends_on(dep, batch));
|
||||
debug_assert(!((1 << batch->idx) & recursive_dependents_mask(dep)));
|
||||
|
||||
struct fd_batch *other = NULL;
|
||||
fd_batch_reference_locked(&other, dep);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue