vulkan/overlay: add no display option
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Sat, 2 Mar 2019 17:25:22 +0000 (17:25 +0000)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 2 May 2019 16:02:07 +0000 (17:02 +0100)
In case you're just interested in data being record to the output
file.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/vulkan/overlay-layer/overlay.cpp
src/vulkan/overlay-layer/overlay_params.c
src/vulkan/overlay-layer/overlay_params.h

index 266da9ebb8e3057b760c4f1ee08d7e70f5a6b24f..2aa0bf93e6bd25082303e1f3271ca2cc734f87f8 100644 (file)
@@ -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;
 }
index 51f853095741d2af26cda8dab326b697460f76a5..16cf5b8dee097695ac4d222fd1eb738ded589522 100644 (file)
@@ -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;
 }
index 37dfb26dcb6a10424823fbc0a86b4de135977a59..9a3d5be1b9bd053eb49f8f39d964c8dd5c4ed6bf 100644 (file)
@@ -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[];