From 990f40637f2c1740495aaa3f0231030e6a572777 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Fri, 23 May 2025 15:02:10 -0400 Subject: [PATCH] commit c file --- .../src/output_device/vulkan_output_device.c | 81 +++++++++++++++++++ src/utils/gryphn_error_code.h | 4 +- 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 rendering_api/vulkan/src/output_device/vulkan_output_device.c diff --git a/rendering_api/vulkan/src/output_device/vulkan_output_device.c b/rendering_api/vulkan/src/output_device/vulkan_output_device.c new file mode 100644 index 0000000..ab5b772 --- /dev/null +++ b/rendering_api/vulkan/src/output_device/vulkan_output_device.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include "vulkan_device_extensions.h" +#include "debugger/vulkan_debugger.h" + +#include +// #include "presentation_queue/vulkan_queue_families.h" +// #include "presentation_queue/vulkan_swapchain.h" +// #include "vulkan_output_devices.h" +// #include +// #include "vulkan_physical_device.h" +// #include + +gnReturnCode gnCreateOutputDeviceFn(gnOutputDevice* outputDevice, gnInstance* instance, struct gnOutputDeviceInfo_t deviceInfo) { + outputDevice->outputDevice = malloc(sizeof(gnPlatformOutputDevice)); + + VkDeviceQueueCreateInfo* queueCreateInfos = malloc(sizeof(VkDeviceQueueCreateInfo) * deviceInfo.queueInfoCount); + float queuePriority = 1.0f; + for (int i = 0; i < deviceInfo.queueInfoCount; i++) { + queueCreateInfos[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfos[i].queueFamilyIndex = deviceInfo.queueInfos[i].queueIndex; + queueCreateInfos[i].queueCount = deviceInfo.queueInfos[i].queueCount; + queueCreateInfos[i].pQueuePriorities = &queuePriority; + } + + VkPhysicalDeviceFeatures deviceFeatures = {}; + + VkDeviceCreateInfo createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + createInfo.queueCreateInfoCount = deviceInfo.queueInfoCount; + createInfo.pQueueCreateInfos = queueCreateInfos; + createInfo.pEnabledFeatures = &deviceFeatures; + + createInfo.enabledExtensionCount = deviceExtensionCount; + createInfo.ppEnabledExtensionNames = deviceExtensions; + + if (instance->debugger == NULL) + createInfo.enabledLayerCount = 0; + else { + const char* validation_layers[1] = { "VK_LAYER_KHRONOS_validation" }; + createInfo.enabledLayerCount = 1; + createInfo.ppEnabledLayerNames = validation_layers; + } + + if (vkCreateDevice(deviceInfo.physicalDevice.physicalDevice->device, &createInfo, NULL, &outputDevice->outputDevice->device) != VK_SUCCESS) { + return GN_FAILED_TO_CREATE_DEVICE; + } + + outputDevice->outputDevice->queues = malloc(sizeof(VkQueue) * deviceInfo.queueInfoCount); + for (int i = 0; i < deviceInfo.queueInfoCount; i++) { + vkGetDeviceQueue(outputDevice->outputDevice->device, deviceInfo.queueInfos[i].queueIndex, 0, &outputDevice->outputDevice->queues[i]); + } + + // { + // QueueFamilyIndices queueFamilyIndices = findQueueFamilies( + // outputDevice->physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface, + // outputDevice->physicalOutputDevice->physicalOutputDevice->device + // ); + + // VkCommandPoolCreateInfo poolInfo{}; + // poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + // poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + // poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value(); + + // if (vkCreateCommandPool(outputDevice->outputDevice->device, &poolInfo, nullptr, &outputDevice->outputDevice->commandPool) != VK_SUCCESS) { + // return GN_FAILED; + // } + // } + + return GN_SUCCESS; +} + +void gnWaitForDeviceFn(const gnOutputDevice* device) { + // vkDeviceWaitIdle(device->outputDevice->device); +} + +void gnDestroyOutputDeviceFn(gnOutputDevice* device) { + // vkDestroyCommandPool(device.outputDevice->device, device.outputDevice->commandPool, nullptr); + vkDestroyDevice(device->outputDevice->device, NULL); +} diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index b97cb10..6001524 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -9,7 +9,8 @@ typedef enum gnReturnCode_t { GN_FAILED_TO_CREATE_DEBUGGER, GN_FAILED_TO_CREATE_DEVICE, GN_FAILED_TO_ATTACH_WINDOW, - GN_INVALID_INSTANCE + GN_INVALID_INSTANCE, + GN_DEBUGGER_EXISTS // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT, @@ -39,5 +40,6 @@ static const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) { case GN_FAILED_TO_CREATE_DEBUGGER: return "GN_FAILED_TO_CREATE_DEBUGGER"; case GN_FAILED_TO_CREATE_DEVICE: return "GN_FAILED_TO_CREATE_DEVICE"; case GN_INVALID_INSTANCE: return "GN_INVALID_INSTANCE"; + case GN_DEBUGGER_EXISTS: return "GN_DEBUGGER_EXISTS"; } }