From f7e71b77c2591a273cb3d9b6e18e80315059533a Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Wed, 17 Sep 2025 13:37:50 -0400 Subject: [PATCH] metal physical device properties function --- .../apis/metal/loader/metal_instance_loader.m | 2 + .../metal/src/devices/metal_output_devices.h | 1 + .../metal/src/devices/metal_physical_device.m | 50 +++++++------------ 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/projects/apis/metal/loader/metal_instance_loader.m b/projects/apis/metal/loader/metal_instance_loader.m index 4b1afc0..68d469b 100644 --- a/projects/apis/metal/loader/metal_instance_loader.m +++ b/projects/apis/metal/loader/metal_instance_loader.m @@ -8,6 +8,8 @@ gryphnInstanceFunctionLayers metalLoadAPILayer(void) { .createInstance = metalCreateInstance, .queryDevices = metalQueryDevices, .destroyInstance = metalDestroyInstance, + // .isSuitable = metalIsInstanceSuitable, + .getPhysicalDeviceProperties = metalQueryPhysicalDeviceProperties, .next = NULL }; } diff --git a/projects/apis/metal/src/devices/metal_output_devices.h b/projects/apis/metal/src/devices/metal_output_devices.h index e6017d0..8de2ae5 100644 --- a/projects/apis/metal/src/devices/metal_output_devices.h +++ b/projects/apis/metal/src/devices/metal_output_devices.h @@ -5,6 +5,7 @@ #include typedef id mtlDevice; +gnPhysicalDeviceProperties metalQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers); struct gnPlatformOutputDevice_t { id device; diff --git a/projects/apis/metal/src/devices/metal_physical_device.m b/projects/apis/metal/src/devices/metal_physical_device.m index b3063dd..0a7355d 100644 --- a/projects/apis/metal/src/devices/metal_physical_device.m +++ b/projects/apis/metal/src/devices/metal_physical_device.m @@ -3,39 +3,25 @@ #include "metal_output_devices.h" #include "window_surface/gryphn_surface.h" -// gnPhysicalDevice* getMetalDevices(gnInstanceHandle instance, uint32_t* deviceCount) { -// if (instance == GN_NULL_HANDLE) return NULL; +// i made some educated guesses on these conversions and I dont think they are going to work +// but for now im worried about the MVP +gnPhysicalDeviceType metalDeviceLocationToGryphn(MTLDeviceLocation location) { + switch (location) { + case MTLDeviceLocationBuiltIn: return GN_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU; + case MTLDeviceLocationSlot: return GN_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; + case MTLDeviceLocationExternal: return GN_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; + case MTLDeviceLocationUnspecified: return GN_PHYSICAL_DEVICE_TYPE_FAKED_GPU; //very bad if we get here + } +} -// NSArray *devices = MTLCopyAllDevices(); -// *deviceCount = (uint32_t)[devices count]; -// gnPhysicalDevice* devicesList = (gnPhysicalDevice*)malloc(sizeof(gnPhysicalDevice) * *deviceCount); -// for (uint32_t i = 0; i < *deviceCount; i++) { -// devicesList[i] = (uint64_t)[devices objectAtIndex:0]; -// mtlDevice device = (mtlDevice)devicesList[i]; - - // devicesList[i]->properties.name = gnCreateString([[device name] cStringUsingEncoding:NSUTF8StringEncoding]); - // MTLDeviceLocation deviceLocation = device.locationNumber; - // if (deviceLocation == MTLDeviceLocationBuiltIn) - // devicesList[i]->properties.deviceType = GN_INTEGRATED_DEVICE; - // else if (deviceLocation == MTLDeviceLocationSlot) - // devicesList[i]->properties.deviceType = GN_DEDICATED_DEVICE; - // else if (deviceLocation == MTLDeviceLocationExternal) - // devicesList[i]->properties.deviceType = GN_EXTERNAL_DEVICE; - - // devicesList[i]->features.maxColorSamples = GN_SAMPLE_BIT_1; - // if ([device supportsTextureSampleCount:2]) { devicesList[i]->features.maxColorSamples |= GN_SAMPLE_BIT_2; } else {} - // if ([device supportsTextureSampleCount:4]) { devicesList[i]->features.maxColorSamples |= GN_SAMPLE_BIT_4; } else {} - // if ([device supportsTextureSampleCount:8]) { devicesList[i]->features.maxColorSamples |= GN_SAMPLE_BIT_8; } else {} - // if ([device supportsTextureSampleCount:16]) { devicesList[i]->features.maxColorSamples |= GN_SAMPLE_BIT_16; } else {} - // if ([device supportsTextureSampleCount:32]) { devicesList[i]->features.maxColorSamples |= GN_SAMPLE_BIT_32; } else {} - // devicesList[i]->features.maxDepthSamples = devicesList[i]->features.maxColorSamples; - - // devicesList[i]->features.maxMemoryAllocations = 0x40000000; - // devicesList[i]->features.maxPushConstantSize = 4096; - // } -// [devices release]; -// return devicesList; -// } +gnPhysicalDeviceProperties metalQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) { + return (gnPhysicalDeviceProperties){ + .deviceID = ((mtlDevice)device).registryID, + .deviceName = gnCreateString(((mtlDevice)device).name.UTF8String), + .deviceType = metalDeviceLocationToGryphn(((mtlDevice)device).location), + .driverVersion = ((mtlDevice)device).hash // very bad hack, me should not do this + }; +} gnBool metalCanDevicePresent(gnPhysicalDevice device, gnWindowSurface windowSurface) { if (device == GN_NULL_HANDLE || windowSurface == GN_NULL_HANDLE) return GN_FALSE;