From 7ba50d80408080a94d605673efb5b870520dea87 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sat, 2 Mar 2019 17:25:22 +0000 Subject: [PATCH] vulkan/overlay: add no display option In case you're just interested in data being record to the output file. Signed-off-by: Lionel Landwerlin --- src/vulkan/overlay-layer/overlay.cpp | 66 ++++++++++++++--------- src/vulkan/overlay-layer/overlay_params.c | 7 +++ src/vulkan/overlay-layer/overlay_params.h | 2 + 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp index 266da9ebb8e..2aa0bf93e6b 100644 --- a/src/vulkan/overlay-layer/overlay.cpp +++ b/src/vulkan/overlay-layer/overlay.cpp @@ -1468,9 +1468,11 @@ static void before_present(struct swapchain_data *swapchain_data, unsigned n_wait_semaphores, unsigned imageIndex) { + struct instance_data *instance_data = swapchain_data->device->instance; + snapshot_swapchain_frame(swapchain_data); - if (swapchain_data->n_frames > 0) { + if (!instance_data->params.no_display && swapchain_data->n_frames > 0) { compute_swapchain_display(swapchain_data); render_swapchain_display(swapchain_data, wait_semaphores, n_wait_semaphores, imageIndex); } @@ -1509,6 +1511,7 @@ VKAPI_ATTR VkResult VKAPI_CALL overlay_QueuePresentKHR( { struct queue_data *queue_data = FIND_QUEUE_DATA(queue); struct device_data *device_data = queue_data->device; + struct instance_data *instance_data = device_data->instance; uint32_t query_results[OVERLAY_QUERY_COUNT]; if (list_length(&queue_data->running_command_buffer) > 0) { @@ -1569,30 +1572,43 @@ VKAPI_ATTR VkResult VKAPI_CALL overlay_QueuePresentKHR( * be have incomplete overlay drawings. */ VkResult result = VK_SUCCESS; - for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { - VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i]; - struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain); - VkPresentInfoKHR present_info = *pPresentInfo; - present_info.swapchainCount = 1; - present_info.pSwapchains = &swapchain; - - before_present(swapchain_data, - pPresentInfo->pWaitSemaphores, - pPresentInfo->waitSemaphoreCount, - pPresentInfo->pImageIndices[i]); - /* Because the submission of the overlay draw waits on the semaphores - * handed for present, we don't need to have this present operation wait - * on them as well, we can just wait on the overlay submission - * semaphore. - */ - present_info.pWaitSemaphores = &swapchain_data->submission_semaphore; - present_info.waitSemaphoreCount = 1; - - VkResult chain_result = queue_data->device->vtable.QueuePresentKHR(queue, &present_info); - if (pPresentInfo->pResults) - pPresentInfo->pResults[i] = chain_result; - if (chain_result != VK_SUCCESS && result == VK_SUCCESS) - result = chain_result; + if (instance_data->params.no_display) { + for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { + VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i]; + struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain); + + before_present(swapchain_data, + pPresentInfo->pWaitSemaphores, + pPresentInfo->waitSemaphoreCount, + pPresentInfo->pImageIndices[i]); + } + result = queue_data->device->vtable.QueuePresentKHR(queue, pPresentInfo); + } else { + for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { + VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i]; + struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain); + VkPresentInfoKHR present_info = *pPresentInfo; + present_info.swapchainCount = 1; + present_info.pSwapchains = &swapchain; + + before_present(swapchain_data, + pPresentInfo->pWaitSemaphores, + pPresentInfo->waitSemaphoreCount, + pPresentInfo->pImageIndices[i]); + /* Because the submission of the overlay draw waits on the semaphores + * handed for present, we don't need to have this present operation + * wait on them as well, we can just wait on the overlay submission + * semaphore. + */ + present_info.pWaitSemaphores = &swapchain_data->submission_semaphore; + present_info.waitSemaphoreCount = 1; + + VkResult chain_result = queue_data->device->vtable.QueuePresentKHR(queue, &present_info); + if (pPresentInfo->pResults) + pPresentInfo->pResults[i] = chain_result; + if (chain_result != VK_SUCCESS && result == VK_SUCCESS) + result = chain_result; + } } return result; } diff --git a/src/vulkan/overlay-layer/overlay_params.c b/src/vulkan/overlay-layer/overlay_params.c index 51f85309574..16cf5b8dee0 100644 --- a/src/vulkan/overlay-layer/overlay_params.c +++ b/src/vulkan/overlay-layer/overlay_params.c @@ -53,6 +53,12 @@ parse_fps_sampling_period(const char *str) return strtol(str, NULL, 0) * 1000; } +static bool +parse_no_display(const char *str) +{ + return strtol(str, NULL, 0) != 0; +} + static bool parse_help(const char *str) { @@ -65,6 +71,7 @@ parse_help(const char *str) #undef OVERLAY_PARAM_CUSTOM fprintf(stderr, "\tposition=top-left|top-right|bottom-left|bottom-right\n"); fprintf(stderr, "\tfps_sampling_period=number-of-milliseconds\n"); + fprintf(stderr, "\tno_display=0|1\n"); return true; } diff --git a/src/vulkan/overlay-layer/overlay_params.h b/src/vulkan/overlay-layer/overlay_params.h index 37dfb26dcb6..9a3d5be1b9b 100644 --- a/src/vulkan/overlay-layer/overlay_params.h +++ b/src/vulkan/overlay-layer/overlay_params.h @@ -64,6 +64,7 @@ extern "C" { OVERLAY_PARAM_CUSTOM(fps_sampling_period) \ OVERLAY_PARAM_CUSTOM(output_file) \ OVERLAY_PARAM_CUSTOM(position) \ + OVERLAY_PARAM_CUSTOM(no_display) \ OVERLAY_PARAM_CUSTOM(help) enum overlay_param_position { @@ -88,6 +89,7 @@ struct overlay_params { FILE *output_file; uint32_t fps_sampling_period; /* us */ bool help; + bool no_display; }; const extern char *overlay_param_names[]; -- 2.30.2