From b3a96e69ace5cf0c04a2260f4ebba826f5c74946 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 8 Jul 2019 16:03:14 +0300 Subject: [PATCH] vulkan/overlay: add queue present timing measurement Signed-off-by: Lionel Landwerlin Reviewed-by: Eric Engestrom --- src/vulkan/overlay-layer/overlay.cpp | 15 ++++++++++++++- src/vulkan/overlay-layer/overlay_params.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp index a1fc30779f7..11896b739ef 100644 --- a/src/vulkan/overlay-layer/overlay.cpp +++ b/src/vulkan/overlay-layer/overlay.cpp @@ -545,6 +545,7 @@ static const char *param_unit(enum overlay_param_enabled param) switch (param) { case OVERLAY_PARAM_ENABLED_frame_timing: case OVERLAY_PARAM_ENABLED_acquire_timing: + case OVERLAY_PARAM_ENABLED_present_timing: return "(us)"; case OVERLAY_PARAM_ENABLED_gpu_timing: return "(ns)"; @@ -733,6 +734,7 @@ static void compute_swapchain_display(struct swapchain_data *data) if (s == OVERLAY_PARAM_ENABLED_frame_timing || s == OVERLAY_PARAM_ENABLED_acquire_timing || + s == OVERLAY_PARAM_ENABLED_present_timing || s == OVERLAY_PARAM_ENABLED_gpu_timing) { double min_time = data->stats_min.stats[s] / data->time_dividor; double max_time = data->stats_max.stats[s] / data->time_dividor; @@ -1633,8 +1635,16 @@ static VkResult overlay_QueuePresentKHR( pPresentInfo->pWaitSemaphores, pPresentInfo->waitSemaphoreCount, pPresentInfo->pImageIndices[i]); + + VkPresentInfoKHR present_info = *pPresentInfo; + present_info.swapchainCount = 1; + present_info.pSwapchains = &swapchain; + + uint64_t ts0 = os_time_get(); + result = queue_data->device->vtable.QueuePresentKHR(queue, &present_info); + uint64_t ts1 = os_time_get(); + swapchain_data->frame_stats.stats[OVERLAY_PARAM_ENABLED_present_timing] += ts1 - ts0; } - result = queue_data->device->vtable.QueuePresentKHR(queue, pPresentInfo); } else { for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i]; @@ -1658,7 +1668,10 @@ static VkResult overlay_QueuePresentKHR( present_info.pWaitSemaphores = &draw->semaphore; present_info.waitSemaphoreCount = 1; + uint64_t ts0 = os_time_get(); VkResult chain_result = queue_data->device->vtable.QueuePresentKHR(queue, &present_info); + uint64_t ts1 = os_time_get(); + swapchain_data->frame_stats.stats[OVERLAY_PARAM_ENABLED_present_timing] += ts1 - ts0; if (pPresentInfo->pResults) pPresentInfo->pResults[i] = chain_result; if (chain_result != VK_SUCCESS && result == VK_SUCCESS) diff --git a/src/vulkan/overlay-layer/overlay_params.h b/src/vulkan/overlay-layer/overlay_params.h index 4d3575bc2c2..a145dd42934 100644 --- a/src/vulkan/overlay-layer/overlay_params.h +++ b/src/vulkan/overlay-layer/overlay_params.h @@ -50,6 +50,7 @@ extern "C" { OVERLAY_PARAM_BOOL(pipeline_raytracing) \ OVERLAY_PARAM_BOOL(acquire) \ OVERLAY_PARAM_BOOL(acquire_timing) \ + OVERLAY_PARAM_BOOL(present_timing) \ OVERLAY_PARAM_BOOL(vertices) \ OVERLAY_PARAM_BOOL(primitives) \ OVERLAY_PARAM_BOOL(vert_invocations) \ -- 2.30.2