From 988333c0ac370737e1905ab7b8f18399ee254420 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Sun, 3 Aug 2025 10:59:00 -0400 Subject: [PATCH] essentially finish the loader rewrite --- projects/apis/metal/src/instance/metal_instance.h | 4 ++-- projects/apis/metal/src/instance/metal_instance.m | 4 ++-- projects/apis/vulkan/loader/vulkan_instance_loader.c | 4 ++-- projects/apis/vulkan/src/instance/vulkan_instance.c | 6 ++++-- projects/apis/vulkan/src/instance/vulkan_instance.h | 4 ++-- projects/core/src/instance/gryphn_instance.c | 9 ++++++--- projects/loader/src/gryphn_instance_functions.h | 11 ++++++++--- projects/loader/src/gryphn_loader.h | 4 ++-- projects/loader/src/gryphn_loader_helpers.h | 6 ++++++ .../function_loader/src/instance_functions.c | 12 ++++++------ .../function_loader/src/instance_functions.h | 4 ++-- 11 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 projects/loader/src/gryphn_loader_helpers.h diff --git a/projects/apis/metal/src/instance/metal_instance.h b/projects/apis/metal/src/instance/metal_instance.h index df0c732..595fed6 100644 --- a/projects/apis/metal/src/instance/metal_instance.h +++ b/projects/apis/metal/src/instance/metal_instance.h @@ -7,5 +7,5 @@ typedef struct gnPlatformInstance_t { NSView* metalContentView; } gnPlatformInstance; -gnReturnCode metalCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next); -void metalDestroyInstance(gnInstance instance, gryphnFunctionLayer* next); +gnReturnCode metalCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance_layer* next); +void metalDestroyInstance(gnInstance instance, PFN_gnDestroyInstance_layer* next); diff --git a/projects/apis/metal/src/instance/metal_instance.m b/projects/apis/metal/src/instance/metal_instance.m index c692d09..0002d6f 100644 --- a/projects/apis/metal/src/instance/metal_instance.m +++ b/projects/apis/metal/src/instance/metal_instance.m @@ -1,10 +1,10 @@ #include "metal_instance.h" // metal instances are kinda useless -gnReturnCode metalCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next) { +gnReturnCode metalCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance_layer* next) { if (instance->instance == NULL) instance->instance = malloc(sizeof(gnPlatformInstance)); return GN_SUCCESS; } -void metalDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next) { +void metalDestroyInstance(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* next) { free(instance->instance); } diff --git a/projects/apis/vulkan/loader/vulkan_instance_loader.c b/projects/apis/vulkan/loader/vulkan_instance_loader.c index 3407b8b..fb0b7cc 100644 --- a/projects/apis/vulkan/loader/vulkan_instance_loader.c +++ b/projects/apis/vulkan/loader/vulkan_instance_loader.c @@ -6,8 +6,8 @@ gryphnInstanceFunctionLayers loadVulkanAPILayer() { return (gryphnInstanceFunctionLayers) { - .createInstance = {vulkanCreateInstance, NULL}, - .destroyInstance = {vulkanDestroyInstance, NULL} + .createInstance = { vulkanCreateInstance, NULL }, + .destroyInstance = { vulkanDestroyInstance, NULL } }; } diff --git a/projects/apis/vulkan/src/instance/vulkan_instance.c b/projects/apis/vulkan/src/instance/vulkan_instance.c index 04a177e..13346be 100644 --- a/projects/apis/vulkan/src/instance/vulkan_instance.c +++ b/projects/apis/vulkan/src/instance/vulkan_instance.c @@ -1,6 +1,8 @@ #include "vulkan_instance.h" #include "vulkan_result_converter.h" +#include "stdio.h" + static VKAPI_ATTR VkBool32 VKAPI_CALL vk_debuggerDebugCallback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, @@ -35,7 +37,7 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL vk_debuggerDebugCallback( return VK_TRUE; } -gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next) { +gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance_layer* next) { instance->instance = malloc(sizeof(gnPlatformInstance)); vkStringArrayList extensions = vkStringArrayListCreate(); @@ -101,6 +103,6 @@ gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInf return VkResultToGnReturnCode(vkCreateInstance(&createInfo, NULL, &instance->instance->vk_instance)); } -void vulkanDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next) { +void vulkanDestroyInstance(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* 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 7d9fac4..2e949a9 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 vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnFunctionLayer* next); -void vulkanDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next); +gnReturnCode vulkanCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, PFN_gnCreateInstance_layer* next); +void vulkanDestroyInstance(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* next); typedef const char* vkString; GN_ARRAY_LIST(vkString); diff --git a/projects/core/src/instance/gryphn_instance.c b/projects/core/src/instance/gryphn_instance.c index d2f18e3..d92e499 100644 --- a/projects/core/src/instance/gryphn_instance.c +++ b/projects/core/src/instance/gryphn_instance.c @@ -4,6 +4,9 @@ #include "loader/src/gryphn_extension_loader.h" #include "loader/src/gryphn_loader.h" #include "loader/src/gryphn_loader.h" +#include "stdio.h" + +#include "apis/vulkan/loader/vulkan_loader.h" // this implementation of gnCreateInstance cannot return GN_UNLOADED_LAYER gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceCreateInfo* info) { @@ -11,7 +14,7 @@ gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceCreateInfo* (*instance)->hasDebugger = GN_FALSE; (*instance)->layers = loaderLayerArrayListCreate(); - // (*instance)->functions = + (*instance)->functions = gryphnLoadAPILayer(info->coreAPI); loaderLayerArrayListAdd(&(*instance)->layers, loadLayer((loaderInfo){ .api = info->coreAPI, @@ -45,11 +48,11 @@ gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceCreateInfo* for (int i = 0; i < (*instance)->layers.count; i++) (*instance)->layers.data[i].layerIndex = i; (*instance)->callingLayer = &(*instance)->layers.data[(*instance)->layers.count - 1]; if (unsupportedExtension) return GN_UNLOADED_EXTENSION; - return (*(PFN_gnCreateInstance*)(*instance)->functions.createInstance.function)(*instance, info, (*instance)->functions.createInstance.next); + return (*instance)->functions.createInstance.func(*instance, info, NULL); } void gnDestroyInstance(gnInstanceHandle* instance) { if (instance == GN_NULL_HANDLE) return; - (*(PFN_gnDestroyInstance*)(*instance)->functions.destroyInstance.function)(*instance, (*instance)->functions.destroyInstance.next); + (*instance)->functions.destroyInstance.func(*instance, NULL); *instance = GN_NULL_HANDLE; } diff --git a/projects/loader/src/gryphn_instance_functions.h b/projects/loader/src/gryphn_instance_functions.h index 2c5bed0..28ba6e0 100644 --- a/projects/loader/src/gryphn_instance_functions.h +++ b/projects/loader/src/gryphn_instance_functions.h @@ -3,6 +3,7 @@ #include "core/gryphn_return_code.h" #include "utils/gryphn_bool.h" #include "gryphn_handles.h" +#include "gryphn_loader_helpers.h" typedef struct gnInstanceCreateInfo gnInstanceCreateInfo; typedef struct gnSurfaceDetails gnSurfaceDetails; @@ -18,9 +19,13 @@ typedef struct gnOutputDeviceInfo gnOutputDeviceInfo; typedef struct gnMacOSWindowSurfaceInfo gnMacOSWindowSurfaceInfo; #endif -typedef struct gryphnFunctionLayer gryphnFunctionLayer; -typedef gnReturnCode (*PFN_gnCreateInstance)(gnInstanceHandle instance, gnInstanceCreateInfo* info, gryphnFunctionLayer* next); -typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstanceHandle instance, gryphnFunctionLayer* next); +typedef struct PFN_gnCreateInstance_layer PFN_gnCreateInstance_layer; +typedef gnReturnCode (*PFN_gnCreateInstance)(gnInstanceHandle instance, gnInstanceCreateInfo* info, PFN_gnCreateInstance_layer* next); +gryphnFunctionLayer(PFN_gnCreateInstance); + +typedef struct PFN_gnDestroyInstance_layer PFN_gnDestroyInstance_layer; +typedef void (*PFN_gnDestroyInstance)(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* next); +gryphnFunctionLayer(PFN_gnDestroyInstance); typedef struct gnInstanceFunctions { gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstanceHandle instance, uint32_t* count); diff --git a/projects/loader/src/gryphn_loader.h b/projects/loader/src/gryphn_loader.h index aba19a5..95cc451 100644 --- a/projects/loader/src/gryphn_loader.h +++ b/projects/loader/src/gryphn_loader.h @@ -14,8 +14,8 @@ typedef struct gryphnFunctionLayer { } gryphnFunctionLayer; typedef struct gryphnInstanceFunctionLayers { - gryphnFunctionLayer createInstance; // PFN_gnCreateInstance - gryphnFunctionLayer destroyInstance; // PFN_gnDestroyInstance + PFN_gnCreateInstance_layer createInstance; + PFN_gnDestroyInstance_layer destroyInstance; } gryphnInstanceFunctionLayers; gryphnInstanceFunctionLayers gryphnLoadAPILayer(gnRenderingAPI api); diff --git a/projects/loader/src/gryphn_loader_helpers.h b/projects/loader/src/gryphn_loader_helpers.h new file mode 100644 index 0000000..ee117c2 --- /dev/null +++ b/projects/loader/src/gryphn_loader_helpers.h @@ -0,0 +1,6 @@ +#pragma once + +#define gryphnFunctionLayer(function) typedef struct function##_layer { \ +function func;\ +struct function##_layer* next; \ +} function##_layer;\ diff --git a/projects/validation_layers/function_loader/src/instance_functions.c b/projects/validation_layers/function_loader/src/instance_functions.c index 2b61eeb..d3529ef 100644 --- a/projects/validation_layers/function_loader/src/instance_functions.c +++ b/projects/validation_layers/function_loader/src/instance_functions.c @@ -4,23 +4,23 @@ #include "core/src/output_device/gryphn_output_device.h" #include "core/src/window_surface/gryphn_surface.h" -gnReturnCode checkCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* info, gryphnFunctionLayer* next) { - if (next->function == NULL) { +gnReturnCode checkCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* info, PFN_gnCreateInstance_layer* next) { + if (next->func == NULL) { gnDebuggerSetErrorMessage(instance->debugger, (gnMessageData){ .message = gnCreateString("Failed to load gnCreateInstance this indicates a bug within gryphn") }); return GN_FAILED_TO_LOAD_FUNCTION; } - return (*(PFN_gnCreateInstance*)next->function)(instance, info, next->next); + return (*(PFN_gnCreateInstance*)next->func)(instance, info, next->next); } -void checkDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next) { - if (next->function == NULL) { +void checkDestroyInstance(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* next) { + if (next->func == NULL) { gnDebuggerSetErrorMessage(instance->debugger, (gnMessageData){ .message = gnCreateString("Failed to load gnDestroyInstance this indicates a bug within gryphn") }); } - (*(PFN_gnDestroyInstance*)next->function)(instance, next->next); + (*(PFN_gnDestroyInstance*)next->func)(instance, next->next); } gnPhysicalDevice* checkGetPhysicalDevices(gnInstanceHandle instance, uint32_t* count) { diff --git a/projects/validation_layers/function_loader/src/instance_functions.h b/projects/validation_layers/function_loader/src/instance_functions.h index 1fdecab..9201dd1 100644 --- a/projects/validation_layers/function_loader/src/instance_functions.h +++ b/projects/validation_layers/function_loader/src/instance_functions.h @@ -2,8 +2,8 @@ #include "core/src/instance/gryphn_instance.h" #include -gnReturnCode checkCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* info, gryphnFunctionLayer* next); -void checkDestroyInstance(gnInstanceHandle instance, gryphnFunctionLayer* next); +gnReturnCode checkCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* info, PFN_gnCreateInstance_layer* next); +void checkDestroyInstance(gnInstanceHandle instance, PFN_gnDestroyInstance_layer* next); gnPhysicalDevice* checkGetPhysicalDevices(gnInstanceHandle instance, uint32_t* count); gnBool checkCanDevicePresent(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface);