vkd3d: Allocate new virtual query for active queries as necessary.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-01-15 16:00:30 +01:00 committed by Philip Rebohle
parent b995780de1
commit c9525cf5ca
1 changed files with 17 additions and 4 deletions

View File

@ -2621,6 +2621,22 @@ static void d3d12_command_list_end_active_query(struct d3d12_command_list *list,
query->state = VKD3D_ACTIVE_QUERY_ENDED;
}
static void d3d12_command_list_reset_active_query(struct d3d12_command_list *list,
struct vkd3d_active_query *query)
{
if (!d3d12_command_list_add_pending_query(list, query))
return;
if (!d3d12_command_allocator_allocate_query(list->allocator,
query->heap->desc.Type, &query->vk_pool, &query->vk_index))
return;
if (!d3d12_command_list_reset_query(list, query->vk_pool, query->vk_index))
return;
query->state = VKD3D_ACTIVE_QUERY_RESET;
}
static bool d3d12_command_list_enable_query(struct d3d12_command_list *list,
struct d3d12_query_heap *heap, uint32_t index, D3D12_QUERY_TYPE type)
{
@ -2683,11 +2699,8 @@ static void d3d12_command_list_handle_active_queries(struct d3d12_command_list *
{
struct vkd3d_active_query *query = &list->active_queries[i];
/* It is possible (although unexpected) that an app uses an occlusion
* query for multiple draw calls, which may require multiple render
* pass instances. In that case, we can only handle the first instance. */
if (query->state == VKD3D_ACTIVE_QUERY_ENDED && !end)
FIXME("Query (%#"PRIx64",%u) already ended.\n", (uint64_t)query->vk_pool, query->vk_index);
d3d12_command_list_reset_active_query(list, query);
if (query->state == VKD3D_ACTIVE_QUERY_RESET)
d3d12_command_list_begin_active_query(list, query);