From f8a4ba22dd22c66fd1deb4b3b63d9767903b5a63 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Tue, 13 May 2025 17:35:17 -0400 Subject: [PATCH] Remove gnCreateWindowSurface, add platform specific window creation functions --- CMakeLists.txt | 3 +- rendering_api/metal/CMakeLists.txt | 6 +- .../metal/src/bridge/metal_bridege.mm | 26 +++---- rendering_api/metal/src/bridge/metal_bridge.h | 4 +- .../src/core/devices/metal_output_device.cpp | 2 - .../metal/src/core/metal_instance.cpp | 27 ++++--- rendering_api/metal/src/core/metal_instance.h | 3 - .../metal_presentation_queue.cpp | 6 +- rendering_api/vulkan/CMakeLists.txt | 40 +++++++--- .../vulkan/src/instance/vulkan_instance.cpp | 73 +++++++++++-------- .../vulkan/src/instance/vulkan_instance.h | 6 +- .../vulkan/src/instance/vulkan_macos_bridge.h | 2 + .../src/instance/vulkan_macos_bridge.mm | 18 +++++ .../vulkan/src/instance/vulkan_surfance.cpp | 70 ++++++++++++++++++ .../vulkan_presentation_queue.cpp | 8 +- .../src/presentation_queue/vulkan_swapchain.h | 12 +-- .../vulkan_swapchain_support.h | 4 +- src/core/init/gryphn_init.cpp | 22 +++++- src/core/instance/gryphn_instance.h | 24 +++++- src/platform/gryphn_platform_include.h | 9 ++- .../platform_linux/gryphn_platform_linux.h | 7 ++ .../platform_macos/gryphn_platform_macos.h | 6 ++ 22 files changed, 272 insertions(+), 106 deletions(-) create mode 100644 rendering_api/vulkan/src/instance/vulkan_macos_bridge.h create mode 100644 rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm create mode 100644 rendering_api/vulkan/src/instance/vulkan_surfance.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e34d81..8c2ddf3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ add_compile_definitions(GN_REVEAL_IMPL) if(WIN32) add_compile_definitions(GN_PLATFORM_WIN32) - add_subdirectory(rendering_api/dirctx/) + # add_subdirectory(rendering_api/dirctx/) add_subdirectory(rendering_api/vulkan/) endif() if(APPLE) @@ -23,6 +23,7 @@ endif() if(UNIX AND NOT APPLE) add_compile_definitions(GN_PLATFORM_LINUX) add_subdirectory(rendering_api/vulkan/) + target_include_directories(Gryphn PUBLIC ${CMAKE_SOURCE_DIR/Gryphn/rendering_api/metal/depends/metal-cpp/) endif() target_link_libraries(Gryphn) diff --git a/rendering_api/metal/CMakeLists.txt b/rendering_api/metal/CMakeLists.txt index 543215c..c556b7e 100644 --- a/rendering_api/metal/CMakeLists.txt +++ b/rendering_api/metal/CMakeLists.txt @@ -11,7 +11,6 @@ target_include_directories(GryphnMetalImpl PUBLIC ${CMAKE_SOURCE_DIR}/gryphn/include/ ${CMAKE_SOURCE_DIR}/gryphn/src/ ${CMAKE_SOURCE_DIR}/gryphn/src/ - ${CMAKE_SOURCE_DIR}/depends/glfw/glfw-3.4/include/ depends/metal-cpp/ src/ depends/SPIRV-Cross/ @@ -21,10 +20,7 @@ add_compile_definitions(GN_REVEAL_IMPL) add_subdirectory(depends/metal-cpp) add_subdirectory(depends/SPIRV-Cross) -add_library(glfw SHARED IMPORTED) -set_target_properties(glfw PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/build/depends/glfw/glfw-3.4/src/libglfw.3.4.dylib) - -target_link_libraries(GryphnMetalImpl METAL_CPP glfw spirv-cross-core spirv-cross-msl spirv-cross-cpp) +target_link_libraries(GryphnMetalImpl METAL_CPP spirv-cross-core spirv-cross-msl spirv-cross-cpp) target_link_libraries(GryphnMetalImpl "-framework IOKit" diff --git a/rendering_api/metal/src/bridge/metal_bridege.mm b/rendering_api/metal/src/bridge/metal_bridege.mm index c92dc4e..70c71f8 100644 --- a/rendering_api/metal/src/bridge/metal_bridege.mm +++ b/rendering_api/metal/src/bridge/metal_bridege.mm @@ -3,16 +3,12 @@ #import #import #import -#define GLFW_EXPOSE_NATIVE_COCOA -#include -#include -void mtlObjectCSetContentViewsLayer(void* window, void* layer) { +void mtlObjectCSetContentViewsLayer(void* view, void* layer) { [CATransaction begin]; [CATransaction setDisableActions:YES]; - NSWindow* nsWindow = (NSWindow*)glfwGetCocoaWindow((GLFWwindow*)window); - NSView* contentView = [nsWindow contentView]; + NSView* contentView = (__bridge NSView*)view; CAMetalLayer* metalLayer = (__bridge CAMetalLayer*)layer; @@ -22,17 +18,17 @@ void mtlObjectCSetContentViewsLayer(void* window, void* layer) { [CATransaction commit]; } -void* mtlCreateContentView(void* targetWindow) { - NSWindow* window = (__bridge NSWindow*)targetWindow; - NSRect frame = [[window contentView] frame]; // fallback size - NSView* contentView = [[NSView alloc] initWithFrame:frame]; - [window setContentView:contentView]; +// void* mtlCreateContentView(void* targetWindow) { +// NSWindow* window = (__bridge NSWindow*)targetWindow; +// NSRect frame = [[window contentView] frame]; // fallback size +// NSView* contentView = [[NSView alloc] initWithFrame:frame]; +// [window setContentView:contentView]; - if (contentView == nullptr) - frame = NSMakeRect(0, 0, window.frame.size.width, window.frame.size.height); +// if (contentView == nullptr) +// frame = NSMakeRect(0, 0, window.frame.size.width, window.frame.size.height); - return contentView; -} +// return contentView; +// } // void* mtlInitContentView(void* targetView) { // NSView* view = (__bridge NSView*)targetView; diff --git a/rendering_api/metal/src/bridge/metal_bridge.h b/rendering_api/metal/src/bridge/metal_bridge.h index c4b43d3..95bc5b6 100644 --- a/rendering_api/metal/src/bridge/metal_bridge.h +++ b/rendering_api/metal/src/bridge/metal_bridge.h @@ -1,5 +1,5 @@ #pragma once -void mtlObjectCSetContentViewsLayer(void* window, void* layer); -void* mtlCreateContentView(void* targetWindow); +void mtlObjectCSetContentViewsLayer(void* view, void* layer); +// void* mtlCreateContentView(void* targetView); void mtlInitializeMetalLayer(void* layer, bool vsync); diff --git a/rendering_api/metal/src/core/devices/metal_output_device.cpp b/rendering_api/metal/src/core/devices/metal_output_device.cpp index f425367..9cafeec 100644 --- a/rendering_api/metal/src/core/devices/metal_output_device.cpp +++ b/rendering_api/metal/src/core/devices/metal_output_device.cpp @@ -1,8 +1,6 @@ #include #include -// #include #include -#include #include "metal_output_devices.h" struct mtlFramebufferVertex { diff --git a/rendering_api/metal/src/core/metal_instance.cpp b/rendering_api/metal/src/core/metal_instance.cpp index 43d40ec..de9424e 100644 --- a/rendering_api/metal/src/core/metal_instance.cpp +++ b/rendering_api/metal/src/core/metal_instance.cpp @@ -1,10 +1,5 @@ #include #include - -#import -#define GLFW_EXPOSE_NATIVE_COCOA -#import - #include "bridge/metal_bridge.h" #include "metal_instance.h" @@ -18,14 +13,22 @@ GN_EXPORT void gnDestroyInstanceFn(gnInstance& instance) { } -GN_EXPORT gnReturnCode gnInstanceSetWindowFn(gnInstance& instance, GLFWwindow* window) { +GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(gnInstance& instance, NS::Window* window, NS::View* view) { if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData(); - instance.instance->window = window; - int width, height; - glfwGetFramebufferSize(instance.instance->window, &width, &height); - - instance.instance->metalWindow = reinterpret_cast(glfwGetCocoaWindow(window)); - instance.instance->metalContentView = reinterpret_cast(glfwGetCocoaView(window)); + instance.instance->metalContentView = view; return GN_SUCCESS; + } + +// GN_EXPORT gnReturnCode gnInstanceSetWindowFn(gnInstance& instance, GLFWwindow* window) { +// if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData(); +// instance.instance->window = window; + +// int width, height; +// glfwGetFramebufferSize(instance.instance->window, &width, &height); + +// instance.instance->metalWindow = reinterpret_cast(glfwGetCocoaWindow(window)); +// instance.instance->metalContentView = reinterpret_cast(glfwGetCocoaView(window)); +// return GN_SUCCESS; +// } diff --git a/rendering_api/metal/src/core/metal_instance.h b/rendering_api/metal/src/core/metal_instance.h index 038a66c..6d9ad87 100644 --- a/rendering_api/metal/src/core/metal_instance.h +++ b/rendering_api/metal/src/core/metal_instance.h @@ -13,9 +13,6 @@ struct GLFWwindow; struct gnPlatformInstanceData { - NS::Window* metalWindow; NS::View* metalContentView; - GLFWwindow* window; - MTL::RenderPipelineState* framebufferRenderer, *testSquareRenderer; }; diff --git a/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.cpp b/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.cpp index 3993442..e0a2705 100644 --- a/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.cpp +++ b/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.cpp @@ -21,7 +21,7 @@ GN_EXPORT gnDevicePresentationDetails gnGetDevicePresentationDetailsFn(const gnP GN_EXPORT gnReturnCode gnPresentationQueueGetNextImageAsyncFn(gnPresentationQueue& presentationQueue, const gnSyncSemaphore& semaphore, gnUInt* imageIndex) { mtlObjectCSetContentViewsLayer( - presentationQueue.presentationQueue->outputDevice->outputDevice->instance->instance->window, + presentationQueue.presentationQueue->outputDevice->outputDevice->instance->instance->metalContentView, presentationQueue.presentationQueue->layer); presentationQueue.presentationQueue->currentDrawableIndex++; @@ -43,7 +43,7 @@ GN_EXPORT gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presenta presentationQueue->presentationQueue->outputDevice = const_cast(&device); presentationQueue->presentationQueue->layer = CA::MetalLayer::layer(); - presentationQueue->presentationQueue->layer->setPixelFormat(MTL::PixelFormat::PixelFormatBGRA8Unorm_sRGB); + presentationQueue->presentationQueue->layer->setPixelFormat(MTL::PixelFormat::PixelFormatBGRA8Unorm); presentationQueue->presentationQueue->layer->setFramebufferOnly(true); presentationQueue->presentationQueue->layer->setDrawableSize({ (double)details.ImageSize.x, (double)details.ImageSize.y }); presentationQueue->presentationQueue->layer->setDevice(device.outputDevice->device); @@ -51,7 +51,7 @@ GN_EXPORT gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presenta mtlInitializeMetalLayer(presentationQueue->presentationQueue->layer, true); mtlObjectCSetContentViewsLayer( - device.outputDevice->instance->instance->window, + device.outputDevice->instance->instance->metalContentView, presentationQueue->presentationQueue->layer); for (int i = 0; i < details.ImageCount; i++) { diff --git a/rendering_api/vulkan/CMakeLists.txt b/rendering_api/vulkan/CMakeLists.txt index 3101bcf..1597a87 100644 --- a/rendering_api/vulkan/CMakeLists.txt +++ b/rendering_api/vulkan/CMakeLists.txt @@ -5,31 +5,47 @@ file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS "src/*.cpp" "src/*.hpp" "src/*.c" "src/*.h" ) -add_library(GryphnVulkanImpl SHARED ${SOURCE_FILES}) + +if (APPLE) + file(GLOB_RECURSE METAL_FILES CONFIGURE_DEPENDS + "src/*.mm" +) +endif() + +add_library(GryphnVulkanImpl SHARED ${SOURCE_FILES} ${METAL_FILES}) target_include_directories(GryphnVulkanImpl PUBLIC ${CMAKE_SOURCE_DIR}/gryphn/include/ ${CMAKE_SOURCE_DIR}/gryphn/src/ ${CMAKE_SOURCE_DIR}/gryphn/src/ - ${CMAKE_SOURCE_DIR}/depends/glfw/glfw-3.4/include/ src/ /Applications/vulkansdk/macOS/include/ ) add_compile_definitions(GN_REVEAL_IMPL) -add_library(glfw SHARED IMPORTED) -set_target_properties(glfw PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/build/depends/glfw/glfw-3.4/src/libglfw.3.4.dylib) - add_library(libvulkan SHARED IMPORTED) set_target_properties(libvulkan PROPERTIES IMPORTED_LOCATION /Applications/vulkansdk/macOS/lib/libvulkan.dylib) -target_link_libraries(GryphnVulkanImpl glfw libvulkan) +target_link_libraries(GryphnVulkanImpl libvulkan) -target_link_libraries(GryphnVulkanImpl - "-framework IOKit" - "-framework CoreFoundation" - "-framework CoreGraphics" - "-framework AppKit" -) +if(WIN32) + add_compile_definitions(GN_PLATFORM_WIN32) +endif() +if(APPLE) + + target_link_libraries(GryphnVulkanImpl + "-framework IOKit" + "-framework CoreFoundation" + "-framework CoreGraphics" + "-framework AppKit" + "-framework Metal" + "-framework QuartzCore" + ) + + add_compile_definitions(GN_PLATFORM_MACOS) +endif() +if(UNIX AND NOT APPLE) + add_compile_definitions(GN_PLATFORM_LINUX) +endif() file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/gryphn/rendering_apis) add_custom_command(TARGET GryphnVulkanImpl POST_BUILD diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.cpp b/rendering_api/vulkan/src/instance/vulkan_instance.cpp index 1341fc9..4684458 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.cpp +++ b/rendering_api/vulkan/src/instance/vulkan_instance.cpp @@ -1,12 +1,11 @@ -#define GLFW_INCLUDE_VULKAN -#include - #include "gryphn/gryphn_utils.h" #include "vector" #include #include "debugger/vulkan_debugger.h" #include "vulkan_instance.h" + + // now I gotta do some shit to setup debug layers bool checkValidationLayerSupport(gnList layers_to_validate) { uint32_t layerCount; @@ -33,21 +32,24 @@ bool checkValidationLayerSupport(gnList layers_to_validate) { return true; } -std::vector getRequiredExtensions(bool validation_layers_required) { - uint32_t glfwExtensionCount = 0; - const char** glfwExtensions; - glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); +// std::vector getRequiredExtensions(bool validation_layers_required, gnInstance& instance) { +// // uint32_t glfwExtensionCount = 0; +// // const char** glfwExtensions; +// // glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); - std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); +// std::vector extensions(instance.instance->extensions, instance.instance->extensions + instance.instance->extensionCount); - if (validation_layers_required) { - extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); - } - extensions.push_back("VK_KHR_portability_enumeration"); - extensions.push_back("VK_EXT_metal_surface"); +// if (validation_layers_required) { +// extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); +// } - return extensions; -} +// #ifdef GN_PLATFORM_MACOS +// extensions.push_back("VK_KHR_portability_enumeration"); +// extensions.push_back("VK_EXT_metal_surface"); +// #endif + +// return extensions; +// } void gnInstanceSetAppInfoFn(gnInstance& instance, gnAppInfo& info) { if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData(); @@ -76,14 +78,36 @@ GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance) { instance->valid = true; + #ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + instance->instance->extensions.push_back("VK_KHR_xlib_surface"); + #endif + #ifdef GN_WINFDOW_WAYLAND + instance->instance->extensions.push_back("VK_KHR_wayland_surface"); + #endif + #endif + #ifdef GN_PLATFORM_WINDOWS + instance->instance->extensions.push_back("VK_MVK_macos_surface"); + #endif + #ifdef GN_PLATFORM_MACOS + instance->instance->extensions.push_back("VK_MVK_macos_surface"); + instance->instance->extensions.push_back("VK_KHR_portability_enumeration"); + instance->instance->extensions.push_back("VK_EXT_metal_surface"); + #endif + + + instance->instance->extensions.push_back("VK_KHR_surface"); + if (instance->debugger) + instance->instance->extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + VkInstanceCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &instance->instance->appInfo; createInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; - auto extensions = getRequiredExtensions(instance->debugger); + // auto extensions = getRequiredExtensions(instance->debugger); - createInfo.enabledExtensionCount = static_cast(extensions.size());; - createInfo.ppEnabledExtensionNames = extensions.data(); + createInfo.enabledExtensionCount = static_cast(instance->instance->extensions.size());; + createInfo.ppEnabledExtensionNames = instance->instance->extensions.data(); VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; if (instance->debugger != nullptr) { @@ -116,16 +140,3 @@ GN_EXPORT void gnDestroyInstanceFn(gnInstance& instance) { vkDestroySurfaceKHR(instance.instance->vk_instance, instance.instance->window_surface, nullptr); vkDestroyInstance(instance.instance->vk_instance, nullptr); } - -GN_EXPORT gnReturnCode gnInstanceSetWindowFn(gnInstance& instance, GLFWwindow* window) { - instance.instance->window = window; - - if (glfwVulkanSupported() != GLFW_TRUE) { - return gnReturnError(GN_UNSUPPORTED_RENDERING_API, "vulkan is not actually supported\n"); - } - - VkResult result = glfwCreateWindowSurface(instance.instance->vk_instance, window, nullptr, &instance.instance->window_surface);\ - if (result != VK_SUCCESS) - return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, std::to_string(result).c_str()); - return GN_SUCCESS; -} diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.h b/rendering_api/vulkan/src/instance/vulkan_instance.h index 3e04737..c346a4c 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.h +++ b/rendering_api/vulkan/src/instance/vulkan_instance.h @@ -1,10 +1,14 @@ #pragma once #include "core/instance/gryphn_instance.h" #include +#ifdef GN_PLATFORM_MACOS +#include "vulkan_macos_bridge.h" +#endif struct gnPlatformInstanceData { VkInstance vk_instance; VkApplicationInfo appInfo; VkSurfaceKHR window_surface; - GLFWwindow* window; + + std::vector extensions; }; diff --git a/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h b/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h new file mode 100644 index 0000000..fdf13e0 --- /dev/null +++ b/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h @@ -0,0 +1,2 @@ +#pragma once +void* macosBridge(void* window, void* view); diff --git a/rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm b/rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm new file mode 100644 index 0000000..491a59a --- /dev/null +++ b/rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm @@ -0,0 +1,18 @@ +#include "vulkan_macos_bridge.h" +#import +#import +#import +#import + +// kinda borrowed from cocoa_window.m in GLFW +void* macosBridge(void* inputWindow, void* inputView) { + NSWindow* window = (__bridge NSWindow*)inputView; + NSView* view = (__bridge NSView*)inputView; + + CAMetalLayer* layer = [CAMetalLayer layer]; + [layer setContentsScale:[window backingScaleFactor]]; + + [view setLayer:layer]; + [view setWantsLayer:YES]; + return layer; +} diff --git a/rendering_api/vulkan/src/instance/vulkan_surfance.cpp b/rendering_api/vulkan/src/instance/vulkan_surfance.cpp new file mode 100644 index 0000000..d2e8e09 --- /dev/null +++ b/rendering_api/vulkan/src/instance/vulkan_surfance.cpp @@ -0,0 +1,70 @@ +#include "vulkan_instance.h" + +#ifdef GN_PLATFORM_LINUX +#ifdef GN_WINDOW_X11 +#include +#include + +GN_EXPORT gnReturnCode gnCreateX11WindowSurfaceFn(gnInstance& instance, Display* display, Window* window) { + VkXlibSurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; + info.dpy = display; + info.window = window; + + vkCreateXlibSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); + return GN_SUCCESS; +} +#endif + +#ifdef GN_WINFDOW_WAYLAND +#include +#include +GN_EXPORT gnReturnCode gnCreateWaylandWindowSurfaceFn(gnInstance& instance, wl_display* display, wl_surface* surface) { + VkWaylandSurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; + info.display = display; + info.surface = surface; + + VkSurfaceKHR surface; + vkCreateWaylandSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); + return GN_SUCCESS; +} +#endif +#endif + +#ifdef GN_PLATFORM_WINDOWS +#include "vulkan/vulkan_win32.h" +GN_EXPORT gnReturnCode gnCreateWindowsWindowSurfaceFn(gnInstance& instance, HWND* window, HINSTANCE* instance) { + VkWin32SurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + info.hwnd = window; + info.hinstance = instance; + + VkSurfaceKHR surface; + vkCreateWin32SurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); + return GN_SUCCESS; +} +#endif +#include "vulkan/vulkan_macos.h" +#include "vulkan/vulkan_metal.h" + +#ifdef GN_PLATFORM_MACOS +GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(gnInstance& instance, NS::Window* window, NS::View* view) { + // VkMacOSSurfaceCreateInfoMVK info{}; + // info.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; + // info.pView = (void*)view; + + VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {}; + surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; + surfaceCreateInfo.pNext = nullptr; + surfaceCreateInfo.flags = 0; + surfaceCreateInfo.pLayer = macosBridge(window, view); + + VkSurfaceKHR surface; + VkResult result = vkCreateMetalSurfaceEXT(instance.instance->vk_instance, &surfaceCreateInfo, nullptr, &instance.instance->window_surface); + + // VkSurfaceKHR surface; + // vkCreateMacOSSurfaceMVK(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); + // return GN_SUCCESS; +} +#endif diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.cpp b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.cpp index 0808fa0..c7a00dd 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.cpp +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.cpp @@ -15,14 +15,12 @@ GN_EXPORT gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presenta presentationQueue->presentationQueue->outputDevice = const_cast(&device); vulkanSwapchainDetails swapchain_details = vulkanGetSwapchainDetails( - device.physicalOutputDevice->physicalOutputDevice->instance->instance->window, - device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface, - device.physicalOutputDevice->physicalOutputDevice->device + { (float)details.ImageSize.x, (float)details.ImageSize.y }, + device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface, + device.physicalOutputDevice->physicalOutputDevice->device ); presentationQueue->presentationQueue->swapchainDetails = swapchain_details; - //std::cout << "Swapchain Image Format: " << presentationQueue->presentation_queue->swapchainDetails.surfaceFormat << "\n"; - VkSwapchainCreateInfoKHR createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; createInfo.surface = device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface; diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h index 284a0a2..a51326b 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h @@ -1,5 +1,4 @@ #pragma once -#include #include #include #include // Necessary for uint32_t @@ -7,6 +6,7 @@ #include // Necessary for std::clamp #include "vector" #include "set" +#include const std::vector deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, @@ -33,16 +33,16 @@ static VkPresentModeKHR chooseSwapPresentMode(const std::vector::max()) { return capabilities.currentExtent; } else { - int width, height; - glfwGetFramebufferSize(window, &width, &height); + // int width, height; + // glfwGetFramebufferSize(window, &width, &height); VkExtent2D actualExtent = { - static_cast(width), - static_cast(height) + static_cast(size.x), + static_cast(size.y) }; actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width); diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h index 6514bbc..739bddb 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h @@ -11,12 +11,12 @@ struct vulkanSwapchainDetails { SwapChainSupportDetails swapChainSupport; }; -static vulkanSwapchainDetails vulkanGetSwapchainDetails(GLFWwindow* window, const VkSurfaceKHR& surface, const VkPhysicalDevice& physicalDevice) { +static vulkanSwapchainDetails vulkanGetSwapchainDetails(gnVec2 size, const VkSurfaceKHR& surface, const VkPhysicalDevice& physicalDevice) { SwapChainSupportDetails swapChainSupport = querySwapChainSupport(surface, physicalDevice); VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats); VkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes); - VkExtent2D extent = chooseSwapExtent(window, swapChainSupport.capabilities); + VkExtent2D extent = chooseSwapExtent(size, swapChainSupport.capabilities); return { surfaceFormat, presentMode, extent, swapChainSupport diff --git a/src/core/init/gryphn_init.cpp b/src/core/init/gryphn_init.cpp index 47fe87f..d062c48 100644 --- a/src/core/init/gryphn_init.cpp +++ b/src/core/init/gryphn_init.cpp @@ -54,7 +54,27 @@ gnReturnCode gnInit(gnRenderingAPI RenderingAPI) { gnLoadDLLFunction(gnRenderingAPILIB, gnCreateInstance, "gnCreateInstanceFn"); gnLoadDLLFunction(gnRenderingAPILIB, gnDestroyInstance, "gnDestroyInstanceFn"); gnLoadDLLFunction(gnRenderingAPILIB, gnGetPlatformLayerName, "gnGetPlatformLayerNameFn"); - gnLoadDLLFunction(gnRenderingAPILIB, gnInstanceSetWindow, "gnInstanceSetWindowFn"); + + // LOAD THE SET WINDOW FUNCTIONS + #ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + gnLoadDLLFunction(gnRenderingAPILIB, gnCreateX11WindowSurface, "gnCreateX11WindowSurfaceFn"); + #endif + #ifdef GN_WINDOW_WAYLAND + gnLoadDLLFunction(gnRenderingAPILIB, gnCreateWaylandWindowSurface, "gnCreateWaylandWindowSurfaceFn"); + #endif + #endif + + + #ifdef GN_PLATFORM_WIN32 + gnLoadDLLFunction(gnRenderingAPILIB, gnCreateWindowsWindowSurface, "gnCreateWindowsWindowSurfaceFn"); + #endif + + #ifdef GN_PLATFORM_MACOS + gnLoadDLLFunction(gnRenderingAPILIB, gnCreateMacOSWindowSurface, "gnCreateMacOSWindowSurfaceFn"); + #endif + // This is stupid + gnLoadDLLFunction(gnRenderingAPILIB, gnCreateDebugger, "gnCreateDebuggerFn"); gnLoadDLLFunction(gnRenderingAPILIB, gnDestroyDebugger, "gnDestroyDebuggerFn"); gnLoadDLLFunction(gnRenderingAPILIB, gnGetPhysicalOutputDevices, "gnGetPhysicalOutputDevicesFn"); diff --git a/src/core/instance/gryphn_instance.h b/src/core/instance/gryphn_instance.h index 1ab0505..a4f0235 100644 --- a/src/core/instance/gryphn_instance.h +++ b/src/core/instance/gryphn_instance.h @@ -3,8 +3,7 @@ #include "application_information/gryphn_app_info.h" #include "core/debugger/gryphn_debugger.h" #include - -class GLFWwindow; +#include struct gnPlatformInstanceData; @@ -23,7 +22,26 @@ void gnInstanceSetDebugger(gnInstance& instance, gnDebugger& debugger); inline gnReturnCode (*gnCreateInstance)(gnInstance* instance); inline void (*gnDestroyInstance)(gnInstance& instance); -inline gnReturnCode (*gnInstanceSetWindow)(gnInstance& instance, GLFWwindow* window); +// inline gnReturnCode (*gnInstanceSetWindow)(gnInstance& instance, GLFWwindow* window); + +#ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + inline gnReturnCode (*gnCreateX11WindowSurface)(gnInstance& instance, Display* display, Window* window); + #endif + #ifdef GN_WINDOW_WAYLAND + inline gnReturnCode (*gnCreateWaylandWindowSurface)(gnInstance& instance, wl_display* display, wl_surface* surface); + #endif +#endif + + +#ifdef GN_PLATFORM_WIN32 + inline gnReturnCode (*gnCreateWindowsWindowSurface)(gnInstance& instance, HWND* window, HINSTANCE* instance); +#endif + +#ifdef GN_PLATFORM_MACOS + inline gnReturnCode (*gnCreateMacOSWindowSurface)(gnInstance& instance, NS::Window* window, NS::View* view); +#endif + // TODO: if instance creation fails add in a query to why the instance creation failed // Lowkey thats a lot of work tho and I dont really want to do alllllll that diff --git a/src/platform/gryphn_platform_include.h b/src/platform/gryphn_platform_include.h index cdc57db..fcdf65b 100644 --- a/src/platform/gryphn_platform_include.h +++ b/src/platform/gryphn_platform_include.h @@ -1,10 +1,15 @@ #pragma once + #ifdef GN_PLATFORM_LINUX #include -#elif GN_PLATFORM_MACOS +#endif + +#ifdef GN_PLATFORM_MACOS #include -#elif GN_PLATFORM_WINDOWS +#endif + +#ifdef GN_PLATFORM_WINDOWS #include #endif diff --git a/src/platform/platform_linux/gryphn_platform_linux.h b/src/platform/platform_linux/gryphn_platform_linux.h index e69de29..4a2123a 100644 --- a/src/platform/platform_linux/gryphn_platform_linux.h +++ b/src/platform/platform_linux/gryphn_platform_linux.h @@ -0,0 +1,7 @@ +#ifdef GN_WINDOW_X11 +#include +#endif + +#ifdef GN_WINDOW_WAYLAND +#include +#endif diff --git a/src/platform/platform_macos/gryphn_platform_macos.h b/src/platform/platform_macos/gryphn_platform_macos.h index 996b64e..d670fb5 100644 --- a/src/platform/platform_macos/gryphn_platform_macos.h +++ b/src/platform/platform_macos/gryphn_platform_macos.h @@ -3,3 +3,9 @@ #include #include #include + +namespace NS { + struct Window; + struct View; +} +// #include "AppKit/NSView.hpp"