vkd3d: Batch query pool reset commands if possible.
By resetting query pools in advance, we can reduce the number of stalls between draw calls in passes with occlusion queries, which is currently causing serious performance issues in some games. Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
648e41716b
commit
e13d69ad27
|
@ -2964,11 +2964,56 @@ static D3D12_COMMAND_LIST_TYPE STDMETHODCALLTYPE d3d12_command_list_GetType(d3d1
|
|||
return list->type;
|
||||
}
|
||||
|
||||
static HRESULT d3d12_command_list_batch_reset_query_pools(struct d3d12_command_list *list)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
HRESULT hr;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < list->query_ranges_count; i++)
|
||||
{
|
||||
const struct vkd3d_query_range *range = &list->query_ranges[i];
|
||||
|
||||
if (!(range->flags & VKD3D_QUERY_RANGE_RESET))
|
||||
continue;
|
||||
|
||||
if (FAILED(hr = d3d12_command_allocator_allocate_init_command_buffer(list->allocator, list)))
|
||||
return hr;
|
||||
|
||||
VK_CALL(vkCmdResetQueryPool(list->vk_init_commands,
|
||||
range->vk_pool, range->index, range->count));
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT d3d12_command_list_build_init_commands(struct d3d12_command_list *list)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
VkResult vr;
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = d3d12_command_list_batch_reset_query_pools(list)))
|
||||
return hr;
|
||||
|
||||
if (!list->vk_init_commands)
|
||||
return S_OK;
|
||||
|
||||
if ((vr = VK_CALL(vkEndCommandBuffer(list->vk_init_commands))) < 0)
|
||||
{
|
||||
WARN("Failed to end command buffer, vr %d.\n", vr);
|
||||
return hresult_from_vk_result(vr);
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d3d12_command_list_Close(d3d12_command_list_iface *iface)
|
||||
{
|
||||
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
|
||||
const struct vkd3d_vk_device_procs *vk_procs;
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
VkResult vr;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p.\n", iface);
|
||||
|
||||
|
@ -2978,8 +3023,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_Close(d3d12_command_list_ifa
|
|||
return E_FAIL;
|
||||
}
|
||||
|
||||
vk_procs = &list->device->vk_procs;
|
||||
|
||||
d3d12_command_list_end_current_render_pass(list, false);
|
||||
|
||||
if (list->predicate_enabled)
|
||||
|
@ -2987,6 +3030,9 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_Close(d3d12_command_list_ifa
|
|||
|
||||
vkd3d_shader_debug_ring_end_command_buffer(list);
|
||||
|
||||
if (FAILED(hr = d3d12_command_list_build_init_commands(list)))
|
||||
return hr;
|
||||
|
||||
if ((vr = VK_CALL(vkEndCommandBuffer(list->vk_command_buffer))) < 0)
|
||||
{
|
||||
WARN("Failed to end command buffer, vr %d.\n", vr);
|
||||
|
@ -6711,7 +6757,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_BeginQuery(d3d12_command_list_i
|
|||
d3d12_command_list_track_query_heap(list, query_heap);
|
||||
d3d12_command_list_end_current_render_pass(list, true);
|
||||
|
||||
VK_CALL(vkCmdResetQueryPool(list->vk_command_buffer, query_heap->vk_query_pool, index, 1));
|
||||
if (!d3d12_command_list_reset_query(list, query_heap->vk_query_pool, index))
|
||||
VK_CALL(vkCmdResetQueryPool(list->vk_command_buffer, query_heap->vk_query_pool, index, 1));
|
||||
|
||||
if (type == D3D12_QUERY_TYPE_OCCLUSION)
|
||||
flags = VK_QUERY_CONTROL_PRECISE_BIT;
|
||||
|
@ -6741,7 +6788,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_EndQuery(d3d12_command_list_ifa
|
|||
|
||||
if (type == D3D12_QUERY_TYPE_TIMESTAMP)
|
||||
{
|
||||
VK_CALL(vkCmdResetQueryPool(list->vk_command_buffer, query_heap->vk_query_pool, index, 1));
|
||||
if (!d3d12_command_list_reset_query(list, query_heap->vk_query_pool, index))
|
||||
VK_CALL(vkCmdResetQueryPool(list->vk_command_buffer, query_heap->vk_query_pool, index, 1));
|
||||
VK_CALL(vkCmdWriteTimestamp(list->vk_command_buffer,
|
||||
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, query_heap->vk_query_pool, index));
|
||||
return;
|
||||
|
@ -6846,6 +6894,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_
|
|||
}
|
||||
|
||||
d3d12_command_list_track_query_heap(list, query_heap);
|
||||
d3d12_command_list_read_query_range(list, query_heap->vk_query_pool, start_index, query_count);
|
||||
d3d12_command_list_end_current_render_pass(list, true);
|
||||
|
||||
VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer, query_heap->vk_query_pool,
|
||||
|
|
Loading…
Reference in New Issue