enumerate physical device properties

This commit is contained in:
2026-05-07 21:43:19 -04:00
parent b93fd9cfec
commit cf212dd9ad
8 changed files with 87 additions and 5 deletions
@@ -5,3 +5,7 @@
gnReturnCode gnEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) {
return instance->dispatchTable.enumeratePhysicalDevices(instance, deviceCount, devices);
}
gnReturnCode gnGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties) {
return device->instance->dispatchTable.getPhysicalDeviceProperties(device, properties);
}
@@ -2,5 +2,34 @@
#include "gryphn_handle.h"
#include "gryphn_return_code.h"
#include "stdint.h"
#include "instance/gryphn_application_info.h"
typedef enum gnPhysicalDeviceType {
GN_PHYSICAL_DEVICE_TYPE_CPU = 1,
GN_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 2,
GN_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 3,
GN_PHYSICAL_DEVICE_TYPE_EXTERNAL_GPU = 4,
GN_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 5,
GN_PHYSICAL_DEVICE_TYPE_OTHER = 6,
} gnPhysicalDeviceType;
// typedef struct gnPhysicalDeviceLimits {
// } gnPhysicalDeviceLimits;
typedef struct gnPhysicalDeviceProperties {
gnVersion apiVersion;
uint32_t vendorID;
uint32_t deviceID;
gnPhysicalDeviceType deviceType;
char deviceName[256];
// gnPhysicalDeviceLimits limits;
} gnPhysicalDeviceProperties;
typedef struct gnPhysicalDevice_t {
gnInstance instance;
void* internalData;
} gnPhysicalDevice_t;
gnReturnCode gnEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices);
gnReturnCode gnGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
+1 -1
View File
@@ -4,4 +4,4 @@
#define GN_IMPLEMENTATION_HANDLE(type) typedef void* type
GN_HANDLE(gnInstance);
GN_IMPLEMENTATION_HANDLE(gnPhysicalDevice);
GN_HANDLE(gnPhysicalDevice);
@@ -1,11 +1,13 @@
#pragma once
#include "gryphn_handle.h"
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance);
typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*);
typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*);
typedef struct gnInstanceDispatchTable {
PFN_gnDestroyInstance destroyInstance;
PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties;
} gnInstanceDispatchTable;
+1
View File
@@ -20,5 +20,6 @@ gnReturnCode destroyBackend(gnInstance instance) {
extern "C" gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
instance->dispatchTable.destroyInstance = destroyBackend;
instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices;
instance->dispatchTable.getPhysicalDeviceProperties = metalGetPhysicalDeviceProperties;
return GN_SUCCESS;
}
+42 -2
View File
@@ -2,6 +2,7 @@
#include "metal_functions.h"
#include "stdio.h"
#include "stdint.h"
#include "device/gryphn_physical_device.h"
gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) {
NSArray<id<MTLDevice>>* mtlDevices = MTLCopyAllDevices();
@@ -10,7 +11,46 @@ gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* device
if (devices == NULL)
return GN_SUCCESS;
for (uint32_t i = 0; i < *deviceCount; i++)
devices[i] = (gnPhysicalDevice)mtlDevices[i];
for (uint32_t i = 0; i < *deviceCount; i++) {
devices[i] = (gnPhysicalDevice)malloc(sizeof(gnPhysicalDevice_t));
devices[i]->instance = instance;
devices[i]->internalData = mtlDevices[i];
}
return GN_SUCCESS;
}
gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties) {
id<MTLDevice> mtlDevice = (id<MTLDevice>)device->internalData;
properties->apiVersion = gnCreateVersion(1, 0, 0);
if ([[mtlDevice name] containsString:@"Apple"]) {
properties->vendorID = 0x106B;
} else if ([[mtlDevice name] containsString:@"Intel"]) {
properties->vendorID = 0x8086;
} else if ([[mtlDevice name] containsString:@"AMD"] || [[mtlDevice name] containsString:@"Radeon"]) {
properties->vendorID = 0x1002;
} else {
properties->vendorID = 0;
}
if (@available(macOS 10.13, *)) {
properties->deviceID = (uint32_t)[mtlDevice registryID];
} else {
properties->deviceID = 0;
}
if ([mtlDevice isRemovable])
properties->deviceType = GN_PHYSICAL_DEVICE_TYPE_EXTERNAL_GPU;
else if ([mtlDevice isLowPower])
properties->deviceType = GN_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
else if (![mtlDevice isLowPower] && ![mtlDevice hasUnifiedMemory])
properties->deviceType = GN_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU;
else
properties->deviceType = GN_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
const char* rawName = [[mtlDevice name] UTF8String];
strncpy(properties->deviceName, rawName, 255);
properties->deviceName[255] = '\0';
return GN_SUCCESS;
}
@@ -2,6 +2,7 @@
#include "gryphn_handle.h"
#include "gryphn_return_code.h"
#include "stdint.h"
#include "device/gryphn_physical_device.h"
gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices);
gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
+5
View File
@@ -47,6 +47,11 @@ void createDevice() {
CHECK(gnEnumeratePhysicalDevices(instance, &physicalDeviceCount, devices));
std::cout << "Found " << physicalDeviceCount << " physical devices:\n";
for (int i = 0; i < physicalDeviceCount; i++) {
gnPhysicalDeviceProperties properties;
gnGetPhysicalDeviceProperties(devices[i], &properties);
std::cout << "Name: " << properties.deviceName << "\n";
}
}
int main() {