Simple create metal device
This commit is contained in:
@@ -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);
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
#include "metal_functions.h"
|
#include "metal_functions.h"
|
||||||
|
|
||||||
extern "C" uint32_t gnInternalIsApiSupported(gnVersion version) {
|
extern "C" uint32_t gnInternalIsApiSupported(gnVersion version) {
|
||||||
if (version != gnCreateVersion(1, 0, 0)) return 0;
|
if (version != gnCreateVersion(1, 0, 0)) return 0;
|
||||||
id<MTLDevice> testDevice = MTLCreateSystemDefaultDevice();
|
id<MTLDevice> testDevice = MTLCreateSystemDefaultDevice();
|
||||||
if (testDevice == nil)
|
if (testDevice == nil)
|
||||||
return 0;
|
return 0;
|
||||||
[testDevice release];
|
[testDevice release];
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gnReturnCode destroyBackend(gnInstance instance) {
|
gnReturnCode destroyBackend(gnInstance instance) {
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user