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; }