From 62f6dcf767f08ae2381a01c958ae100abf0bf1c3 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Mon, 1 Aug 2022 16:52:06 -0400 Subject: [PATCH] Move macOS benchmarking to NSApp rendering loop, makes example windows visible vs. headless --- base/vulkanexamplebase.cpp | 21 +++++++++++++++++++++ examples/triangle/triangle.cpp | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index d30a94d9..38d20b77 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -291,6 +291,9 @@ void VulkanExampleBase::nextFrame() void VulkanExampleBase::renderLoop() { +// SRS - for non-apple plaforms, handle benchmarking here within VulkanExampleBase::renderLoop() +// - for macOS, handle benchmarking within NSApp rendering loop via displayLinkOutputCb() +#if !(defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) if (benchmark.active) { benchmark.run([=] { render(); }, vulkanDevice->properties); vkDeviceWaitIdle(device); @@ -299,6 +302,7 @@ void VulkanExampleBase::renderLoop() } return; } +#endif destWidth = width; destHeight = height; @@ -1550,6 +1554,12 @@ dispatch_group_t concurrentGroup; vulkanExample->displayLinkOutputCb(); } }); + + // SRS - When benchmarking, set up termination notification on main thread when concurrent queue completes + if (vulkanExample->benchmark.active) { + dispatch_queue_t notifyQueue = dispatch_get_main_queue(); + dispatch_group_notify(concurrentGroup, notifyQueue, ^{ [NSApp terminate:nil]; }); + } } - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender @@ -1836,6 +1846,17 @@ void* VulkanExampleBase::setupWindow(void* view) void VulkanExampleBase::displayLinkOutputCb() { +#if defined(VK_EXAMPLE_XCODE_GENERATED) + if (benchmark.active) { + benchmark.run([=] { render(); }, vulkanDevice->properties); + if (benchmark.filename != "") { + benchmark.saveResults(); + } + quit = true; // SRS - quit NSApp rendering loop when benchmarking complete + return; + } +#endif + if (prepared) nextFrame(); } diff --git a/examples/triangle/triangle.cpp b/examples/triangle/triangle.cpp index fc775197..dd5ab472 100644 --- a/examples/triangle/triangle.cpp +++ b/examples/triangle/triangle.cpp @@ -1256,7 +1256,7 @@ int main(const int argc, const char *argv[]) vulkanExample->setupWindow(nullptr); vulkanExample->prepare(); vulkanExample->renderLoop(); - delete(vulkanExample); // SRS - handle benchmarking case, normally deleted by applicationWillTerminate() event handler + delete(vulkanExample); } return 0; }