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:
@@ -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
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user