mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 12:30:09 +01:00
dzn: Remove cmdbuf query 'wait' list
From the Vulkan spec, the WAIT flag on vkCmdCopyQueryPoolResults only serves to increase the first synchronization scope to include query end commands, but either way, the synchronization scope only includes commands that occur earlier in submission order. In other words, we don't need to enforce queue ordering, a pipeline barrier is all that's needed. Fixes deadlocks in the timestamp.misc_tests.two_cmd_buffers_primary test. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20617>
This commit is contained in:
parent
261102bd9c
commit
ca8c8f2fc1
3 changed files with 6 additions and 37 deletions
|
|
@ -409,7 +409,6 @@ dzn_cmd_buffer_destroy(struct vk_command_buffer *cbuf)
|
|||
util_dynarray_fini(&cmdbuf->events.wait);
|
||||
util_dynarray_fini(&cmdbuf->events.signal);
|
||||
util_dynarray_fini(&cmdbuf->queries.reset);
|
||||
util_dynarray_fini(&cmdbuf->queries.wait);
|
||||
util_dynarray_fini(&cmdbuf->queries.signal);
|
||||
|
||||
if (cmdbuf->rtvs.ht) {
|
||||
|
|
@ -432,7 +431,6 @@ dzn_cmd_buffer_destroy(struct vk_command_buffer *cbuf)
|
|||
struct dzn_cmd_buffer_query_pool_state *qpstate = he->data;
|
||||
util_dynarray_fini(&qpstate->reset);
|
||||
util_dynarray_fini(&qpstate->collect);
|
||||
util_dynarray_fini(&qpstate->wait);
|
||||
util_dynarray_fini(&qpstate->signal);
|
||||
vk_free(&cbuf->pool->alloc, he->data);
|
||||
}
|
||||
|
|
@ -467,7 +465,6 @@ dzn_cmd_buffer_reset(struct vk_command_buffer *cbuf, VkCommandBufferResetFlags f
|
|||
util_dynarray_clear(&cmdbuf->events.wait);
|
||||
util_dynarray_clear(&cmdbuf->events.signal);
|
||||
util_dynarray_clear(&cmdbuf->queries.reset);
|
||||
util_dynarray_clear(&cmdbuf->queries.wait);
|
||||
util_dynarray_clear(&cmdbuf->queries.signal);
|
||||
hash_table_foreach(cmdbuf->rtvs.ht, he)
|
||||
vk_free(&cmdbuf->vk.pool->alloc, he->data);
|
||||
|
|
@ -481,7 +478,6 @@ dzn_cmd_buffer_reset(struct vk_command_buffer *cbuf, VkCommandBufferResetFlags f
|
|||
struct dzn_cmd_buffer_query_pool_state *qpstate = he->data;
|
||||
util_dynarray_fini(&qpstate->reset);
|
||||
util_dynarray_fini(&qpstate->collect);
|
||||
util_dynarray_fini(&qpstate->wait);
|
||||
util_dynarray_fini(&qpstate->signal);
|
||||
vk_free(&cmdbuf->vk.pool->alloc, he->data);
|
||||
}
|
||||
|
|
@ -599,7 +595,6 @@ dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info,
|
|||
util_dynarray_init(&cmdbuf->events.wait, NULL);
|
||||
util_dynarray_init(&cmdbuf->events.signal, NULL);
|
||||
util_dynarray_init(&cmdbuf->queries.reset, NULL);
|
||||
util_dynarray_init(&cmdbuf->queries.wait, NULL);
|
||||
util_dynarray_init(&cmdbuf->queries.signal, NULL);
|
||||
dzn_descriptor_heap_pool_init(&cmdbuf->rtvs.pool, device,
|
||||
D3D12_DESCRIPTOR_HEAP_TYPE_RTV,
|
||||
|
|
@ -821,7 +816,6 @@ dzn_cmd_buffer_create_query_pool_state(struct dzn_cmd_buffer *cmdbuf)
|
|||
|
||||
util_dynarray_init(&state->reset, NULL);
|
||||
util_dynarray_init(&state->collect, NULL);
|
||||
util_dynarray_init(&state->wait, NULL);
|
||||
util_dynarray_init(&state->signal, NULL);
|
||||
return state;
|
||||
}
|
||||
|
|
@ -832,7 +826,6 @@ dzn_cmd_buffer_destroy_query_pool_state(struct dzn_cmd_buffer *cmdbuf,
|
|||
{
|
||||
util_dynarray_fini(&state->reset);
|
||||
util_dynarray_fini(&state->collect);
|
||||
util_dynarray_fini(&state->wait);
|
||||
util_dynarray_fini(&state->signal);
|
||||
vk_free(&cmdbuf->vk.pool->alloc, state);
|
||||
}
|
||||
|
|
@ -1002,10 +995,6 @@ dzn_cmd_buffer_gather_queries(struct dzn_cmd_buffer *cmdbuf)
|
|||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
||||
result = dzn_cmd_buffer_collect_query_ops(cmdbuf, qpool, &state->wait, &cmdbuf->queries.wait);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
||||
result = dzn_cmd_buffer_collect_query_ops(cmdbuf, qpool, &state->signal, &cmdbuf->queries.signal);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
|
@ -5154,14 +5143,6 @@ dzn_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,
|
|||
if (!qpstate)
|
||||
return;
|
||||
|
||||
if (flags & VK_QUERY_RESULT_WAIT_BIT) {
|
||||
for (uint32_t i = 0; i < queryCount; i++) {
|
||||
if (!dzn_cmd_buffer_dynbitset_test(&qpstate->collect, firstQuery + i) &&
|
||||
!dzn_cmd_buffer_dynbitset_test(&qpstate->signal, firstQuery + i))
|
||||
dzn_cmd_buffer_dynbitset_set(cmdbuf, &qpstate->wait, firstQuery + i);
|
||||
}
|
||||
}
|
||||
|
||||
VkResult result =
|
||||
dzn_cmd_buffer_collect_queries(cmdbuf, qpool, qpstate, firstQuery, queryCount);
|
||||
if (result != VK_SUCCESS)
|
||||
|
|
@ -5188,10 +5169,11 @@ dzn_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,
|
|||
#undef ALL_STATS
|
||||
|
||||
if (cmdbuf->enhanced_barriers) {
|
||||
/* TODO: Can this be skipped if WAIT isn't set? */
|
||||
dzn_cmd_buffer_buffer_barrier(cmdbuf, qpool->collect_buffer,
|
||||
D3D12_BARRIER_SYNC_COPY, D3D12_BARRIER_SYNC_COPY,
|
||||
D3D12_BARRIER_ACCESS_COPY_DEST, D3D12_BARRIER_ACCESS_COPY_SOURCE);
|
||||
if (flags & VK_QUERY_RESULT_WAIT_BIT) {
|
||||
dzn_cmd_buffer_buffer_barrier(cmdbuf, qpool->collect_buffer,
|
||||
D3D12_BARRIER_SYNC_COPY, D3D12_BARRIER_SYNC_COPY,
|
||||
D3D12_BARRIER_ACCESS_COPY_DEST, D3D12_BARRIER_ACCESS_COPY_SOURCE);
|
||||
}
|
||||
} else {
|
||||
dzn_cmd_buffer_queue_transition_barriers(cmdbuf, qpool->collect_buffer, 0, 1,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST,
|
||||
|
|
|
|||
|
|
@ -1927,18 +1927,6 @@ dzn_queue_submit(struct vk_queue *q,
|
|||
return vk_error(device, VK_ERROR_UNKNOWN);
|
||||
}
|
||||
|
||||
util_dynarray_foreach(&cmd_buffer->queries.wait, struct dzn_cmd_buffer_query_range, range) {
|
||||
mtx_lock(&range->qpool->queries_lock);
|
||||
for (uint32_t q = range->start; q < range->start + range->count; q++) {
|
||||
struct dzn_query *query = &range->qpool->queries[q];
|
||||
|
||||
if (query->fence &&
|
||||
FAILED(ID3D12CommandQueue_Wait(queue->cmdqueue, query->fence, query->fence_value)))
|
||||
return vk_error(device, VK_ERROR_UNKNOWN);
|
||||
}
|
||||
mtx_unlock(&range->qpool->queries_lock);
|
||||
}
|
||||
|
||||
util_dynarray_foreach(&cmd_buffer->queries.reset, struct dzn_cmd_buffer_query_range, range) {
|
||||
mtx_lock(&range->qpool->queries_lock);
|
||||
for (uint32_t q = range->start; q < range->start + range->count; q++) {
|
||||
|
|
|
|||
|
|
@ -451,7 +451,7 @@ struct dzn_cmd_buffer_query_range {
|
|||
};
|
||||
|
||||
struct dzn_cmd_buffer_query_pool_state {
|
||||
struct util_dynarray reset, collect, wait, signal;
|
||||
struct util_dynarray reset, collect, signal;
|
||||
};
|
||||
|
||||
struct dzn_internal_resource {
|
||||
|
|
@ -582,7 +582,6 @@ struct dzn_cmd_buffer {
|
|||
struct {
|
||||
struct hash_table *ht;
|
||||
struct util_dynarray reset;
|
||||
struct util_dynarray wait;
|
||||
struct util_dynarray signal;
|
||||
} queries;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue