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 <lionel.g.landwerlin@intel.com>
This commit is contained in:
Lionel Landwerlin
2019-03-02 17:25:22 +00:00
parent ea7a6fa980
commit 7ba50d8040
3 changed files with 48 additions and 23 deletions

View File

@@ -1468,9 +1468,11 @@ static void before_present(struct swapchain_data *swapchain_data,
unsigned n_wait_semaphores, unsigned n_wait_semaphores,
unsigned imageIndex) unsigned imageIndex)
{ {
struct instance_data *instance_data = swapchain_data->device->instance;
snapshot_swapchain_frame(swapchain_data); 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); compute_swapchain_display(swapchain_data);
render_swapchain_display(swapchain_data, wait_semaphores, n_wait_semaphores, imageIndex); 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 queue_data *queue_data = FIND_QUEUE_DATA(queue);
struct device_data *device_data = queue_data->device; struct device_data *device_data = queue_data->device;
struct instance_data *instance_data = device_data->instance;
uint32_t query_results[OVERLAY_QUERY_COUNT]; uint32_t query_results[OVERLAY_QUERY_COUNT];
if (list_length(&queue_data->running_command_buffer) > 0) { 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. * be have incomplete overlay drawings.
*/ */
VkResult result = VK_SUCCESS; VkResult result = VK_SUCCESS;
for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) { if (instance_data->params.no_display) {
VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i]; for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) {
struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain); VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i];
VkPresentInfoKHR present_info = *pPresentInfo; struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain);
present_info.swapchainCount = 1;
present_info.pSwapchains = &swapchain;
before_present(swapchain_data, before_present(swapchain_data,
pPresentInfo->pWaitSemaphores, pPresentInfo->pWaitSemaphores,
pPresentInfo->waitSemaphoreCount, pPresentInfo->waitSemaphoreCount,
pPresentInfo->pImageIndices[i]); 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 result = queue_data->device->vtable.QueuePresentKHR(queue, pPresentInfo);
* on them as well, we can just wait on the overlay submission } else {
* semaphore. for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) {
*/ VkSwapchainKHR swapchain = pPresentInfo->pSwapchains[i];
present_info.pWaitSemaphores = &swapchain_data->submission_semaphore; struct swapchain_data *swapchain_data = FIND_SWAPCHAIN_DATA(swapchain);
present_info.waitSemaphoreCount = 1; VkPresentInfoKHR present_info = *pPresentInfo;
present_info.swapchainCount = 1;
present_info.pSwapchains = &swapchain;
VkResult chain_result = queue_data->device->vtable.QueuePresentKHR(queue, &present_info); before_present(swapchain_data,
if (pPresentInfo->pResults) pPresentInfo->pWaitSemaphores,
pPresentInfo->pResults[i] = chain_result; pPresentInfo->waitSemaphoreCount,
if (chain_result != VK_SUCCESS && result == VK_SUCCESS) pPresentInfo->pImageIndices[i]);
result = chain_result; /* 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; return result;
} }

View File

@@ -53,6 +53,12 @@ parse_fps_sampling_period(const char *str)
return strtol(str, NULL, 0) * 1000; return strtol(str, NULL, 0) * 1000;
} }
static bool
parse_no_display(const char *str)
{
return strtol(str, NULL, 0) != 0;
}
static bool static bool
parse_help(const char *str) parse_help(const char *str)
{ {
@@ -65,6 +71,7 @@ parse_help(const char *str)
#undef OVERLAY_PARAM_CUSTOM #undef OVERLAY_PARAM_CUSTOM
fprintf(stderr, "\tposition=top-left|top-right|bottom-left|bottom-right\n"); fprintf(stderr, "\tposition=top-left|top-right|bottom-left|bottom-right\n");
fprintf(stderr, "\tfps_sampling_period=number-of-milliseconds\n"); fprintf(stderr, "\tfps_sampling_period=number-of-milliseconds\n");
fprintf(stderr, "\tno_display=0|1\n");
return true; return true;
} }

View File

@@ -64,6 +64,7 @@ extern "C" {
OVERLAY_PARAM_CUSTOM(fps_sampling_period) \ OVERLAY_PARAM_CUSTOM(fps_sampling_period) \
OVERLAY_PARAM_CUSTOM(output_file) \ OVERLAY_PARAM_CUSTOM(output_file) \
OVERLAY_PARAM_CUSTOM(position) \ OVERLAY_PARAM_CUSTOM(position) \
OVERLAY_PARAM_CUSTOM(no_display) \
OVERLAY_PARAM_CUSTOM(help) OVERLAY_PARAM_CUSTOM(help)
enum overlay_param_position { enum overlay_param_position {
@@ -88,6 +89,7 @@ struct overlay_params {
FILE *output_file; FILE *output_file;
uint32_t fps_sampling_period; /* us */ uint32_t fps_sampling_period; /* us */
bool help; bool help;
bool no_display;
}; };
const extern char *overlay_param_names[]; const extern char *overlay_param_names[];