From 1a4101bf4d553a982ffb438cd9197b85e405e92c Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Sun, 29 Jun 2025 08:43:58 -0400 Subject: [PATCH] load all instance functions --- .../apis/metal/loader/metal_instance_loader.m | 21 +++++++++++-------- .../metal/src/devices/metal_output_device.m | 6 +++--- .../metal/src/devices/metal_output_devices.h | 7 +++++++ .../metal/src/devices/metal_physical_device.m | 4 ++-- .../apis/metal/src/instance/metal_instance.h | 4 ++++ .../apis/metal/src/instance/metal_instance.m | 10 +++------ .../apis/metal/src/surface/metal_surface.h | 4 ++++ .../apis/metal/src/surface/metal_surface.m | 6 +++--- .../loader/instance_functions.c | 8 ++++++- 9 files changed, 45 insertions(+), 25 deletions(-) diff --git a/projects/apis/metal/loader/metal_instance_loader.m b/projects/apis/metal/loader/metal_instance_loader.m index a156710..eaeef0d 100644 --- a/projects/apis/metal/loader/metal_instance_loader.m +++ b/projects/apis/metal/loader/metal_instance_loader.m @@ -1,15 +1,18 @@ #include "metal_loader.h" +#include "instance/metal_instance.h" +#include "surface/metal_surface.h" +#include "devices/metal_output_devices.h" gnInstanceFunctions loadMetalInstanceFunctions() { return (gnInstanceFunctions){ - ._gnCreateInstance = NULL, - ._gnDestroyInstance = NULL, - ._gnGetPhysicalDevices = NULL, - ._gnQueueCanPresentToSurface = NULL, - ._gnCreateOutputDevice = NULL, - ._gnDestroyOutputDevice = NULL, - ._gnCreateMacOSWindowSurface = NULL, - ._gnDestroyWindowSurface = NULL, - ._gnGetSurfaceDetails = NULL + ._gnCreateInstance = createMetalInstance, + ._gnDestroyInstance = destroyMetalInstance, + ._gnGetPhysicalDevices = getMetalDevices, + ._gnQueueCanPresentToSurface = metalCanQueuePresentToSurface, + ._gnCreateOutputDevice = createMetalOutputDevice, + ._gnDestroyOutputDevice = destroyMetalOutputDevice, + ._gnCreateMacOSWindowSurface = createMetalSurface, + ._gnDestroyWindowSurface = destroyMetalWindowSurface, + ._gnGetSurfaceDetails = getMetalSurfaceDetails }; } diff --git a/projects/apis/metal/src/devices/metal_output_device.m b/projects/apis/metal/src/devices/metal_output_device.m index 1031c65..11df6d5 100644 --- a/projects/apis/metal/src/devices/metal_output_device.m +++ b/projects/apis/metal/src/devices/metal_output_device.m @@ -5,7 +5,7 @@ #include "instance/gryphn_instance.h" #include -gnReturnCode gnCreateOutputDeviceFn(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { +gnReturnCode createMetalOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { outputDevice->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); outputDevice->outputDevice->device = deviceInfo.physicalDevice.physicalDevice->device.retain; outputDevice->outputDevice->transferQueue = outputDevice->outputDevice->device.newCommandQueue; @@ -18,11 +18,11 @@ gnReturnCode gnCreateOutputDeviceFn(gnOutputDeviceHandle outputDevice, gnInstanc return GN_SUCCESS; } -void gnWaitForDeviceFn(gnOutputDeviceHandle device) { +void waitForMetalDevice(gnOutputDeviceHandle device) { [device->outputDevice->executingCommandBuffer waitUntilCompleted]; } -void gnDestroyOutputDeviceFn(gnOutputDeviceHandle device) { +void destroyMetalOutputDevice(gnOutputDeviceHandle device) { // for (int i = 0; i < device->outputDevice->queueCount; i++) { // [device->outputDevice->queues[i] release]; // } diff --git a/projects/apis/metal/src/devices/metal_output_devices.h b/projects/apis/metal/src/devices/metal_output_devices.h index ed291db..4960bab 100644 --- a/projects/apis/metal/src/devices/metal_output_devices.h +++ b/projects/apis/metal/src/devices/metal_output_devices.h @@ -16,3 +16,10 @@ struct gnPlatformOutputDevice_t { id transferQueue; // id framebuffer; } gnPlatformOutputDevice; + +gnPhysicalDevice* getMetalDevices(gnInstanceHandle instance, uint32_t* deviceCount); +gnBool metalCanQueuePresentToSurface(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurface windowSurface); + +gnReturnCode createMetalOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); +void waitForMetalDevice(gnOutputDeviceHandle device); +void destroyMetalOutputDevice(gnOutputDeviceHandle device); diff --git a/projects/apis/metal/src/devices/metal_physical_device.m b/projects/apis/metal/src/devices/metal_physical_device.m index 404de5d..01aefd2 100644 --- a/projects/apis/metal/src/devices/metal_physical_device.m +++ b/projects/apis/metal/src/devices/metal_physical_device.m @@ -3,7 +3,7 @@ #include "metal_output_devices.h" #include "window_surface/gryphn_surface.h" -gnPhysicalDevice* gnGetPhysicalDevicesFn(gnInstanceHandle instance, uint32_t* deviceCount) { +gnPhysicalDevice* getMetalDevices(gnInstanceHandle instance, uint32_t* deviceCount) { NSArray *devices = MTLCopyAllDevices(); *deviceCount = [devices count]; gnPhysicalDevice* devicesList = (gnPhysicalDevice*)malloc(sizeof(gnPhysicalDevice) * *deviceCount); @@ -34,6 +34,6 @@ gnPhysicalDevice* gnGetPhysicalDevicesFn(gnInstanceHandle instance, uint32_t* de return devicesList; } -gnBool gnQueueCanPresentToSurfaceFn(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurface windowSurface) { +gnBool metalCanQueuePresentToSurface(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurface windowSurface) { return gnTrue; // I belive that a window should always be able to present to a surface in metal } diff --git a/projects/apis/metal/src/instance/metal_instance.h b/projects/apis/metal/src/instance/metal_instance.h index 38be4cf..e3edc54 100644 --- a/projects/apis/metal/src/instance/metal_instance.h +++ b/projects/apis/metal/src/instance/metal_instance.h @@ -1,7 +1,11 @@ #pragma once #include #include +#include "core/src/instance/gryphn_instance.h" typedef struct gnPlatformInstance_t { NSView* metalContentView; } gnPlatformInstance; + +gnReturnCode createMetalInstance(gnInstanceHandle instance, gnInstanceInfo instanceInfo); +void destroyMetalInstance(gnInstance instance); diff --git a/projects/apis/metal/src/instance/metal_instance.m b/projects/apis/metal/src/instance/metal_instance.m index ba801fd..041a4d6 100644 --- a/projects/apis/metal/src/instance/metal_instance.m +++ b/projects/apis/metal/src/instance/metal_instance.m @@ -1,14 +1,10 @@ -#include -#include #include "metal_instance.h" -// #include "bridge/metal_bridge.h" - -gnReturnCode gnCreateInstanceFn(gnInstanceHandle instance, gnInstanceInfo instanceInfo) { +// metal instances are kinda useless +gnReturnCode createMetalInstance(gnInstanceHandle instance, gnInstanceInfo instanceInfo) { if (instance->instance == NULL) instance->instance = malloc(sizeof(gnPlatformInstance)); return GN_SUCCESS; } - -void gnDestroyInstanceFn(gnInstanceHandle instance) { +void destroyMetalInstance(gnInstance instance) { free(instance->instance); } diff --git a/projects/apis/metal/src/surface/metal_surface.h b/projects/apis/metal/src/surface/metal_surface.h index fc83e8a..1157113 100644 --- a/projects/apis/metal/src/surface/metal_surface.h +++ b/projects/apis/metal/src/surface/metal_surface.h @@ -9,3 +9,7 @@ typedef struct gnPlatformWindowSurface_t { MTLPixelFormat mtlGryphnFormatToVulkanFormat(gnImageFormat format); CGColorSpaceRef mtlGryphnColorSpaceToVulkanColorSpace(gnColorSpace colorSpace); + +gnReturnCode createMetalSurface(gnWindowSurface windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo); +gnSurfaceDetails getMetalSurfaceDetails(gnWindowSurface windowSurface, gnPhysicalDevice device); +void destroyMetalWindowSurface(gnWindowSurface windowSurface); diff --git a/projects/apis/metal/src/surface/metal_surface.m b/projects/apis/metal/src/surface/metal_surface.m index 6a0a428..4238334 100644 --- a/projects/apis/metal/src/surface/metal_surface.m +++ b/projects/apis/metal/src/surface/metal_surface.m @@ -8,17 +8,17 @@ #import #import -gnReturnCode gnCreateMacOSWindowSurfaceFn(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo) { +gnReturnCode createMetalSurface(gnWindowSurface windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo) { windowSurface->windowSurface = malloc(sizeof(gnPlatformWindowSurface)); windowSurface->windowSurface->layer = createInfo.layer; return GN_SUCCESS; } -void gnDestroyWindowSurfaceFn(struct gnWindowSurface_t *windowSurface) { +void destroyMetalWindowSurface(gnWindowSurface windowSurface) { free(windowSurface->windowSurface); } -gnSurfaceDetails gnGetSurfaceDetailsFn( +gnSurfaceDetails getMetalSurfaceDetails( gnWindowSurface windowSurface, gnPhysicalDevice device ) { gnSurfaceDetails surfaceDetails; diff --git a/projects/validation_layers/function_loader/loader/instance_functions.c b/projects/validation_layers/function_loader/loader/instance_functions.c index 2adf0b8..cb18bf0 100644 --- a/projects/validation_layers/function_loader/loader/instance_functions.c +++ b/projects/validation_layers/function_loader/loader/instance_functions.c @@ -73,7 +73,13 @@ void checkDestroyOutputDevice(gnOutputDeviceHandle device) { gnReturnCode checkCreateSurfaceMacOS(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo) { loaderLayer* nextLayer = loaderGetNextLayer(instance); - if (nextLayer->instanceFunctions._gnCreateMacOSWindowSurface == NULL) { return GN_FAILED_TO_LOAD_FUNCTION; } + if (nextLayer->instanceFunctions._gnCreateMacOSWindowSurface == NULL) { + gnDebuggerSetErrorMessage(instance->debugger, (gnMessageData){ + .message = gnCreateString("Failed to load create window surface function") + }); + resetLayer(instance); + return GN_FAILED_TO_LOAD_FUNCTION; + } return nextLayer->instanceFunctions._gnCreateMacOSWindowSurface(windowSurface, instance, createInfo); }