From 4087972149f95cde2e566fa631a05b04e82d8cc8 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Fri, 8 May 2026 00:29:37 -0400 Subject: [PATCH] Simple create metal device --- Gryphn/GryphnLoader/src/device/gryphn_device.c | 11 +++++++++++ Gryphn/GryphnLoader/src/device/gryphn_device.h | 15 +++++++++++++++ Gryphn/GryphnLoader/src/gryphn_handle.h | 1 + .../dispatch/gryphn_device_dispatch_table.h | 7 +++++++ .../dispatch/gryphn_instance_dispatch_table.h | 3 +++ Gryphn/apis/GryphnMetal/src/metal.m | 13 +++++++------ Gryphn/apis/GryphnMetal/src/metal_device.m | 6 ++++++ Gryphn/apis/GryphnMetal/src/metal_functions.h | 2 ++ Gryphn/gryphn.h | 1 + main.cpp | 6 ++++++ 10 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 Gryphn/GryphnLoader/src/device/gryphn_device.c create mode 100644 Gryphn/GryphnLoader/src/device/gryphn_device.h create mode 100644 Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h diff --git a/Gryphn/GryphnLoader/src/device/gryphn_device.c b/Gryphn/GryphnLoader/src/device/gryphn_device.c new file mode 100644 index 0000000..55f2b25 --- /dev/null +++ b/Gryphn/GryphnLoader/src/device/gryphn_device.c @@ -0,0 +1,11 @@ +#include "gryphn_device.h" +#include "instance/gryphn_instance.h" +#include "stdio.h" +#include "stdlib.h" + +gnReturnCode gnCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice* device) { + gnDevice newDevice = malloc(sizeof(gnDevice_t)); + newDevice->instance = instance; + *device = newDevice; + return instance->dispatchTable.createDevice(instance, createInfo, newDevice); +} diff --git a/Gryphn/GryphnLoader/src/device/gryphn_device.h b/Gryphn/GryphnLoader/src/device/gryphn_device.h new file mode 100644 index 0000000..c734afc --- /dev/null +++ b/Gryphn/GryphnLoader/src/device/gryphn_device.h @@ -0,0 +1,15 @@ +#pragma once +#include "gryphn_physical_device.h" +#include "instance/dispatch/gryphn_device_dispatch_table.h" + +typedef struct gnDeviceCreateInfo { + gnPhysicalDevice physicalDevice; +} gnDeviceCreateInfo; + +typedef struct gnDevice_t { + gnDeviceDispatchTable dispatchTable; + gnInstance instance; + void* internalData; +} gnDevice_t; + +gnReturnCode gnCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice* device); diff --git a/Gryphn/GryphnLoader/src/gryphn_handle.h b/Gryphn/GryphnLoader/src/gryphn_handle.h index bb75b83..660a71a 100644 --- a/Gryphn/GryphnLoader/src/gryphn_handle.h +++ b/Gryphn/GryphnLoader/src/gryphn_handle.h @@ -5,3 +5,4 @@ GN_HANDLE(gnInstance); GN_HANDLE(gnPhysicalDevice); +GN_HANDLE(gnDevice); diff --git a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h new file mode 100644 index 0000000..95024dd --- /dev/null +++ b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h @@ -0,0 +1,7 @@ +#pragma once +#include "gryphn_handle.h" + + +typedef struct gnDeviceDispatchTable { + +} gnDeviceDispatchTable; diff --git a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h index 5f84ef9..5626a6b 100644 --- a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h +++ b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h @@ -1,13 +1,16 @@ #pragma once #include "gryphn_handle.h" typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties; +typedef struct gnDeviceCreateInfo gnDeviceCreateInfo; typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance); typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*); typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*); +typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice); typedef struct gnInstanceDispatchTable { PFN_gnDestroyInstance destroyInstance; PFN_enumeratePhysicalDevices enumeratePhysicalDevices; PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties; + PFN_gnCreateDevice createDevice; } gnInstanceDispatchTable; diff --git a/Gryphn/apis/GryphnMetal/src/metal.m b/Gryphn/apis/GryphnMetal/src/metal.m index 6b78c9f..633ce6d 100644 --- a/Gryphn/apis/GryphnMetal/src/metal.m +++ b/Gryphn/apis/GryphnMetal/src/metal.m @@ -5,12 +5,12 @@ #include "metal_functions.h" extern "C" uint32_t gnInternalIsApiSupported(gnVersion version) { - if (version != gnCreateVersion(1, 0, 0)) return 0; - id testDevice = MTLCreateSystemDefaultDevice(); - if (testDevice == nil) - return 0; - [testDevice release]; - return 1; + if (version != gnCreateVersion(1, 0, 0)) return 0; + id testDevice = MTLCreateSystemDefaultDevice(); + if (testDevice == nil) + return 0; + [testDevice release]; + return 1; } gnReturnCode destroyBackend(gnInstance instance) { @@ -21,5 +21,6 @@ extern "C" gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* i instance->dispatchTable.destroyInstance = destroyBackend; instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices; instance->dispatchTable.getPhysicalDeviceProperties = metalGetPhysicalDeviceProperties; + instance->dispatchTable.createDevice = metalCreateDevice; return GN_SUCCESS; } diff --git a/Gryphn/apis/GryphnMetal/src/metal_device.m b/Gryphn/apis/GryphnMetal/src/metal_device.m index a85a455..4326108 100644 --- a/Gryphn/apis/GryphnMetal/src/metal_device.m +++ b/Gryphn/apis/GryphnMetal/src/metal_device.m @@ -3,6 +3,7 @@ #include "stdio.h" #include "stdint.h" #include "device/gryphn_physical_device.h" +#include "device/gryphn_device.h" gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) { NSArray>* mtlDevices = MTLCopyAllDevices(); @@ -54,3 +55,8 @@ gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysica properties->deviceName[255] = '\0'; return GN_SUCCESS; } + +gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device) { + device->internalData = createInfo->physicalDevice->internalData; + return GN_SUCCESS; +} diff --git a/Gryphn/apis/GryphnMetal/src/metal_functions.h b/Gryphn/apis/GryphnMetal/src/metal_functions.h index 7c0b108..2fd6ecc 100644 --- a/Gryphn/apis/GryphnMetal/src/metal_functions.h +++ b/Gryphn/apis/GryphnMetal/src/metal_functions.h @@ -3,6 +3,8 @@ #include "gryphn_return_code.h" #include "stdint.h" #include "device/gryphn_physical_device.h" +#include "device/gryphn_device.h" gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices); gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties); +gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device); diff --git a/Gryphn/gryphn.h b/Gryphn/gryphn.h index 213e1e5..ec39753 100644 --- a/Gryphn/gryphn.h +++ b/Gryphn/gryphn.h @@ -5,6 +5,7 @@ extern "C" { #endif #include "GryphnLoader/src/instance/gryphn_instance.h" #include "GryphnLoader/src/device/gryphn_physical_device.h" +#include "GryphnLoader/src/device/gryphn_device.h" #ifdef __cplusplus } #endif diff --git a/main.cpp b/main.cpp index ef1d7d3..1822793 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,7 @@ gnVersion version = gnCreateVersion(1, 0, 0); gnInstance instance; +gnDevice device; void createInstance() { uint32_t backendCount = 0; @@ -52,6 +53,11 @@ void createDevice() { gnGetPhysicalDeviceProperties(devices[i], &properties); std::cout << "Name: " << properties.deviceName << "\n"; } + + gnDeviceCreateInfo createInfo = { + .physicalDevice = devices[0] + }; + CHECK(gnCreateDevice(instance, &createInfo, &device)); } int main() {