From da20b016381300c51d50d17041225aeb0ebe9ad4 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Sun, 3 Aug 2025 09:55:29 -0400 Subject: [PATCH] continue instance functions redo --- .../vulkan/loader/vulkan_instance_loader.c | 9 +++- .../vulkan/src/instance/vulkan_instance.c | 4 +- .../vulkan/src/instance/vulkan_instance.h | 4 +- .../loader/src/gryphn_instance_functions.h | 8 ++-- projects/loader/src/gryphn_loader.c | 44 +++++++++++++------ projects/loader/src/gryphn_loader.h | 17 +++++-- 6 files changed, 57 insertions(+), 29 deletions(-) diff --git a/projects/apis/vulkan/loader/vulkan_instance_loader.c b/projects/apis/vulkan/loader/vulkan_instance_loader.c index df787b2..3407b8b 100644 --- a/projects/apis/vulkan/loader/vulkan_instance_loader.c +++ b/projects/apis/vulkan/loader/vulkan_instance_loader.c @@ -4,10 +4,15 @@ #include #include +gryphnInstanceFunctionLayers loadVulkanAPILayer() { + return (gryphnInstanceFunctionLayers) { + .createInstance = {vulkanCreateInstance, NULL}, + .destroyInstance = {vulkanDestroyInstance, NULL} + }; +} + gnInstanceFunctions loadVulkanInstanceFunctions() { return (gnInstanceFunctions){ - .createInstance = (PFN_gnCreateInstance)createVulkanInstance, - .destroyInstance = (PFN_gnDestroyInstance)destroyVulkanInstance, ._gnGetPhysicalDevices = getPhysicalDevices, ._gnPhysicalDeviceCanPresentToSurface = deviceCanPresentToSurface, diff --git a/projects/apis/vulkan/src/instance/vulkan_instance.c b/projects/apis/vulkan/src/instance/vulkan_instance.c index 513082c..04a177e 100644 --- a/projects/apis/vulkan/src/instance/vulkan_instance.c +++ b/projects/apis/vulkan/src/instance/vulkan_instance.c @@ -35,7 +35,7 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL vk_debuggerDebugCallback( return VK_TRUE; } -gnReturnCode createVulkanInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance* next) { +gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next) { instance->instance = malloc(sizeof(gnPlatformInstance)); vkStringArrayList extensions = vkStringArrayListCreate(); @@ -101,6 +101,6 @@ gnReturnCode createVulkanInstance(gnInstanceHandle instance, gnInstanceCreateInf return VkResultToGnReturnCode(vkCreateInstance(&createInfo, NULL, &instance->instance->vk_instance)); } -void destroyVulkanInstance(gnInstanceHandle instance, PFN_gnDestroyInstance* next) { +void vulkanDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next) { vkDestroyInstance(instance->instance->vk_instance, NULL); } diff --git a/projects/apis/vulkan/src/instance/vulkan_instance.h b/projects/apis/vulkan/src/instance/vulkan_instance.h index dd4ce80..7d9fac4 100644 --- a/projects/apis/vulkan/src/instance/vulkan_instance.h +++ b/projects/apis/vulkan/src/instance/vulkan_instance.h @@ -14,8 +14,8 @@ typedef struct gnPlatformInstance_t { vkUserData userData; } gnPlatformInstance; -gnReturnCode createVulkanInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance* next); -void destroyVulkanInstance(gnInstanceHandle instance, PFN_gnDestroyInstance* next); +gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next); +void vulkanDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next); typedef const char* vkString; GN_ARRAY_LIST(vkString); diff --git a/projects/loader/src/gryphn_instance_functions.h b/projects/loader/src/gryphn_instance_functions.h index fffd01d..2c5bed0 100644 --- a/projects/loader/src/gryphn_instance_functions.h +++ b/projects/loader/src/gryphn_instance_functions.h @@ -18,13 +18,11 @@ typedef struct gnOutputDeviceInfo gnOutputDeviceInfo; typedef struct gnMacOSWindowSurfaceInfo gnMacOSWindowSurfaceInfo; #endif -typedef gnReturnCode (*PFN_gnCreateInstance)(gnInstanceHandle instance, gnInstanceCreateInfo* info, void* next); -typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstanceHandle instance, void* next); +typedef struct gryphnFunctionLayer gryphnFunctionLayer; +typedef gnReturnCode (*PFN_gnCreateInstance)(gnInstanceHandle instance, gnInstanceCreateInfo* info, gryphnFunctionLayer* next); +typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstanceHandle instance, gryphnFunctionLayer* next); typedef struct gnInstanceFunctions { - PFN_gnCreateInstance createInstance; - PFN_gnDestroyInstance destroyInstance; - gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstanceHandle instance, uint32_t* count); gnBool (*_gnPhysicalDeviceCanPresentToSurface)(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface); diff --git a/projects/loader/src/gryphn_loader.c b/projects/loader/src/gryphn_loader.c index 5f049a3..eebf1d3 100644 --- a/projects/loader/src/gryphn_loader.c +++ b/projects/loader/src/gryphn_loader.c @@ -10,31 +10,47 @@ #include #endif -#include "stdio.h" #include "core/src/instance/gryphn_instance.h" -// load the speedy API functions or something like that -dispatcher_bool loadAPIInstanceFunctions(dispatcher_layer* layer) { - gnRenderingAPI api = *(gnRenderingAPI*)layer->userData; - gnInstanceFunctions* funcs = (gnInstanceFunctions*)layer->function_array; +gryphnInstanceFunctionLayers gryphnLoadAPILayer(gnRenderingAPI api) { switch (api) { - case GN_RENDERINGAPI_NONE: *funcs = (gnInstanceFunctions){ NULL }; + case GN_RENDERINGAPI_NONE: return (gryphnInstanceFunctionLayers){}; #ifdef GN_API_VULKAN - case GN_RENDERINGAPI_VULKAN: *funcs = loadVulkanInstanceFunctions(); + case GN_RENDERINGAPI_VULKAN: return loadVulkanAPILayer(); #endif - case GN_RENDERINGAPI_SOFTWARE: *funcs = (gnInstanceFunctions){ NULL }; - case GN_RENDERINGAPI_DIRECTX11: *funcs = (gnInstanceFunctions){ NULL }; - case GN_RENDERINGAPI_DIRECTX12: *funcs = (gnInstanceFunctions){ NULL }; + case GN_RENDERINGAPI_SOFTWARE: return (gryphnInstanceFunctionLayers){}; + case GN_RENDERINGAPI_DIRECTX11: return (gryphnInstanceFunctionLayers){}; + case GN_RENDERINGAPI_DIRECTX12: return (gryphnInstanceFunctionLayers){}; #ifdef GN_API_OPENGL - case GN_RENDERINGAPI_OPENGL: *funcs = loadOpenGLInstanceFunctions(); + // case GN_RENDERINGAPI_OPENGL: return loadOpenGLInstanceFunctions(); #endif #ifdef GN_API_METAL - case GN_RENDERINGAPI_METAL: *funcs = loadMetalInstanceFunctions(); + // case GN_RENDERINGAPI_METAL: return loadMetalInstanceFunctions(); #endif - default: *funcs = (gnInstanceFunctions){NULL}; + default: return (gryphnInstanceFunctionLayers){}; + } +} + +// load the speedy API functions or something like that +gnInstanceFunctions loadAPIInstanceFunctions(gnRenderingAPI api) { + switch (api) { + case GN_RENDERINGAPI_NONE: return (gnInstanceFunctions){ NULL }; +#ifdef GN_API_VULKAN + case GN_RENDERINGAPI_VULKAN: return loadVulkanInstanceFunctions(); +#endif + + case GN_RENDERINGAPI_SOFTWARE: return (gnInstanceFunctions){ NULL }; + case GN_RENDERINGAPI_DIRECTX11: return (gnInstanceFunctions){ NULL }; + case GN_RENDERINGAPI_DIRECTX12: return (gnInstanceFunctions){ NULL }; +#ifdef GN_API_OPENGL + case GN_RENDERINGAPI_OPENGL: return loadOpenGLInstanceFunctions(); +#endif +#ifdef GN_API_METAL + case GN_RENDERINGAPI_METAL: return loadMetalInstanceFunctions(); +#endif + default: return (gnInstanceFunctions){NULL}; } - return dispatcher_true; } gnDeviceFunctions loadAPIDeviceFunctions(gnRenderingAPI api) { diff --git a/projects/loader/src/gryphn_loader.h b/projects/loader/src/gryphn_loader.h index 936cf14..5fc23c8 100644 --- a/projects/loader/src/gryphn_loader.h +++ b/projects/loader/src/gryphn_loader.h @@ -1,4 +1,5 @@ #pragma once +#include "gryphn_instance_functions.h" #include "gryphn_device_functions.h" #include "gryphn_command_functions.h" #include "gryphn_loader_info.h" @@ -8,6 +9,17 @@ #include "extensions/synchronization/loader/sync_functions.h" #include "extensions/queues/queues_functions.h" +typedef struct gryphnFunctionLayer { + void* function; + struct gryphnFunctionLayer* next; +} gryphnFunctionLayer; + +typedef struct gryphnInstanceFunctionLayers { + gryphnFunctionLayer createInstance; // PFN_gnCreateInstance + gryphnFunctionLayer destroyInstance; // PFN_gnDestroyInstance +} gryphnInstanceFunctionLayers; +gryphnInstanceFunctionLayers gryphnLoadAPILayer(gnRenderingAPI api); + typedef struct loaderLayer { // idk why I sperate these info different classes, I should really shove them in one bit class // they used to be loaded seperatly but I guess there not anymore @@ -31,9 +43,6 @@ GN_ARRAY_LIST(loaderLayer); loaderLayer* loaderGetNextLayer(gnInstance instance); void resetLayer(gnInstance instance); +gnInstanceFunctions loadAPIInstanceFunctions(gnRenderingAPI api); gnSyncExtFunctions loadAPISyncFunctions(gnRenderingAPI api); gnQueueExtFunctions loadAPIQueueFunctions(gnRenderingAPI api); - - - -dispatcher_bool loadAPIInstanceFunctions(dispatcher_layer* layer);