enumerate physical device properties
This commit is contained in:
@@ -5,3 +5,7 @@
|
|||||||
gnReturnCode gnEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) {
|
gnReturnCode gnEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices) {
|
||||||
return instance->dispatchTable.enumeratePhysicalDevices(instance, deviceCount, 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_handle.h"
|
||||||
#include "gryphn_return_code.h"
|
#include "gryphn_return_code.h"
|
||||||
#include "stdint.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 gnEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices);
|
||||||
|
gnReturnCode gnGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
|
||||||
|
|||||||
@@ -4,4 +4,4 @@
|
|||||||
#define GN_IMPLEMENTATION_HANDLE(type) typedef void* type
|
#define GN_IMPLEMENTATION_HANDLE(type) typedef void* type
|
||||||
|
|
||||||
GN_HANDLE(gnInstance);
|
GN_HANDLE(gnInstance);
|
||||||
GN_IMPLEMENTATION_HANDLE(gnPhysicalDevice);
|
GN_HANDLE(gnPhysicalDevice);
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "gryphn_handle.h"
|
#include "gryphn_handle.h"
|
||||||
|
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
|
||||||
|
|
||||||
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 struct gnInstanceDispatchTable {
|
typedef struct gnInstanceDispatchTable {
|
||||||
PFN_gnDestroyInstance destroyInstance;
|
PFN_gnDestroyInstance destroyInstance;
|
||||||
PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
|
PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
|
||||||
|
PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties;
|
||||||
} gnInstanceDispatchTable;
|
} gnInstanceDispatchTable;
|
||||||
|
|||||||
@@ -20,5 +20,6 @@ gnReturnCode destroyBackend(gnInstance instance) {
|
|||||||
extern "C" gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
|
extern "C" gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
|
||||||
instance->dispatchTable.destroyInstance = destroyBackend;
|
instance->dispatchTable.destroyInstance = destroyBackend;
|
||||||
instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices;
|
instance->dispatchTable.enumeratePhysicalDevices = metalEnumeratePhysicalDevices;
|
||||||
|
instance->dispatchTable.getPhysicalDeviceProperties = metalGetPhysicalDeviceProperties;
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "metal_functions.h"
|
#include "metal_functions.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
|
#include "device/gryphn_physical_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();
|
||||||
@@ -10,7 +11,46 @@ gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* device
|
|||||||
|
|
||||||
if (devices == NULL)
|
if (devices == NULL)
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
for (uint32_t i = 0; i < *deviceCount; i++)
|
for (uint32_t i = 0; i < *deviceCount; i++) {
|
||||||
devices[i] = (gnPhysicalDevice)mtlDevices[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;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "gryphn_handle.h"
|
#include "gryphn_handle.h"
|
||||||
#include "gryphn_return_code.h"
|
#include "gryphn_return_code.h"
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
|
#include "device/gryphn_physical_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);
|
||||||
|
|||||||
@@ -47,6 +47,11 @@ void createDevice() {
|
|||||||
CHECK(gnEnumeratePhysicalDevices(instance, &physicalDeviceCount, devices));
|
CHECK(gnEnumeratePhysicalDevices(instance, &physicalDeviceCount, devices));
|
||||||
|
|
||||||
std::cout << "Found " << physicalDeviceCount << " physical devices:\n";
|
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() {
|
int main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user