d3d12: When mapping a resource used in the current batch without blocking, at least flush

Also, resource_is_busy needs to opportunistically retire batches, so apps can
spin on non-blocking resource maps and eventually succeed.

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14959>
This commit is contained in:
Jesse Natalie
2022-02-10 11:08:16 -08:00
committed by Marge Bot
parent 1cb3d1a6ae
commit 5cbd7093af
2 changed files with 14 additions and 12 deletions

View File

@@ -1670,7 +1670,6 @@ spec/arb_texture_barrier/arb_texture_barrier-blending-in-shader 512 42 8 8 7: sk
spec/arb_texture_barrier/arb_texture_barrier-blending-in-shader 512 42 8 8 8: skip spec/arb_texture_barrier/arb_texture_barrier-blending-in-shader 512 42 8 8 8: skip
spec/arb_texture_buffer_object/bufferstorage: skip spec/arb_texture_buffer_object/bufferstorage: skip
spec/arb_texture_buffer_object/negative-unsupported: skip spec/arb_texture_buffer_object/negative-unsupported: skip
spec/arb_texture_buffer_object/subdata-sync: fail
spec/arb_texture_buffer_range/ranges-2: fail spec/arb_texture_buffer_range/ranges-2: fail
spec/arb_texture_buffer_range/ranges-2 compat: fail spec/arb_texture_buffer_range/ranges-2 compat: fail
spec/arb_texture_cube_map/copyteximage cube samples=16: skip spec/arb_texture_cube_map/copyteximage cube samples=16: skip
@@ -3526,8 +3525,8 @@ wgl/wgl-sanity: skip
summary: summary:
name: results name: results
---- -------- ---- --------
pass: 17840 pass: 17841
fail: 2047 fail: 2046
crash: 7 crash: 7
skip: 1452 skip: 1452
timeout: 0 timeout: 0

View File

@@ -80,11 +80,14 @@ resource_is_busy(struct d3d12_context *ctx,
struct d3d12_resource *res, struct d3d12_resource *res,
bool want_to_write) bool want_to_write)
{ {
if (d3d12_batch_has_references(d3d12_current_batch(ctx), res->bo, want_to_write))
return true;
bool busy = false; bool busy = false;
d3d12_foreach_submitted_batch(ctx, batch) {
for (unsigned i = 0; i < ARRAY_SIZE(ctx->batches); i++) if (!d3d12_reset_batch(ctx, batch, 0))
busy |= d3d12_batch_has_references(&ctx->batches[i], res->bo, want_to_write); busy |= d3d12_batch_has_references(batch, res->bo, want_to_write);
}
return busy; return busy;
} }
@@ -97,11 +100,8 @@ d3d12_resource_wait_idle(struct d3d12_context *ctx,
d3d12_flush_cmdlist_and_wait(ctx); d3d12_flush_cmdlist_and_wait(ctx);
} else { } else {
d3d12_foreach_submitted_batch(ctx, batch) { d3d12_foreach_submitted_batch(ctx, batch) {
if (d3d12_batch_has_references(batch, res->bo, want_to_write)) { if (d3d12_batch_has_references(batch, res->bo, want_to_write))
d3d12_reset_batch(ctx, batch, PIPE_TIMEOUT_INFINITE); d3d12_reset_batch(ctx, batch, PIPE_TIMEOUT_INFINITE);
if (!resource_is_busy(ctx, res, want_to_write))
break;
}
} }
} }
} }
@@ -945,8 +945,11 @@ synchronize(struct d3d12_context *ctx,
} }
if (!(usage & PIPE_MAP_UNSYNCHRONIZED) && resource_is_busy(ctx, res, usage & PIPE_MAP_WRITE)) { if (!(usage & PIPE_MAP_UNSYNCHRONIZED) && resource_is_busy(ctx, res, usage & PIPE_MAP_WRITE)) {
if (usage & PIPE_MAP_DONTBLOCK) if (usage & PIPE_MAP_DONTBLOCK) {
if (d3d12_batch_has_references(d3d12_current_batch(ctx), res->bo, usage & PIPE_MAP_WRITE))
d3d12_flush_cmdlist(ctx);
return false; return false;
}
d3d12_resource_wait_idle(ctx, res, usage & PIPE_MAP_WRITE); d3d12_resource_wait_idle(ctx, res, usage & PIPE_MAP_WRITE);
} }