diff --git a/CMakeLists.txt b/CMakeLists.txt index f5e538bf..79737bf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,8 @@ cmake_dependent_option(GLFW_USE_HYBRID_HPG "Force use of high-performance GPU on cmake_dependent_option(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC runtime library DLL" ON "MSVC" OFF) +cmake_dependent_option(GLFW_USE_METALKIT "Allow GLFW to include MetalKit.h for metal support" OFF GLFW_BUILD_COCOA ON) + set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING "Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)") diff --git a/include/GLFW/glfw3native.h b/include/GLFW/glfw3native.h index 2669603e..99b4894d 100644 --- a/include/GLFW/glfw3native.h +++ b/include/GLFW/glfw3native.h @@ -289,6 +289,20 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); */ GLFWAPI void glfwAddCocoaMTKSubview(GLFWwindow* window, void* view); + +/*! @brief Resizes an 'MTKView' to the window's framebuffer size -helpful because the Apple metal-cpp API lacks the ability to do this + * + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety Call this function from the main thread. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwResetCocoaMTKFramesize(GLFWwindow* window, void* view); + #endif #if defined(GLFW_EXPOSE_NATIVE_NSGL) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01f191c9..030f4e1c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,6 +31,9 @@ set_target_properties(update_mappings PROPERTIES FOLDER "GLFW3") if (GLFW_BUILD_COCOA) target_compile_definitions(glfw PRIVATE _GLFW_COCOA) + if(GLFW_USE_METALKIT) + target_compile_definitions(glfw PRIVATE _GLFW_BUILD_METAL_DEPENDENCIES) + endif() target_sources(glfw PRIVATE cocoa_platform.h cocoa_joystick.h cocoa_init.m cocoa_joystick.m cocoa_monitor.m cocoa_window.m nsgl_context.m) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 81bd9aec..bca520b9 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -30,7 +30,6 @@ #include #include -#import // Returns the style mask corresponding to the window settings // @@ -276,6 +275,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; window->ns.height = contentRect.size.height; _glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height); } + } - (void)windowDidMove:(NSNotification *)notification @@ -363,6 +363,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; [self updateTrackingAreas]; [self registerForDraggedTypes:@[NSPasteboardTypeURL]]; + } return self; @@ -1951,6 +1952,9 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle) return window->ns.object; } + +#ifdef _GLFW_BUILD_METAL_DEPENDENCIES +#import GLFWAPI void glfwAddCocoaMTKSubview(GLFWwindow* handle, void* view) { _GLFWwindow* window = (_GLFWwindow*) handle; @@ -1968,3 +1972,44 @@ GLFWAPI void glfwAddCocoaMTKSubview(GLFWwindow* handle, void* view) { } +GLFWAPI void glfwResetCocoaMTKFramesize(GLFWwindow* handle, void* view) { + + _GLFWwindow* window = (_GLFWwindow*) handle; + _GLFW_REQUIRE_INIT_OR_RETURN(); + + if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA) + { + _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, + "Cocoa: Platform not initialized"); + return; + } + + MTKView* mtkView = (MTKView*) view; + int width, height; + _glfwGetFramebufferSizeCocoa(window, &width, &height); + NSSize size = NSMakeSize(width, height); + [mtkView setFrameSize: size]; + + +} + +#else +GLFWAPI void glfwAddCocoaMTKSubview(GLFWwindow* handle, void* view) { + + _GLFW_REQUIRE_INIT_OR_RETURN(); + _glfwInputError(GLFW_PLATFORM_ERROR, + "GLFW was compiled without \"GLFW_USE_METALKIT\" enabled"); + + +} + +GLFWAPI void glfwResetCocoaMTKFramesize(GLFWwindow* handle, void* view) { + + _GLFW_REQUIRE_INIT_OR_RETURN(); + _glfwInputError(GLFW_PLATFORM_ERROR, + "GLFW was compiled without \"GLFW_USE_METALKIT\" enabled"); + +} + + +#endif