diff --git a/CMakeLists.txt b/CMakeLists.txt index b71d1aed..90a05c8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,11 +130,11 @@ endif() IF(MSVC) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") ELSEIF(APPLE) - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc -ObjC++") - ELSE() + #if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc -ObjC++") + #ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc -xobjective-c++") - ENDIF() + #ENDIF() ENDIF(MSVC) IF(WIN32) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 00ef0112..b6b3e738 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -243,7 +243,7 @@ void VulkanExampleBase::nextFrame() auto tEnd = std::chrono::high_resolution_clock::now(); auto tDiff = std::chrono::duration(tEnd - tStart).count(); #if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) - frameTimer = (float)tDiff * refreshPeriod; // SRS - Multiply by the display refresh period due to fixed vsync rendering on iOS and macOS + frameTimer = (float)tDiff * refreshPeriod; // SRS - Multiply by refresh period due to displayLink callback rendering on iOS and macOS #else frameTimer = (float)tDiff / 1000.0f; #endif @@ -1515,6 +1515,10 @@ void VulkanExampleBase::handleAppCommand(android_app * app, int32_t cmd) @end +const std::string getAssetPath() { + return [NSBundle.mainBundle.resourcePath stringByAppendingString: @"/../../data/"].UTF8String; +} + static CVReturn displayLinkOutputCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) @@ -1556,6 +1560,9 @@ static CVReturn displayLinkOutputCallback(CVDisplayLinkRef displayLink, const CV CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); CVDisplayLinkSetOutputCallback(displayLink, &displayLinkOutputCallback, vulkanExample); CVDisplayLinkStart(displayLink); + // SRS - Pause 1 ms for displayLink startup then get the actual refresh period of the display + usleep(1000); + vulkanExample->refreshPeriod = CVDisplayLinkGetActualOutputVideoRefreshPeriod(displayLink); } - (BOOL)acceptsFirstResponder @@ -1633,22 +1640,44 @@ static CVReturn displayLinkOutputCallback(CVDisplayLinkRef displayLink, const CV vulkanExample->mouseButtons.left = false; } -- (void)otherMouseDown:(NSEvent *)event +- (void)rightMouseDown:(NSEvent *)event { vulkanExample->mouseButtons.right = true; } -- (void)otherMouseUp:(NSEvent *)event +- (void)rightMouseUp:(NSEvent *)event { vulkanExample->mouseButtons.right = false; } +- (void)otherMouseDown:(NSEvent *)event +{ + vulkanExample->mouseButtons.middle = true; +} + +- (void)otherMouseUp:(NSEvent *)event +{ + vulkanExample->mouseButtons.middle = false; +} + - (void)mouseDragged:(NSEvent *)event { auto point = [self getMouseLocalPoint:event]; vulkanExample->mouseDragged(point.x, point.y); } +- (void)rightMouseDragged:(NSEvent *)event +{ + auto point = [self getMouseLocalPoint:event]; + vulkanExample->mouseDragged(point.x, point.y); +} + +- (void)otherMouseDragged:(NSEvent *)event +{ + auto point = [self getMouseLocalPoint:event]; + vulkanExample->mouseDragged(point.x, point.y); +} + - (void)mouseMoved:(NSEvent *)event { auto point = [self getMouseLocalPoint:event]; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 45a0b43f..a40dccfb 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -11,6 +11,18 @@ function(buildExample EXAMPLE_NAME) if(EXISTS ${EXAMPLE_FOLDER}/${EXAMPLE_NAME}.h) SET(MAIN_HEADER ${EXAMPLE_FOLDER}/${EXAMPLE_NAME}.h) ENDIF() + if(APPLE) + if(CMAKE_C_COMPILER_ID MATCHES "Clang\$") + set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp") + set(OpenMP_C_LIB_NAMES "omp") + set(OpenMP_omp_LIBRARY /opt/local/lib/libomp/libomp.dylib) + endif() + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang\$") + set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp") + set(OpenMP_CXX_LIB_NAMES "omp") + set(OpenMP_omp_LIBRARY /opt/local/lib/libomp/libomp.dylib) + endif() + endif() find_package(OpenMP) # imgui example requires additional source files IF(${EXAMPLE_NAME} STREQUAL "imgui") diff --git a/xcode/MVKExample.cpp b/xcode/MVKExample.cpp index b1dc66dd..9ed6e36b 100644 --- a/xcode/MVKExample.cpp +++ b/xcode/MVKExample.cpp @@ -10,28 +10,14 @@ #include "MVKExample.h" #include "examples.h" -/* -void MVKExample::renderFrame() { // SRS - don't need to expose VulkanExampleBase::renderFrame() to DemoViewController - _vulkanExample->renderFrame(); -} -*/ - void MVKExample::displayLinkOutputCb() { // SRS - expose VulkanExampleBase::displayLinkOutputCb() to DemoViewController _vulkanExample->displayLinkOutputCb(); } -void MVKExample::getRefreshPeriod(double refreshPeriod) { // SRS - get the actual refresh period of the display +void MVKExample::setRefreshPeriod(double refreshPeriod) { // SRS - set VulkanExampleBase::refreshPeriod from DemoViewController displayLink _vulkanExample->refreshPeriod = refreshPeriod; } -void MVKExample::windowWillResize(float x, float y) { - _vulkanExample->windowWillResize(x, y); -} - -void MVKExample::windowDidResize() { - _vulkanExample->windowDidResize(); -} - void MVKExample::keyPressed(uint32_t keyCode) { _vulkanExample->keyPressed(keyCode); } @@ -119,10 +105,12 @@ void MVKExample::scrollWheel(short wheelDelta) { MVKExample::MVKExample(void* view) { _vulkanExample = new VulkanExample(); + width = _vulkanExample->width; // SRS - Get desired window size from VulkanExampleBase instance + height = _vulkanExample->height; _vulkanExample->initVulkan(); _vulkanExample->setupWindow(view); - //_vulkanExample->initSwapchain(); // SRS - initSwapchain() is now part of VulkanExampleBase::prepare() _vulkanExample->prepare(); + _vulkanExample->renderLoop(); // SRS - Init destWidth & destHeight, then fall through and return } MVKExample::~MVKExample() { diff --git a/xcode/MVKExample.h b/xcode/MVKExample.h index 254f3485..8e5acf47 100644 --- a/xcode/MVKExample.h +++ b/xcode/MVKExample.h @@ -13,12 +13,11 @@ class MVKExample { public: - //void renderFrame(); // SRS - don't need to expose VulkanExampleBase::renderFrame() to DemoViewController + uint32_t width; // SRS - expose VulkanExampleBase initial window size to DemoViewController + uint32_t height; + void displayLinkOutputCb(); // SRS - expose VulkanExampleBase::displayLinkOutputCb() to DemoViewController - void getRefreshPeriod(double refreshPeriod); // SRS - get the actual refresh period of the display - - void windowWillResize(float x, float y); // SRS - expose window resize events to DemoViewController - void windowDidResize(); + void setRefreshPeriod(double refreshPeriod); // SRS - set VulkanExampleBase::refreshPeriod from DemoViewController displayLink void keyPressed(uint32_t keyCode); // SRS - expose keyboard events to DemoViewController void keyDown(uint32_t keyCode); diff --git a/xcode/macos/DemoViewController.mm b/xcode/macos/DemoViewController.mm index d135854b..c1e3cf1d 100644 --- a/xcode/macos/DemoViewController.mm +++ b/xcode/macos/DemoViewController.mm @@ -22,7 +22,7 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, CVOptionFlags* flagsOut, void* target) { //((MVKExample*)target)->renderFrame(); - ((MVKExample*)target)->displayLinkOutputCb(); // SRS - Call MVKExample::displayLinkOutputCb() to animate frames vs. MVKExample::renderFrame() for static image + ((MVKExample*)target)->displayLinkOutputCb(); // SRS - Call displayLinkOutputCb() to animate frames vs. renderFrame() for static image return kCVReturnSuccess; } @@ -48,23 +48,18 @@ MVKExample* _mvkExample; CVDisplayLinkStart(_displayLink); } -// SRS - get the actual refresh period of the display +// SRS - Set window's initial content size and set VulkanExampleBase::refreshPeriod from the displayLink -(void) viewWillAppear { [super viewWillAppear]; - - _mvkExample->getRefreshPeriod(CVDisplayLinkGetActualOutputVideoRefreshPeriod(_displayLink)); -} -// SRS - Handle window resize events (FIXME: resizeable window not yet supported at init) --(NSSize) windowWillResize:(NSWindow*) sender toSize:(NSSize)frameSize { - CVDisplayLinkStop(_displayLink); - _mvkExample->windowWillResize(frameSize.width, frameSize.height); - return frameSize; -} + NSWindow* window = self.view.window; + NSSize viewSize; + viewSize.width = _mvkExample->width; + viewSize.height = _mvkExample->height; + [window setContentSize:viewSize]; + [window center]; --(void) windowDidResize:(NSNotification*) notification { - _mvkExample->windowDidResize(); - CVDisplayLinkStart(_displayLink); + _mvkExample->setRefreshPeriod(CVDisplayLinkGetActualOutputVideoRefreshPeriod(_displayLink)); } -(void) dealloc { diff --git a/xcode/macos/Resources/Main.storyboard b/xcode/macos/Resources/Main.storyboard index 52913366..e682969c 100644 --- a/xcode/macos/Resources/Main.storyboard +++ b/xcode/macos/Resources/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -101,12 +101,13 @@ - + - - + + +