diff options
| author | Karl Schultz <karl@lunarg.com> | 2018-04-13 18:02:07 -0600 |
|---|---|---|
| committer | Karl Schultz <karl@lunarg.com> | 2018-04-16 14:28:31 -0600 |
| commit | 206b1c54f7ff7ec339854c8ec7b0dfd87c2bbea0 (patch) | |
| tree | 2ff953ac55679e0eca8ea3f81c4a9314a1eed7d5 | |
| parent | 9a162f5e65e6d34cec22d2e0d4796bcdc68d3cf0 (diff) | |
| download | usermoji-206b1c54f7ff7ec339854c8ec7b0dfd87c2bbea0.tar.xz | |
macos: Pass argc/argv through to main cube code
This allows users to specify arguments like "--c 100"
| -rw-r--r-- | demos/cube.c | 12 | ||||
| -rw-r--r-- | demos/cube.cpp | 14 | ||||
| -rw-r--r-- | demos/macOS/cube/DemoViewController.m | 37 | ||||
| -rw-r--r-- | demos/macOS/cubepp/DemoViewController.mm | 36 |
4 files changed, 87 insertions, 12 deletions
diff --git a/demos/cube.c b/demos/cube.c index 90f54933..640be20b 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -2713,6 +2713,14 @@ static void demo_run(struct demo *demo) { demo_draw(demo); demo->curFrame++; } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) +static void demo_run(struct demo *demo) { + demo_draw(demo); + demo->curFrame++; + if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) { + demo->quit = TRUE; + } +} #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) static VkResult demo_create_display_surface(struct demo *demo) { @@ -3824,9 +3832,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, } #elif defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) -static void demo_main(struct demo *demo, void *view) { - const char *argv[] = {"CubeSample"}; - int argc = sizeof(argv) / sizeof(char *); +static void demo_main(struct demo *demo, void *view, int argc, const char *argv[]) { demo_init(demo, argc, (char **)argv); demo->window = view; diff --git a/demos/cube.cpp b/demos/cube.cpp index 68645c90..ff760893 100644 --- a/demos/cube.cpp +++ b/demos/cube.cpp @@ -261,6 +261,8 @@ struct Demo { #elif defined(VK_USE_PLATFORM_WAYLAND_KHR) void run(); void create_window(); +#elif defined(VK_USE_PLATFORM_MACOS_MVK) + void run(); #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) vk::Result create_display_surface(); @@ -2668,6 +2670,14 @@ void Demo::create_window() { wl_shell_surface_set_toplevel(shell_surface); wl_shell_surface_set_title(shell_surface, APP_SHORT_NAME); } +#elif defined(VK_USE_PLATFORM_MACOS_MVK) +void Demo::run() { + draw(); + curFrame++; + if (frameCount != UINT32_MAX && curFrame == frameCount) { + quit = true; + } +} #elif defined(VK_USE_PLATFORM_MIR_KHR) #elif defined(VK_USE_PLATFORM_DISPLAY_KHR) @@ -2973,9 +2983,7 @@ int main(int argc, char **argv) { #elif defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK) // Global function invoked from NS or UI views and controllers to create demo -static void demo_main(struct Demo &demo, void *view) { - const char *argv[] = {"CubeSample"}; - int argc = sizeof(argv) / sizeof(char *); +static void demo_main(struct Demo &demo, void *view, int argc, const char *argv[]) { demo.init(argc, (char **)argv); demo.window = view; diff --git a/demos/macOS/cube/DemoViewController.m b/demos/macOS/cube/DemoViewController.m index a5fe6905..eb28ad57 100644 --- a/demos/macOS/cube/DemoViewController.m +++ b/demos/macOS/cube/DemoViewController.m @@ -29,6 +29,7 @@ @implementation DemoViewController { CVDisplayLinkRef _displayLink; struct demo demo; + NSTimer* _timer; } - (void)dealloc { @@ -43,19 +44,49 @@ self.view.wantsLayer = YES; // Back the view with a layer created by the makeBackingLayer method. - demo_main(&demo, self.view); + // Convert incoming args to "C" argc/argv strings + NSArray *args = [[NSProcessInfo processInfo] arguments]; + const char** argv = (const char**) alloca(sizeof(char*) * args.count); + for(unsigned int i = 0; i < args.count; i++) { + NSString *s = args[i]; + argv[i] = s.UTF8String; + } + demo_main(&demo, self.view, args.count, argv); + + // Monitor the rendering loop for a quit condition + _timer = [NSTimer scheduledTimerWithTimeInterval: 0.2 + target: self + selector: @selector(onTick:) + userInfo: self + repeats: YES]; + + // Start the rendering loop CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, &demo); CVDisplayLinkStart(_displayLink); + +} + +// Close the window if the demo is in a Quit state +-(void)onTick:(NSTimer*)timer { + if (demo.quit) { + [[[self view] window] close]; + } } #pragma mark Display loop callback function /** Rendering loop callback function for use with a CVDisplayLink. */ -static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, +static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, + const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* target) { - demo_draw((struct demo*)target); + struct demo* demo = (struct demo*)target; + demo_run(demo); + if (demo->quit) { + CVDisplayLinkStop(displayLink); + CVDisplayLinkRelease(displayLink); + } return kCVReturnSuccess; } diff --git a/demos/macOS/cubepp/DemoViewController.mm b/demos/macOS/cubepp/DemoViewController.mm index a0933592..049ec6b6 100644 --- a/demos/macOS/cubepp/DemoViewController.mm +++ b/demos/macOS/cubepp/DemoViewController.mm @@ -29,6 +29,7 @@ @implementation DemoViewController { CVDisplayLinkRef _displayLink; struct Demo demo; + NSTimer* _timer; } - (void)dealloc { @@ -43,19 +44,48 @@ self.view.wantsLayer = YES; // Back the view with a layer created by the makeBackingLayer method. - demo_main(demo, self.view); + // Convert incoming args to "C" argc/argv strings + NSArray *args = [[NSProcessInfo processInfo] arguments]; + const char** argv = (const char**) alloca(sizeof(char*) * args.count); + for(unsigned int i = 0; i < args.count; i++) { + NSString *s = args[i]; + argv[i] = s.UTF8String; + } + demo_main(demo, self.view, args.count, argv); + + // Monitor the rendering loop for a quit condition + _timer = [NSTimer scheduledTimerWithTimeInterval: 0.2 + target: self + selector: @selector(onTick:) + userInfo: self + repeats: YES]; + + // Start the rendering loop CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink); CVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, &demo); CVDisplayLinkStart(_displayLink); } +// Close the window if the demo is in a Quit state +-(void)onTick:(NSTimer*)timer { + if (demo.quit) { + [[[self view] window] close]; + } +} + #pragma mark Display loop callback function /** Rendering loop callback function for use with a CVDisplayLink. */ -static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, +static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, + const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* target) { - ((struct Demo*)target)->draw(); + struct Demo* demo = (struct Demo*)target; + demo->run(); + if (demo->quit) { + CVDisplayLinkStop(displayLink); + CVDisplayLinkRelease(displayLink); + } return kCVReturnSuccess; } |
