From fa58a2f2d68b05ff6e4301b4981105c29787b0f3 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Tue, 20 May 2025 22:35:51 -0400 Subject: [PATCH] C instance creation --- include/gryphn/gryphn.h | 2 +- include/gryphn/gryphn_utils.h | 2 +- rendering_api/metal/CMakeLists.txt | 1 + .../src/core/instance/metal_instance.cpp | 19 +++ .../metal/src/core/instance/metal_instance.h | 10 ++ .../metal/src/core/metal_supports.cpp | 1 + .../vulkan/src/instance/vulkan_instance.cpp | 95 +++++++------- .../vulkan/src/instance/vulkan_instance.h | 3 +- .../vulkan/src/instance/vulkan_surfance.cpp | 122 +++++++++--------- src/core/instance/gryphn_instance.c | 1 + .../platform_macos/gryphn_platform_macos.c | 2 +- src/utils/gryphn_error_code.h | 4 +- 12 files changed, 150 insertions(+), 112 deletions(-) create mode 100644 rendering_api/metal/src/core/instance/metal_instance.cpp create mode 100644 rendering_api/metal/src/core/instance/metal_instance.h diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index e051755..eeb144c 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -1,6 +1,6 @@ #pragma once #include -#include +#include #include // #pragma once diff --git a/include/gryphn/gryphn_utils.h b/include/gryphn/gryphn_utils.h index 955fec9..d9be1c8 100644 --- a/include/gryphn/gryphn_utils.h +++ b/include/gryphn/gryphn_utils.h @@ -17,4 +17,4 @@ // typedef float gnFloat; // typedef size_t gnSize; -// #define GN_EXPORT extern "C" +#define GN_EXPORT extern "C" diff --git a/rendering_api/metal/CMakeLists.txt b/rendering_api/metal/CMakeLists.txt index c556b7e..aecc1f2 100644 --- a/rendering_api/metal/CMakeLists.txt +++ b/rendering_api/metal/CMakeLists.txt @@ -1,4 +1,5 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS on) +set(CMAKE_CXX_STANDARD 17) project(GryphnMetalImpl) file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS diff --git a/rendering_api/metal/src/core/instance/metal_instance.cpp b/rendering_api/metal/src/core/instance/metal_instance.cpp new file mode 100644 index 0000000..5f46251 --- /dev/null +++ b/rendering_api/metal/src/core/instance/metal_instance.cpp @@ -0,0 +1,19 @@ +#include +#include +// #include "bridge/metal_bridge.h" +#include "metal_instance.h" + +GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance) { + if (instance->instance == nullptr) instance->instance = new gnPlatformInstance(); + return GN_SUCCESS; +} + +GN_EXPORT void gnDestroyInstanceFn(gnInstance& instance) { + +} + +GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(gnInstance& instance, NS::Window* window, NS::View* view) { + if (instance.instance == nullptr) instance.instance = new gnPlatformInstance(); + instance.instance->metalContentView = view; + return GN_SUCCESS; +} diff --git a/rendering_api/metal/src/core/instance/metal_instance.h b/rendering_api/metal/src/core/instance/metal_instance.h new file mode 100644 index 0000000..985282f --- /dev/null +++ b/rendering_api/metal/src/core/instance/metal_instance.h @@ -0,0 +1,10 @@ +#pragma once +#include +#include + +struct GLFWwindow; + +struct gnPlatformInstance { + NS::View* metalContentView; + MTL::RenderPipelineState* framebufferRenderer, *testSquareRenderer; +}; diff --git a/rendering_api/metal/src/core/metal_supports.cpp b/rendering_api/metal/src/core/metal_supports.cpp index 9274e57..b6dddad 100644 --- a/rendering_api/metal/src/core/metal_supports.cpp +++ b/rendering_api/metal/src/core/metal_supports.cpp @@ -1,3 +1,4 @@ +#include "utils/gryphn_bool.h" #include GN_EXPORT gnBool gnAPISupportsFn(gnFeature feature) { diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.cpp b/rendering_api/vulkan/src/instance/vulkan_instance.cpp index cd381ef..3b08687 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.cpp +++ b/rendering_api/vulkan/src/instance/vulkan_instance.cpp @@ -1,25 +1,24 @@ #include "gryphn/gryphn_utils.h" #include "vector" #include -#include "debugger/vulkan_debugger.h" +// #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) { +bool checkValidationLayerSupport(std::vector layers_to_validate) { uint32_t layerCount; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); std::vector availableLayers(layerCount); vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); - for (int i = 0; i < gnListLength(layers_to_validate); i++) { - gnString layerName = layers_to_validate[i]; + for (int i = 0; i < layers_to_validate.size(); i++) { bool layerFound = false; for (const auto& layerProperties : availableLayers) { - if (strcmp(gnToCString(layerName), layerProperties.layerName) == 0) { + if (strcmp(layers_to_validate[i].c_str(), layerProperties.layerName) == 0) { layerFound = true; break; } @@ -32,24 +31,26 @@ bool checkValidationLayerSupport(gnList layers_to_validate) { return true; } -void gnInstanceSetAppInfoFn(gnInstance& instance, gnAppInfo& info) { - if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData(); +// void gnInstanceSetAppInfoFn(gnInstance& instance, gnInstanceInfo& info) { + // if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData(); - instance.AppInfo = info; - instance.instance->appInfo = {}; - instance.instance->appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - instance.instance->appInfo.pApplicationName = "Hello Triangle"; - instance.instance->appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); - instance.instance->appInfo.pEngineName = "No Engine"; - instance.instance->appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); - instance.instance->appInfo.apiVersion = VK_API_VERSION_1_3; -} +// instance.AppInfo = info; +// instance.instance->appInfo = {}; +// instance.instance->appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; +// instance.instance->appInfo.pApplicationName = "Hello Triangle"; +// instance.instance->appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); +// instance.instance->appInfo.pEngineName = "No Engine"; +// instance.instance->appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); +// instance.instance->appInfo.apiVersion = VK_API_VERSION_1_3; +// } -GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance) { - if (instance->debugger != nullptr && !checkValidationLayerSupport(instance->debugger->debug_layers)) { - return gnReturnError(GN_FAILED_CREATE_INSTANCE, "validation layers requested, but not available!"); - } - gnInstanceSetAppInfoFn(*instance, instance->AppInfo); +GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance, gnInstanceInfo instanceInfo) { + instance->instance = new gnPlatformInstance(); + + // if (instance->debugger != nullptr && !checkValidationLayerSupport(instance->debugger->debug_layers)) { + // return gnReturnError(GN_FAILED_CREATE_INSTANCE, "validation layers requested, but not available!"); + // } + // gnInstanceSetAppInfoFn(*instance, instance->AppInfo); instance->valid = true; @@ -72,46 +73,50 @@ GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance) { instance->instance->extensions.push_back("VK_KHR_surface"); - if (instance->debugger) - instance->instance->extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + // if (instance->debugger) + // instance->instance->extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); - VkInstanceCreateInfo createInfo{}; + VkApplicationInfo appInfo = { + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pApplicationName = gnToCString(instanceInfo.applicationName), + .applicationVersion = instanceInfo.applicationVersion, + .pEngineName = gnToCString(instanceInfo.engineName), + .engineVersion = instanceInfo.engineVersion, + .apiVersion = VK_API_VERSION_1_3, + }; + + VkInstanceCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - createInfo.pApplicationInfo = &instance->instance->appInfo; + createInfo.pApplicationInfo = &appInfo; createInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; // auto extensions = getRequiredExtensions(instance->debugger); createInfo.enabledExtensionCount = static_cast(instance->instance->extensions.size());; createInfo.ppEnabledExtensionNames = instance->instance->extensions.data(); - VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; - if (instance->debugger != nullptr) { - auto validation_layers = instance->debugger->debug_layers; + // VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; + // if (instance->debugger != nullptr) { + // auto validation_layers = instance->debugger->debug_layers; - gnList validation_layers_c = gnCreateList(); - for (int i = 0; i < gnListLength(validation_layers); i++) - gnListAdd(validation_layers_c, gnToCString(validation_layers[i])); + // gnList validation_layers_c = gnCreateList(); + // for (int i = 0; i < gnListLength(validation_layers); i++) + // gnListAdd(validation_layers_c, gnToCString(validation_layers[i])); - createInfo.enabledLayerCount = static_cast(gnListLength(validation_layers_c)); - createInfo.ppEnabledLayerNames = gnListData(validation_layers_c); + // createInfo.enabledLayerCount = static_cast(gnListLength(validation_layers_c)); + // createInfo.ppEnabledLayerNames = gnListData(validation_layers_c); - populateDebugMessengerCreateInfo(debugCreateInfo); - createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo; - } else { + // populateDebugMessengerCreateInfo(debugCreateInfo); + // createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo; + // } else { createInfo.enabledLayerCount = 0; - } + // } if (vkCreateInstance(&createInfo, nullptr, &instance->instance->vk_instance) != VK_SUCCESS) { - return gnReturnError(GN_FAILED_CREATE_INSTANCE, "im to lazy to query vulkan why"); + return GN_FAILED_CREATE_INSTANCE; } - uint32_t deviceCount; - vkEnumeratePhysicalDevices(instance->instance->vk_instance, &deviceCount, nullptr); - if (deviceCount == 0) - return gnReturnError(GN_FAILED_CREATE_INSTANCE, "no devices support vulkan"); - - if (instance->debugger->debugger == nullptr) instance->debugger->debugger = new gnPlatformDebugger(); - instance->debugger->debugger->instance = &instance->instance->vk_instance; + // if (instance->debugger->debugger == nullptr) instance->debugger->debugger = new gnPlatformDebugger(); + // instance->debugger->debugger->instance = &instance->instance->vk_instance; return GN_SUCCESS; } diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.h b/rendering_api/vulkan/src/instance/vulkan_instance.h index c346a4c..7161571 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.h +++ b/rendering_api/vulkan/src/instance/vulkan_instance.h @@ -4,8 +4,9 @@ #ifdef GN_PLATFORM_MACOS #include "vulkan_macos_bridge.h" #endif +#include "vector" -struct gnPlatformInstanceData { +struct gnPlatformInstance { VkInstance vk_instance; VkApplicationInfo appInfo; VkSurfaceKHR window_surface; diff --git a/rendering_api/vulkan/src/instance/vulkan_surfance.cpp b/rendering_api/vulkan/src/instance/vulkan_surfance.cpp index 4d901e5..e249d43 100644 --- a/rendering_api/vulkan/src/instance/vulkan_surfance.cpp +++ b/rendering_api/vulkan/src/instance/vulkan_surfance.cpp @@ -1,70 +1,70 @@ -#include "vulkan_instance.h" +// #include "vulkan_instance.h" -#ifdef GN_PLATFORM_LINUX -#ifdef GN_WINDOW_X11 -#include -#include +// #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; +// 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 +// 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; +// #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 +// 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; +// #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" +// 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); +// #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 +// 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/src/core/instance/gryphn_instance.c b/src/core/instance/gryphn_instance.c index d76f62c..b357a8d 100644 --- a/src/core/instance/gryphn_instance.c +++ b/src/core/instance/gryphn_instance.c @@ -6,6 +6,7 @@ gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info if (!gnIsAPISupported(info.renderingAPI)) return GN_UNSUPPORTED_RENDERING_API; instance->dynamicLib = gnLoadRenderingDLL(info.renderingAPI); if (instance->dynamicLib == NULL) return GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY; + instance->functions = malloc(sizeof(struct gnFunctions_t)); gnLoadFunctions(instance->dynamicLib, instance->functions); return instance->functions->_gnCreateInstance(instance, info); diff --git a/src/platform/platform_macos/gryphn_platform_macos.c b/src/platform/platform_macos/gryphn_platform_macos.c index 673d89f..287c109 100644 --- a/src/platform/platform_macos/gryphn_platform_macos.c +++ b/src/platform/platform_macos/gryphn_platform_macos.c @@ -18,7 +18,7 @@ gnRenderingAPI* gnGetSupportedRenderingAPIs(int* count) { struct gnDynamicLibrary_t* gnLoadDynamicLibrary(const gnString path) { struct gnDynamicLibrary_t* dll = malloc(sizeof(struct gnDynamicLibrary_t)); dll->dllPtr = dlopen(gnToCString(gnCombineStrings(path, ".dylib")), RTLD_LAZY), - dll->isValid = true + dll->isValid = true; if (dll->dllPtr == NULL) dll->isValid = false; return dll; } diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index 88e3234..ec193e3 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -4,7 +4,8 @@ typedef enum gnReturnCode_t { GN_SUCCESS, GN_UNKNOWN_RENDERINGAPI, GN_UNSUPPORTED_RENDERING_API, - GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY + GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY, + GN_FAILED_CREATE_INSTANCE // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT, @@ -19,7 +20,6 @@ typedef enum gnReturnCode_t { // GN_FAILED_CREATE_PRESENTATION_QUEUE, // GN_FAILED_TO_CREATE_FRAMEBUFFER, // GN_FAILED_CREATE_RENDERPASS, - // GN_FAILED_CREATE_INSTANCE, // GN_FAILED_TO_ATTACH_WINDOW, // GN_FAILED_TO_CREATE_IMAGE } gnReturnCode;