X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_batch_cache.c;h=b3a6041eead5afe5d7390668860295affb4bc214;hb=d4a5e14fae17c7ea7bb8d1d0d6467fd4e0706dd1;hp=470aca4f38090d112354ad8a421839bcd540c4a0;hpb=15ebf387fc43632be0e68365cf92ac8fb1b64a9c;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_batch_cache.c b/src/gallium/drivers/freedreno/freedreno_batch_cache.c index 470aca4f380..b3a6041eead 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch_cache.c +++ b/src/gallium/drivers/freedreno/freedreno_batch_cache.c @@ -153,6 +153,30 @@ fd_bc_flush(struct fd_batch_cache *cache, struct fd_context *ctx) } } +/* deferred flush doesn't actually flush, but it marks every other + * batch associated with the context as dependent on the current + * batch. So when the current batch gets flushed, all other batches + * that came before also get flushed. + */ +void +fd_bc_flush_deferred(struct fd_batch_cache *cache, struct fd_context *ctx) +{ + struct fd_batch *current_batch = ctx->batch; + struct hash_entry *entry; + + mtx_lock(&ctx->screen->lock); + + hash_table_foreach(cache->ht, entry) { + struct fd_batch *batch = entry->data; + if (batch == current_batch) + continue; + if (batch->ctx == ctx) + fd_batch_add_dep(current_batch, batch); + } + + mtx_unlock(&ctx->screen->lock); +} + void fd_bc_invalidate_context(struct fd_context *ctx) { @@ -205,7 +229,7 @@ fd_bc_invalidate_batch(struct fd_batch *batch, bool destroy) void fd_bc_invalidate_resource(struct fd_resource *rsc, bool destroy) { - struct fd_screen *screen = fd_screen(rsc->base.b.screen); + struct fd_screen *screen = fd_screen(rsc->base.screen); struct fd_batch *batch; mtx_lock(&screen->lock); @@ -292,7 +316,7 @@ fd_bc_alloc_batch(struct fd_batch_cache *cache, struct fd_context *ctx) idx--; /* bit zero returns 1 for ffs() */ - batch = fd_batch_create(ctx); + batch = fd_batch_create(ctx, false); if (!batch) goto out;