Simple create metal device

This commit is contained in:
2026-05-08 00:29:37 -04:00
parent cf212dd9ad
commit 4087972149
10 changed files with 59 additions and 6 deletions
@@ -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);
}
@@ -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);
+1
View File
@@ -5,3 +5,4 @@
GN_HANDLE(gnInstance); GN_HANDLE(gnInstance);
GN_HANDLE(gnPhysicalDevice); GN_HANDLE(gnPhysicalDevice);
GN_HANDLE(gnDevice);
@@ -0,0 +1,7 @@
#pragma once
#include "gryphn_handle.h"
typedef struct gnDeviceDispatchTable {
} gnDeviceDispatchTable;
@@ -1,13 +1,16 @@
#pragma once #pragma once
#include "gryphn_handle.h" #include "gryphn_handle.h"
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties; typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
typedef struct gnDeviceCreateInfo gnDeviceCreateInfo;
typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance); typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance);
typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*); typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*);
typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*); typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*);
typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice);
typedef struct gnInstanceDispatchTable { typedef struct gnInstanceDispatchTable {
PFN_gnDestroyInstance destroyInstance; PFN_gnDestroyInstance destroyInstance;
PFN_enumeratePhysicalDevices enumeratePhysicalDevices; PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties; PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties;
PFN_gnCreateDevice createDevice;
} gnInstanceDispatchTable; } gnInstanceDispatchTable;
+1
View File
@@ -21,5 +21,6 @@ extern "C" gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* i
instance->dispatchTable.destroyInstance = destroyBackend; instance->dispatchTable.destroyInstance = destroyBackend;
instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices; instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices;
instance->dispatchTable.getPhysicalDeviceProperties = metalGetPhysicalDeviceProperties; instance->dispatchTable.getPhysicalDeviceProperties = metalGetPhysicalDeviceProperties;
instance->dispatchTable.createDevice = metalCreateDevice;
return GN_SUCCESS; return GN_SUCCESS;
} }
@@ -3,6 +3,7 @@
#include "stdio.h" #include "stdio.h"
#include "stdint.h" #include "stdint.h"
#include "device/gryphn_physical_device.h" #include "device/gryphn_physical_device.h"
#include "device/gryphn_device.h"
gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) { gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) {
NSArray<id<MTLDevice>>* mtlDevices = MTLCopyAllDevices(); NSArray<id<MTLDevice>>* mtlDevices = MTLCopyAllDevices();
@@ -54,3 +55,8 @@ gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysica
properties->deviceName[255] = '\0'; properties->deviceName[255] = '\0';
return GN_SUCCESS; return GN_SUCCESS;
} }
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device) {
device->internalData = createInfo->physicalDevice->internalData;
return GN_SUCCESS;
}
@@ -3,6 +3,8 @@
#include "gryphn_return_code.h" #include "gryphn_return_code.h"
#include "stdint.h" #include "stdint.h"
#include "device/gryphn_physical_device.h" #include "device/gryphn_physical_device.h"
#include "device/gryphn_device.h"
gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices); gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices);
gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties); gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device);
+1
View File
@@ -5,6 +5,7 @@ extern "C" {
#endif #endif
#include "GryphnLoader/src/instance/gryphn_instance.h" #include "GryphnLoader/src/instance/gryphn_instance.h"
#include "GryphnLoader/src/device/gryphn_physical_device.h" #include "GryphnLoader/src/device/gryphn_physical_device.h"
#include "GryphnLoader/src/device/gryphn_device.h"
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
+6
View File
@@ -13,6 +13,7 @@
gnVersion version = gnCreateVersion(1, 0, 0); gnVersion version = gnCreateVersion(1, 0, 0);
gnInstance instance; gnInstance instance;
gnDevice device;
void createInstance() { void createInstance() {
uint32_t backendCount = 0; uint32_t backendCount = 0;
@@ -52,6 +53,11 @@ void createDevice() {
gnGetPhysicalDeviceProperties(devices[i], &properties); gnGetPhysicalDeviceProperties(devices[i], &properties);
std::cout << "Name: " << properties.deviceName << "\n"; std::cout << "Name: " << properties.deviceName << "\n";
} }
gnDeviceCreateInfo createInfo = {
.physicalDevice = devices[0]
};
CHECK(gnCreateDevice(instance, &createInfo, &device));
} }
int main() { int main() {