diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index 20230da..f962a2c 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -4,6 +4,7 @@ #include #include #include +#include // #pragma once diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.cpp b/rendering_api/vulkan/src/instance/vulkan_instance.cpp index a451448..34027ba 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.cpp +++ b/rendering_api/vulkan/src/instance/vulkan_instance.cpp @@ -101,6 +101,5 @@ GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance, gnInstanceInfo i GN_EXPORT void gnDestroyInstanceFn(gnInstance& instance) { instance.valid = false; - vkDestroySurfaceKHR(instance.instance->vk_instance, instance.instance->window_surface, nullptr); vkDestroyInstance(instance.instance->vk_instance, nullptr); } diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.h b/rendering_api/vulkan/src/instance/vulkan_instance.h index f90c24e..5125d86 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.h +++ b/rendering_api/vulkan/src/instance/vulkan_instance.h @@ -1,8 +1,5 @@ #pragma once #include -#ifdef GN_PLATFORM_MACOS -#include -#endif #include "vector" #include "core/debugger/gryphn_debugger.h" @@ -15,7 +12,7 @@ struct gnInstanceMessage { struct gnPlatformInstance { VkInstance vk_instance; VkApplicationInfo appInfo; - VkSurfaceKHR window_surface; + // VkSurfaceKHR window_surface; std::vector extensions; std::vector instanceMessages; diff --git a/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h b/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h deleted file mode 100644 index fdf13e0..0000000 --- a/rendering_api/vulkan/src/instance/vulkan_macos_bridge.h +++ /dev/null @@ -1,2 +0,0 @@ -#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 deleted file mode 100644 index 491a59a..0000000 --- a/rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm +++ /dev/null @@ -1,18 +0,0 @@ -#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 deleted file mode 100644 index e249d43..0000000 --- a/rendering_api/vulkan/src/instance/vulkan_surfance.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// #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; - -// VkResult result = vkCreateXlibSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); -// if (result != VK_SUCCESS) -// return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, result); -// 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; -// VkResult result = vkCreateWaylandSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); -// if (result != VK_SUCCESS) -// return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, result); -// 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; -// VkResult result = vkCreateWin32SurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface); -// if (result != VK_SUCCESS) -// return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, result); -// return GN_SUCCESS; -// } -// #endif -// #include "vulkan/vulkan_metal.h" - -// #ifdef GN_PLATFORM_MACOS -// GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(gnInstance& instance, NS::Window* window, NS::View* 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); -// if (result != VK_SUCCESS) -// return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, result); -// return GN_SUCCESS; -// } -// #endif diff --git a/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.h b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.h new file mode 100644 index 0000000..2b297dc --- /dev/null +++ b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.h @@ -0,0 +1,7 @@ +#pragma once +#include +#include + +struct gnPlatformWindowSurface { + VkSurfaceKHR surface; +}; diff --git a/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.mm b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.mm new file mode 100644 index 0000000..5134f81 --- /dev/null +++ b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.mm @@ -0,0 +1,36 @@ +#include "vulkan_surface.h" +#include "../instance/vulkan_instance.h" +#include +#include +#import +#import +#import +#import + + +#ifdef GN_PLATFORM_MACOS +#include "vulkan/vulkan_metal.h" +GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { + NSWindow* window = (__bridge NSWindow*)createInfo.window; + NSView* view = [window contentView]; + + CAMetalLayer* layer = [CAMetalLayer layer]; + [layer setContentsScale:[window backingScaleFactor]]; + [layer setFramebufferOnly:YES]; + + [view setLayer:layer]; + [view setWantsLayer:YES]; + + windowSurface->windowSurface = new gnPlatformWindowSurface(); + VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {}; + surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; + surfaceCreateInfo.pNext = nullptr; + surfaceCreateInfo.flags = 0; + surfaceCreateInfo.pLayer = layer; + + VkResult result = vkCreateMetalSurfaceEXT(instance->instance->vk_instance, &surfaceCreateInfo, nullptr, &windowSurface->windowSurface->surface); + if (result != VK_SUCCESS) + return GN_FAILED_TO_ATTACH_WINDOW; + return GN_SUCCESS; +} +#endif diff --git a/rendering_api/vulkan/src/vulkan_surface/vulkan_surfance.cpp b/rendering_api/vulkan/src/vulkan_surface/vulkan_surfance.cpp new file mode 100644 index 0000000..a38399d --- /dev/null +++ b/rendering_api/vulkan/src/vulkan_surface/vulkan_surfance.cpp @@ -0,0 +1,60 @@ +#include +#include "vulkan_surface.h" + +#ifdef GN_PLATFORM_LINUX +#ifdef GN_WINDOW_X11 +#include +#include + +GN_EXPORT gnReturnCode gnCreateX11WindowSurfaceFn(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnX11WindowSurfaceInfo_t createInfo) { + windowSurface->windowSurface = new gnPlatformWindowSurface(); + VkXlibSurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; + info.dpy = createInfo.display; + info.window = createInfo.window; + + VkResult result = vkCreateXlibSurfaceKHR(instance->instance->vk_instance, &info, nullptr, &windowSurface->windowSurface->surface); + if (result != VK_SUCCESS) + return GN_FAILED_TO_ATTACH_WINDOW; + return GN_SUCCESS; +} +#endif + +#ifdef GN_WINFDOW_WAYLAND +#include +#include +GN_EXPORT gnReturnCode gnCreateWaylandWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWaylandWindowSurfaceInfo_t createInfo) { + windowSurface->windowSurface = new gnPlatformWindowSurface(); + VkWaylandSurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; + info.display = createInfo.display; + info.surface = createInfo.surface; + + VkResult result = vkCreateWaylandSurfaceKHR(instance->instance->vk_instance, &info, nullptr, &windowSurface->windowSurface->surface); + if (result != VK_SUCCESS) + return GN_FAILED_TO_ATTACH_WINDOW; + return GN_SUCCESS; +} +#endif +#endif + +#ifdef GN_PLATFORM_WINDOWS +#include "vulkan/vulkan_win32.h" +GN_EXPORT gnReturnCode gnCreateWin32WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWin32WindowSurfaceInfo_t createInfo) { + windowSurface->windowSurface = new gnPlatformWindowSurface(); + VkWin32SurfaceCreateInfoKHR info{}; + info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + info.hwnd = createInfo.window; + info.hinstance = createInfo.instance; + + VkResult result = vkCreateWin32SurfaceKHR(instance->instance->vk_instance, &info, nullptr, &windowSurface->windowSurface->surface); + if (result != VK_SUCCESS) + return GN_FAILED_TO_ATTACH_WINDOW; + return GN_SUCCESS; +} +#endif + + +GN_EXPORT void gnDestroyWindowSurfaceFn(struct gnWindowSurface_t* windowSurface) { + vkDestroySurfaceKHR(windowSurface->instance->instance->vk_instance, windowSurface->windowSurface->surface, nullptr); +} diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 6d1360f..ecc2b1d 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -5,6 +5,7 @@ #include "debugger/gryphn_debugger.h" #include "output_device/gryphn_physical_output_device.h" #include "output_device/gryphn_output_device.h" +#include "window_surface/gryphn_surface.h" typedef struct gnFunctions_t { gnReturnCode (*_gnCreateInstance)(gnInstance* instance, struct gnInstanceInfo_t info); @@ -18,6 +19,26 @@ typedef struct gnFunctions_t { gnReturnCode (*_gnRegisterOutputDevice)(gnOutputDevice* outputDevice, gnInstance* instance, const gnPhysicalDevice physicalDevice); void (*_gnDestroyOutputDevice)(gnOutputDevice* device); + + #ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + gnReturnCode (*_gnCreateX11WindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnX11WindowSurfaceInfo_t createInfo); + #endif + #ifdef GN_WINDOW_WAYLAND + gnReturnCode (*_gnCreateWaylandWindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + #endif + #endif + + + #ifdef GN_PLATFORM_WIN32 + gnReturnCode (*_gnCreateWin32WindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWin32WindowSurfaceInfo_t createInfo); + #endif + + #ifdef GN_PLATFORM_MACOS + gnReturnCode (*_gnCreateMacOSWindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnMacOSWindowSurfaceInfo_t createInfo); + #endif + + void (*_gnDestroyWindowSurface)(struct gnWindowSurface_t* windowSurface); } gnFunctions; typedef struct gnDeviceFunctions_t { diff --git a/src/core/instance/gryphn_instance.h b/src/core/instance/gryphn_instance.h index 07ab608..a0bf72c 100644 --- a/src/core/instance/gryphn_instance.h +++ b/src/core/instance/gryphn_instance.h @@ -26,26 +26,3 @@ typedef struct gnInstance_t { gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info); void gnDestroyInstance(gnInstance* instance); - -// // 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 -// typedef void* NSWindow; -// typedef void* NSView; - -// inline gnReturnCode (*gnCreateMacOSWindowSurface)(gnInstance& instance, NSWindow window, NSView view); -// #endif diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index 22ac11a..b5fdaa1 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -3,6 +3,7 @@ #include #include "gryphn_dynamic_library.h" // #include +#include "stdio.h" gnBool gnIsAPISupported(gnRenderingAPI api) { int renderingAPICount = 0; @@ -44,6 +45,28 @@ void gnLoadFunctions(struct gnDynamicLibrary_t* lib, struct gnFunctions_t* funct gnLoadDLLFunction(lib, functions->_gnDeviceSupportsAPI, "gnDeviceSupportsAPIFn"); gnLoadDLLFunction(lib, functions->_gnRegisterOutputDevice, "gnRegisterOutputDeviceFn"); gnLoadDLLFunction(lib, functions->_gnDestroyOutputDevice, "gnDestroyOutputDeviceFn"); + + #ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + gnLoadDLLFunction(lib, functions->_gnCreateX11WindowSurface, "gnCreateX11WindowSurfaceFn"); + #endif + #ifdef GN_WINDOW_WAYLAND + gnLoadDLLFunction(lib, functions->_gnCreateWaylandWindowSurface, "gnCreateWaylandWindowSurfaceFn"); + #endif + #endif + + + #ifdef GN_PLATFORM_WIN32 + gnLoadDLLFunction(lib, functions->_gnCreateWin32WindowSurface, "gnCreateWin32WindowSurfaceFn"); + #endif + + #ifdef GN_PLATFORM_MACOS + gnLoadDLLFunction(lib, functions->_gnCreateMacOSWindowSurface, "gnCreateMacOSWindowSurfaceFn"); + #endif + + gnLoadDLLFunction(lib, functions->_gnDestroyWindowSurface, "gnDestroyWindowSurfaceFn"); + + printf("_gnDestroyWindowSurface location: %p\n", functions->_gnDestroyWindowSurface); } void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions) { diff --git a/src/core/window_surface/gryphn_surface.c b/src/core/window_surface/gryphn_surface.c new file mode 100644 index 0000000..0eb7930 --- /dev/null +++ b/src/core/window_surface/gryphn_surface.c @@ -0,0 +1,34 @@ + +#include "gryphn_surface.h" +#include "core/gryphn_platform_functions.h" + +#ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + gnReturnCode gnCreateX11WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnX11WindowSurfaceInfo_t createInfo) { + return instance->functions->_gnCreateX11WindowSurface(windowSurface, instance, createInfo); + } + #endif + #ifdef GN_WINDOW_WAYLAND + gnReturnCode gnCreateWaylandWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWaylandWindowSurfaceInfo_t createInfo) { + return instance->functions->_gnCreateWaylandWindowSurface(windowSurface, instance, createInfo); + } + #endif +#endif + + +#ifdef GN_PLATFORM_WIN32 + gnReturnCode gnCreateWin32WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWin32WindowSurfaceInfo_t createInfo) { + return instance->functions->_gnCreateWin32WindowSurface(windowSurface, instance, createInfo); + } +#endif + +#ifdef GN_PLATFORM_MACOS + gnReturnCode gnCreateMacOSWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { + windowSurface->instance = instance; + return instance->functions->_gnCreateMacOSWindowSurface(windowSurface, instance, createInfo); + } +#endif + +void gnDestroyWindowSurface(struct gnWindowSurface_t *windowSurface) { + windowSurface->instance->functions->_gnDestroyWindowSurface(windowSurface); +} diff --git a/src/core/window_surface/gryphn_surface.h b/src/core/window_surface/gryphn_surface.h new file mode 100644 index 0000000..7919325 --- /dev/null +++ b/src/core/window_surface/gryphn_surface.h @@ -0,0 +1,48 @@ +#pragma once +#include +#include + +struct gnPlatformWindowSurface; + +typedef struct gnWindowSurface_t { + struct gnPlatformWindowSurface* windowSurface; + gnInstance* instance; +} gnWindowSurface; +void gnDestroyWindowSurface(struct gnWindowSurface_t* windowSurface); + +#ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + typedef struct gnX11WindowSurfaceInfo_t { + Display* display; + Window* window; + } gnX11WindowSurfaceCreateInfo; + + gnReturnCode gnCreateX11WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnX11WindowSurfaceInfo_t createInfo); + #endif + #ifdef GN_WINDOW_WAYLAND + typedef struct gnWaylandWindowSurfaceInfo_t { + wl_display* display; + wl_surface* surface; + } gnWaylandWindowSurfaceInfo; + + gnReturnCode gnCreateWaylandWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + #endif +#endif + + +#ifdef GN_PLATFORM_WIN32 + typedef struct gnWin32WindowSurfaceInfo_t { + HWND* window; + HINSTANCE* instance; + } gnWin32WindowSurfaceInfo; + + gnReturnCode gnCreateWin32WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnWin32WindowSurfaceInfo_t createInfo); +#endif + +#ifdef GN_PLATFORM_MACOS + typedef struct gnMacOSWindowSurfaceInfo_t { + NSWindow* window; + } gnMacOSWindowSurfaceInfo; + + gnReturnCode gnCreateMacOSWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnMacOSWindowSurfaceInfo_t createInfo); +#endif diff --git a/src/platform/platform_macos/gryphn_platform_macos.h b/src/platform/platform_macos/gryphn_platform_macos.h index 43b4fea..c387b40 100644 --- a/src/platform/platform_macos/gryphn_platform_macos.h +++ b/src/platform/platform_macos/gryphn_platform_macos.h @@ -1,3 +1,9 @@ #pragma once #include #include + +#ifdef __OBJC__ +@class NSWindow; +#else +typedef void NSWindow; +#endif diff --git a/src/platform/platform_windows/gryphn_platform_windows.h b/src/platform/platform_windows/gryphn_platform_windows.h index e69de29..935b2b8 100644 --- a/src/platform/platform_windows/gryphn_platform_windows.h +++ b/src/platform/platform_windows/gryphn_platform_windows.h @@ -0,0 +1,4 @@ +#ifdef GN_PLATFORM_WINDOWS +#include "windows.h" + +#endif diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index 74f592d..ff6b973 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -7,7 +7,8 @@ typedef enum gnReturnCode_t { GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY, GN_FAILED_CREATE_INSTANCE, GN_FAILED_TO_CREATE_DEBUGGER, - GN_FAILED_TO_CREATE_DEVICE + GN_FAILED_TO_CREATE_DEVICE, + GN_FAILED_TO_ATTACH_WINDOW // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT,