aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Schultz <karl@lunarg.com>2018-04-13 18:02:07 -0600
committerKarl Schultz <karl@lunarg.com>2018-04-16 14:28:31 -0600
commit206b1c54f7ff7ec339854c8ec7b0dfd87c2bbea0 (patch)
tree2ff953ac55679e0eca8ea3f81c4a9314a1eed7d5
parent9a162f5e65e6d34cec22d2e0d4796bcdc68d3cf0 (diff)
downloadusermoji-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.c12
-rw-r--r--demos/cube.cpp14
-rw-r--r--demos/macOS/cube/DemoViewController.m37
-rw-r--r--demos/macOS/cubepp/DemoViewController.mm36
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;
}