diff --git a/projects/apis/metal/src/devices/metal_output_device.m b/projects/apis/metal/src/devices/metal_output_device.m index 5b978a1..b8e48e8 100644 --- a/projects/apis/metal/src/devices/metal_output_device.m +++ b/projects/apis/metal/src/devices/metal_output_device.m @@ -4,7 +4,7 @@ #include "instance/metal_instance.h" #include "instance/gryphn_instance.h" -gnReturnCode createMetalOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { +gnReturnCode createMetalOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle outputDevice, gnOutputDeviceInfo deviceInfo) { outputDevice->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); outputDevice->outputDevice->device = deviceInfo.physicalDevice->physicalDevice->device.retain; outputDevice->outputDevice->transferQueue = outputDevice->outputDevice->device.newCommandQueue; @@ -15,7 +15,7 @@ void waitForMetalDevice(gnOutputDeviceHandle device) { [device->outputDevice->executingCommandBuffer waitUntilCompleted]; } -void destroyMetalOutputDevice(gnOutputDeviceHandle device) { +void destroyMetalOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device) { // for (int i = 0; i < device->outputDevice->queueCount; i++) { // [device->outputDevice->queues[i] release]; // } diff --git a/projects/apis/metal/src/devices/metal_output_devices.h b/projects/apis/metal/src/devices/metal_output_devices.h index 1169ac6..7a5fcad 100644 --- a/projects/apis/metal/src/devices/metal_output_devices.h +++ b/projects/apis/metal/src/devices/metal_output_devices.h @@ -19,6 +19,6 @@ struct gnPlatformOutputDevice_t { gnPhysicalDevice* getMetalDevices(gnInstanceHandle instance, uint32_t* deviceCount); gnBool metalCanDevicePresent(gnPhysicalDevice device, gnWindowSurface windowSurface); -gnReturnCode createMetalOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); +gnReturnCode createMetalOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle outputDevice, gnOutputDeviceInfo deviceInfo); void waitForMetalDevice(gnOutputDeviceHandle device); -void destroyMetalOutputDevice(gnOutputDeviceHandle device); +void destroyMetalOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device); diff --git a/projects/apis/vulkan/src/output_device/vulkan_output_device.c b/projects/apis/vulkan/src/output_device/vulkan_output_device.c index 4dbd9e2..9f82e1d 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_output_device.c +++ b/projects/apis/vulkan/src/output_device/vulkan_output_device.c @@ -6,8 +6,9 @@ #include "commands/command_buffer/vulkan_command_buffer.h" #include "vulkan_result_converter.h" -gnReturnCode createOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { - outputDevice->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); +gnReturnCode createVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device, gnOutputDeviceInfo deviceInfo) { + device->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); + device->outputDevice->physicalDevice = deviceInfo.physicalDevice->physicalDevice->device; int createQueueCount = 0; VkDeviceQueueCreateInfo* queueCreateInfos = NULL; @@ -47,9 +48,9 @@ gnReturnCode createOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHan }; deviceCreateInfo.ppEnabledExtensionNames = vkGetGryphnDeviceExtensions(&deviceCreateInfo.enabledExtensionCount, deviceInfo.physicalDevice->physicalDevice->device); - outputDevice->outputDevice->enabledOversizedDescriptorPools = GN_FALSE; + device->outputDevice->enabledOversizedDescriptorPools = GN_FALSE; for (int i = 0; i < deviceCreateInfo.enabledExtensionCount; i++) - if (strcmp(deviceCreateInfo.ppEnabledExtensionNames[i], VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME) == 0) outputDevice->outputDevice->enabledOversizedDescriptorPools = GN_TRUE; + if (strcmp(deviceCreateInfo.ppEnabledExtensionNames[i], VK_NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME) == 0) device->outputDevice->enabledOversizedDescriptorPools = GN_TRUE; if (instance->hasDebugger) deviceCreateInfo.enabledLayerCount = 0; @@ -59,23 +60,23 @@ gnReturnCode createOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHan deviceCreateInfo.ppEnabledLayerNames = validation_layers; } - VkResult result = vkCreateDevice(deviceInfo.physicalDevice->physicalDevice->device, &deviceCreateInfo, NULL, &outputDevice->outputDevice->device); + VkResult result = vkCreateDevice(deviceInfo.physicalDevice->physicalDevice->device, &deviceCreateInfo, NULL, &device->outputDevice->device); if (result != VK_SUCCESS) return VkResultToGnReturnCode(result); - outputDevice->outputDevice->queues = malloc(sizeof(vulkanQueue) * deviceInfo.physicalDevice->physicalDevice->neededQueueCount); + device->outputDevice->queues = malloc(sizeof(vulkanQueue) * deviceInfo.physicalDevice->physicalDevice->neededQueueCount); uint32_t transferQueue = 0; for (int i = 0; i < deviceInfo.physicalDevice->physicalDevice->neededQueueCount; i++) { - outputDevice->outputDevice->queues[i].queueInfo = deviceInfo.physicalDevice->physicalDevice->neededQueues[i]; + device->outputDevice->queues[i].queueInfo = deviceInfo.physicalDevice->physicalDevice->neededQueues[i]; - vkGetDeviceQueue(outputDevice->outputDevice->device, deviceInfo.physicalDevice->physicalDevice->neededQueues[i].queueIndex, 0, &outputDevice->outputDevice->queues[i].queue); - if ((outputDevice->outputDevice->queues[i].queueInfo.createFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) { - outputDevice->outputDevice->transferQueueIndex = i; - transferQueue = outputDevice->outputDevice->queues[i].queueInfo.queueIndex; + vkGetDeviceQueue(device->outputDevice->device, deviceInfo.physicalDevice->physicalDevice->neededQueues[i].queueIndex, 0, &device->outputDevice->queues[i].queue); + if ((device->outputDevice->queues[i].queueInfo.createFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT) { + device->outputDevice->transferQueueIndex = i; + transferQueue = device->outputDevice->queues[i].queueInfo.queueIndex; } - if ((outputDevice->outputDevice->queues[i].queueInfo.createFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) { - outputDevice->outputDevice->graphicsQueueIndex = i; + if ((device->outputDevice->queues[i].queueInfo.createFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) { + device->outputDevice->graphicsQueueIndex = i; } } @@ -85,19 +86,19 @@ gnReturnCode createOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHan .queueFamilyIndex = transferQueue }; - VkResult command_pool_result = vkCreateCommandPool(outputDevice->outputDevice->device, &poolInfo, NULL, &outputDevice->outputDevice->transferCommandPool); + VkResult command_pool_result = vkCreateCommandPool(device->outputDevice->device, &poolInfo, NULL, &device->outputDevice->transferCommandPool); if (command_pool_result != VK_SUCCESS) return VkResultToGnReturnCode(command_pool_result); VkFenceCreateInfo fenceInfo = { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO }; - VkResult fence_result = vkCreateFence(outputDevice->outputDevice->device, &fenceInfo, NULL, &outputDevice->outputDevice->barrierFence); + VkResult fence_result = vkCreateFence(device->outputDevice->device, &fenceInfo, NULL, &device->outputDevice->barrierFence); if (fence_result != VK_SUCCESS) VkResultToGnReturnCode(fence_result); // create the massive staging buffer - outputDevice->outputDevice->stagingBufferSize = 128 * 1024 * 1024; + device->outputDevice->stagingBufferSize = 128 * 1024 * 1024; gnReturnCode code = VkCreateBuffer( - &outputDevice->outputDevice->stagingBuffer, - outputDevice->outputDevice->stagingBufferSize, outputDevice, + &device->outputDevice->stagingBuffer, + device->outputDevice->stagingBufferSize, device, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_BUFFER_USAGE_TRANSFER_SRC_BIT ); @@ -108,7 +109,7 @@ void waitForDevice(const gnOutputDeviceHandle device) { vkDeviceWaitIdle(device->outputDevice->device); } -void destroyOutputDevice(gnOutputDeviceHandle device) { +void destroyVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device) { vkDestroyFence(device->outputDevice->device, device->outputDevice->barrierFence, NULL); gnDestroyVulkanBuffer(&device->outputDevice->stagingBuffer, device->outputDevice->device); vkDestroyCommandPool(device->outputDevice->device, device->outputDevice->transferCommandPool, NULL); diff --git a/projects/apis/vulkan/src/output_device/vulkan_output_devices.h b/projects/apis/vulkan/src/output_device/vulkan_output_devices.h index 2dcc838..a4e9d34 100644 --- a/projects/apis/vulkan/src/output_device/vulkan_output_devices.h +++ b/projects/apis/vulkan/src/output_device/vulkan_output_devices.h @@ -11,6 +11,7 @@ typedef struct vulkanQueue { typedef struct gnPlatformOutputDevice_t { VkDevice device; + VkPhysicalDevice physicalDevice; uint32_t transferQueueIndex, graphicsQueueIndex; uint32_t queueCount; @@ -29,6 +30,6 @@ VkCommandBuffer gnBeginVulkanTransferOperation(gnDevice device); void gnEndVulkanTransferOperation(gnDevice device, VkCommandBuffer commandBuffer); -gnReturnCode createOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); -void waitForDevice(const gnOutputDeviceHandle device); -void destroyOutputDevice(gnOutputDeviceHandle device); +gnReturnCode createVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device, gnOutputDeviceInfo deviceInfo); +void waitForDevice(gnOutputDeviceHandle device); +void destroyVulkanOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device); diff --git a/projects/core/src/output_device/gryphn_output_device.c b/projects/core/src/output_device/gryphn_output_device.c index 307d91f..9064bd3 100644 --- a/projects/core/src/output_device/gryphn_output_device.c +++ b/projects/core/src/output_device/gryphn_output_device.c @@ -5,14 +5,13 @@ gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstance *outputDevice = malloc(sizeof(struct gnOutputDevice_t)); (*outputDevice)->instance = instance; - (*outputDevice)->physicalDevice = deviceInfo.physicalDevice; (*outputDevice)->deviceInfo = deviceInfo; - return instance->callingLayer->instanceFunctions._gnCreateOutputDevice(*outputDevice, instance, deviceInfo); + return instance->callingLayer->instanceFunctions._gnCreateOutputDevice(instance, *outputDevice, deviceInfo); } void gnWaitForDevice(gnOutputDeviceHandle device) { device->instance->callingLayer->deviceFunctions._gnWaitForDevice(device); } -void gnDestroyOutputDevice(gnOutputDeviceHandle device) { - device->instance->callingLayer->instanceFunctions._gnDestroyOutputDevice(device); +void gnDestroyOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device) { + device->instance->callingLayer->instanceFunctions._gnDestroyOutputDevice(instance, device); free(device); } diff --git a/projects/core/src/output_device/gryphn_output_device.h b/projects/core/src/output_device/gryphn_output_device.h index a80f453..3083dd5 100644 --- a/projects/core/src/output_device/gryphn_output_device.h +++ b/projects/core/src/output_device/gryphn_output_device.h @@ -24,11 +24,11 @@ typedef struct gnOutputDeviceInfo { struct gnOutputDevice_t { struct gnPlatformOutputDevice_t* outputDevice; gnOutputDeviceInfo deviceInfo; + gnInstanceHandle instance; - gnPhysicalDevice physicalDevice; }; #endif gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); void gnWaitForDevice(gnOutputDeviceHandle device); -void gnDestroyOutputDevice(gnOutputDeviceHandle device); +void gnDestroyOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device); diff --git a/projects/core/src/output_device/gryphn_physical_output_device.c b/projects/core/src/output_device/gryphn_physical_output_device.c index fc0789d..2780f3f 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.c +++ b/projects/core/src/output_device/gryphn_physical_output_device.c @@ -1,7 +1,8 @@ #include "gryphn_physical_output_device.h" #include "instance/gryphn_instance.h" +#include "loader/src/gryphn_instance_functions.h" -gnPhysicalOutputDeviceHandle* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count) { +gnPhysicalOutputDeviceHandle* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count) {; gnPhysicalOutputDeviceHandle* devices = instance->callingLayer->instanceFunctions._gnGetPhysicalDevices(instance, count); for (int i = 0; i < *count; i++) devices[i]->instance = instance;