From 586b5bdd0cc8e3879ab2605f3c3053d93a0c749b Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Wed, 21 May 2025 14:56:45 -0400 Subject: [PATCH] rewrite device creation in C --- .../src/core/devices/metal_output_device.cpp | 158 +++++++++--------- .../src/core/devices/metal_output_devices.h | 26 +-- .../core/devices/metal_physical_device.cpp | 42 ++--- .../output_device/vulkan_device_extensions.h | 8 + .../output_device/vulkan_output_device.cpp | 67 ++++---- .../src/output_device/vulkan_output_devices.h | 10 +- .../output_device/vulkan_physical_device.cpp | 54 +++--- .../output_device/vulkan_physical_device.h | 7 + .../vulkan_queue_families.h | 14 +- src/core/gryphn_platform_functions.h | 12 ++ src/core/instance/gryphn_instance.c | 1 - src/core/instance/init/gryphn_init.c | 8 + src/core/instance/init/gryphn_init.h | 1 + src/core/output_device/gryphn_output_device.c | 14 ++ src/core/output_device/gryphn_output_device.h | 25 ++- .../gryphn_physical_output_device.c | 13 ++ .../gryphn_physical_output_device.h | 28 ++-- src/utils/gryphn_error_code.h | 5 +- 18 files changed, 274 insertions(+), 219 deletions(-) create mode 100644 rendering_api/vulkan/src/output_device/vulkan_device_extensions.h create mode 100644 rendering_api/vulkan/src/output_device/vulkan_physical_device.h create mode 100644 src/core/output_device/gryphn_output_device.c create mode 100644 src/core/output_device/gryphn_physical_output_device.c diff --git a/rendering_api/metal/src/core/devices/metal_output_device.cpp b/rendering_api/metal/src/core/devices/metal_output_device.cpp index 9cafeec..088044e 100644 --- a/rendering_api/metal/src/core/devices/metal_output_device.cpp +++ b/rendering_api/metal/src/core/devices/metal_output_device.cpp @@ -1,98 +1,98 @@ -#include -#include -#include -#include "metal_output_devices.h" +// #include +// #include +// #include +// #include "metal_output_devices.h" -struct mtlFramebufferVertex { - float x, y; - float u, v; -}; +// struct mtlFramebufferVertex { +// float x, y; +// float u, v; +// }; -GN_EXPORT gnReturnCode gnRegisterOutputDeviceFn(gnOutputDevice* outputDevice, const gnInstance& instance, const gnPhysicalOutputDevice& physicalDevice) { - if (outputDevice->outputDevice == nullptr) outputDevice->outputDevice = new gnPlatformOutputDevice(); - outputDevice->physicalOutputDevice = const_cast(&physicalDevice); +// GN_EXPORT gnReturnCode gnRegisterOutputDeviceFn(gnOutputDevice* outputDevice, const gnInstance& instance, const gnPhysicalOutputDevice& physicalDevice) { +// if (outputDevice->outputDevice == nullptr) outputDevice->outputDevice = new gnPlatformOutputDevice(); +// outputDevice->physicalOutputDevice = const_cast(&physicalDevice); - // instance.instance->metalLayer->setDevice(physicalDevice.physicalOutputDevice->device); +// // instance.instance->metalLayer->setDevice(physicalDevice.physicalOutputDevice->device); - // outputDevice->outputDevice->contentView = instance.instance->metalContentView->retain(); - outputDevice->outputDevice->device = physicalDevice.physicalOutputDevice->device->retain(); - outputDevice->outputDevice->commandQueue = outputDevice->outputDevice->device->newCommandQueue(); - outputDevice->outputDevice->instance = const_cast(&instance); +// // outputDevice->outputDevice->contentView = instance.instance->metalContentView->retain(); +// outputDevice->outputDevice->device = physicalDevice.physicalOutputDevice->device->retain(); +// outputDevice->outputDevice->commandQueue = outputDevice->outputDevice->device->newCommandQueue(); +// outputDevice->outputDevice->instance = const_cast(&instance); - { - const char* shaderSrc = R"metal( - #include - using namespace metal; +// { +// const char* shaderSrc = R"metal( +// #include +// using namespace metal; - struct VertexOut { - float4 position [[position]]; - float2 uv; - }; +// struct VertexOut { +// float4 position [[position]]; +// float2 uv; +// }; - vertex VertexOut vs_main(uint vertexID [[vertex_id]]) { - float2 positions[4] = { - {-1.0, -1.0}, - { 1.0, -1.0}, - {-1.0, 1.0}, - { 1.0, 1.0} - }; - float2 uvs[4] = { - {0.0, 1.0}, - {1.0, 1.0}, - {0.0, 0.0}, - {1.0, 0.0} - }; +// vertex VertexOut vs_main(uint vertexID [[vertex_id]]) { +// float2 positions[4] = { +// {-1.0, -1.0}, +// { 1.0, -1.0}, +// {-1.0, 1.0}, +// { 1.0, 1.0} +// }; +// float2 uvs[4] = { +// {0.0, 1.0}, +// {1.0, 1.0}, +// {0.0, 0.0}, +// {1.0, 0.0} +// }; - VertexOut out; - out.position = float4(positions[vertexID], 0.0, 1.0); - out.uv = uvs[vertexID]; - return out; - } +// VertexOut out; +// out.position = float4(positions[vertexID], 0.0, 1.0); +// out.uv = uvs[vertexID]; +// return out; +// } - fragment float4 fs_main(VertexOut in [[stage_in]], - texture2d colorTex [[texture(0)]], - sampler samp [[sampler(0)]]) { - return colorTex.sample(samp, in.uv); - } - )metal"; +// fragment float4 fs_main(VertexOut in [[stage_in]], +// texture2d colorTex [[texture(0)]], +// sampler samp [[sampler(0)]]) { +// return colorTex.sample(samp, in.uv); +// } +// )metal"; - NS::Error* error = nullptr; - MTL::CompileOptions* options = nullptr; - MTL::Library* library = physicalDevice.physicalOutputDevice->device->newLibrary(NS::String::string(shaderSrc, NS::UTF8StringEncoding), options, &error); - if (!library) { - return gnReturnError(GN_FAILED_CREATE_DEVICE, error->localizedDescription()->utf8String()); - } - MTL::Function* vs = library->newFunction(NS::String::string("vs_main", NS::UTF8StringEncoding)); - MTL::Function* fs = library->newFunction(NS::String::string("fs_main", NS::UTF8StringEncoding)); +// NS::Error* error = nullptr; +// MTL::CompileOptions* options = nullptr; +// MTL::Library* library = physicalDevice.physicalOutputDevice->device->newLibrary(NS::String::string(shaderSrc, NS::UTF8StringEncoding), options, &error); +// if (!library) { +// return gnReturnError(GN_FAILED_CREATE_DEVICE, error->localizedDescription()->utf8String()); +// } +// MTL::Function* vs = library->newFunction(NS::String::string("vs_main", NS::UTF8StringEncoding)); +// MTL::Function* fs = library->newFunction(NS::String::string("fs_main", NS::UTF8StringEncoding)); - MTL::RenderPipelineDescriptor* pipelineDesc = MTL::RenderPipelineDescriptor::alloc()->init(); - pipelineDesc->setVertexFunction(vs); - pipelineDesc->setFragmentFunction(fs); - pipelineDesc->colorAttachments()->object(0)->setPixelFormat(MTL::PixelFormatBGRA8Unorm); +// MTL::RenderPipelineDescriptor* pipelineDesc = MTL::RenderPipelineDescriptor::alloc()->init(); +// pipelineDesc->setVertexFunction(vs); +// pipelineDesc->setFragmentFunction(fs); +// pipelineDesc->colorAttachments()->object(0)->setPixelFormat(MTL::PixelFormatBGRA8Unorm); - instance.instance->framebufferRenderer = outputDevice->outputDevice->device->newRenderPipelineState(pipelineDesc, &error); - if (!instance.instance->framebufferRenderer) { - return gnReturnError(GN_FAILED_CREATE_DEVICE, error->localizedDescription()->utf8String()); - } - } +// instance.instance->framebufferRenderer = outputDevice->outputDevice->device->newRenderPipelineState(pipelineDesc, &error); +// if (!instance.instance->framebufferRenderer) { +// return gnReturnError(GN_FAILED_CREATE_DEVICE, error->localizedDescription()->utf8String()); +// } +// } - return GN_SUCCESS; -} +// return GN_SUCCESS; +// } -GN_EXPORT void gnWaitForDeviceFn(const gnOutputDevice& device) { - NS::AutoreleasePool* pool = NS::AutoreleasePool::alloc()->init(); +// GN_EXPORT void gnWaitForDeviceFn(const gnOutputDevice& device) { +// NS::AutoreleasePool* pool = NS::AutoreleasePool::alloc()->init(); - auto mtlDevice = device.physicalOutputDevice->physicalOutputDevice->device; +// auto mtlDevice = device.physicalOutputDevice->physicalOutputDevice->device; - auto commandBuffer = device.outputDevice->commandQueue->commandBuffer(); +// auto commandBuffer = device.outputDevice->commandQueue->commandBuffer(); - commandBuffer->commit(); - commandBuffer->waitUntilCompleted(); +// commandBuffer->commit(); +// commandBuffer->waitUntilCompleted(); - pool->release(); -} +// pool->release(); +// } -GN_EXPORT void gnDestroyOutputDeviceFn(gnOutputDevice& device) { - device.outputDevice->commandQueue->release(); - device.physicalOutputDevice->physicalOutputDevice->device->release(); -} +// GN_EXPORT void gnDestroyOutputDeviceFn(gnOutputDevice& device) { +// device.outputDevice->commandQueue->release(); +// device.physicalOutputDevice->physicalOutputDevice->device->release(); +// } diff --git a/rendering_api/metal/src/core/devices/metal_output_devices.h b/rendering_api/metal/src/core/devices/metal_output_devices.h index 9c0059a..9040f0d 100644 --- a/rendering_api/metal/src/core/devices/metal_output_devices.h +++ b/rendering_api/metal/src/core/devices/metal_output_devices.h @@ -1,16 +1,16 @@ -#pragma once -#include -#include +// #pragma once +// #include +// #include -struct gnPlatformPhysicalOutputDevice { - MTL::Device* device; -}; -struct gnInstance; +// struct gnPlatformPhysicalOutputDevice { +// MTL::Device* device; +// }; +// struct gnInstance; -struct gnPlatformOutputDevice { - MTL::Device* device; - MTL::CommandQueue* commandQueue; - MTK::View* contentView; +// struct gnPlatformOutputDevice { +// MTL::Device* device; +// MTL::CommandQueue* commandQueue; +// MTK::View* contentView; - gnInstance* instance; -}; +// gnInstance* instance; +// }; diff --git a/rendering_api/metal/src/core/devices/metal_physical_device.cpp b/rendering_api/metal/src/core/devices/metal_physical_device.cpp index e9ef91e..6c57ab6 100644 --- a/rendering_api/metal/src/core/devices/metal_physical_device.cpp +++ b/rendering_api/metal/src/core/devices/metal_physical_device.cpp @@ -1,23 +1,23 @@ -#include -#include -#include "metal_output_devices.h" +// #include +// #include +// #include "metal_output_devices.h" -GN_EXPORT gnPhysicalOutputDevice* gnGetPhysicalOutputDevicesFn(const gnInstance& instance, uint32_t* count) { - // gnList physicalOutputDevices = gnCreateList(); - NS::Array *devices = MTL::CopyAllDevices(); - gnPhysicalOutputDevice* devicesList = (gnPhysicalOutputDevice*)malloc(sizeof(gnPhysicalOutputDevice) * devices->count()); - for (int i = 0; i < devices->count(); i++) { - devicesList[i].outputDeviceName = reinterpret_cast(devices->object(0))->name()->cString(NS::StringEncoding::UTF8StringEncoding); - devicesList[i].physicalOutputDevice = new gnPlatformPhysicalOutputDevice(); - devicesList[i].physicalOutputDevice->device = reinterpret_cast(devices->object(0)); - } - *count = devices->count(); - return devicesList; -} +// GN_EXPORT gnPhysicalOutputDevice* gnGetPhysicalOutputDevicesFn(const gnInstance& instance, uint32_t* count) { +// // gnList physicalOutputDevices = gnCreateList(); +// NS::Array *devices = MTL::CopyAllDevices(); +// gnPhysicalOutputDevice* devicesList = (gnPhysicalOutputDevice*)malloc(sizeof(gnPhysicalOutputDevice) * devices->count()); +// for (int i = 0; i < devices->count(); i++) { +// devicesList[i].outputDeviceName = reinterpret_cast(devices->object(0))->name()->cString(NS::StringEncoding::UTF8StringEncoding); +// devicesList[i].physicalOutputDevice = new gnPlatformPhysicalOutputDevice(); +// devicesList[i].physicalOutputDevice->device = reinterpret_cast(devices->object(0)); +// } +// *count = devices->count(); +// return devicesList; +// } -GN_EXPORT gnBool gnDeviceSupportsAPIFn(const gnPhysicalOutputDevice& device) { - // so as far as my understanding goes which is not very far I dont think that the - // method I am using to ge the devices would return a list of devices that are not supported on - // metal but idk or really care cuz fuck you for using metal - return true; -} +// GN_EXPORT gnBool gnDeviceSupportsAPIFn(const gnPhysicalOutputDevice& device) { +// // so as far as my understanding goes which is not very far I dont think that the +// // method I am using to ge the devices would return a list of devices that are not supported on +// // metal but idk or really care cuz fuck you for using metal +// return true; +// } diff --git a/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h new file mode 100644 index 0000000..4b06761 --- /dev/null +++ b/rendering_api/vulkan/src/output_device/vulkan_device_extensions.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include "vector" + +const std::vector deviceExtensions = { + VK_KHR_SWAPCHAIN_EXTENSION_NAME, + "VK_KHR_portability_subset" +}; diff --git a/rendering_api/vulkan/src/output_device/vulkan_output_device.cpp b/rendering_api/vulkan/src/output_device/vulkan_output_device.cpp index 3f2e866..d07aab6 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_output_device.cpp +++ b/rendering_api/vulkan/src/output_device/vulkan_output_device.cpp @@ -1,17 +1,22 @@ #include -#include "presentation_queue/vulkan_queue_families.h" -#include "presentation_queue/vulkan_swapchain.h" +// #include "presentation_queue/vulkan_queue_families.h" +// #include "presentation_queue/vulkan_swapchain.h" +#include "vulkan_device_extensions.h" #include "vulkan_output_devices.h" #include -#include "set" +#include "vulkan_physical_device.h" +#include "presentation_queue/vulkan_queue_families.h" +// #include -GN_EXPORT gnReturnCode gnRegisterOutputDeviceFn(gnOutputDevice* outputDevice, const gnInstance& instance, const gnPhysicalOutputDevice& physicalDevice) { +GN_EXPORT gnReturnCode gnRegisterOutputDeviceFn(gnOutputDevice* outputDevice, gnInstance* instance, const gnPhysicalDevice physicalDevice) { if (outputDevice->outputDevice == nullptr) outputDevice->outputDevice = new gnPlatformOutputDevice(); - QueueFamilyIndices indices = findQueueFamilies(instance.instance->window_surface, physicalDevice.physicalOutputDevice->device); + //instance.instance->window_surface, + QueueFamilyIndices indices = findQueueFamilies(physicalDevice.physicalDevice->device); std::vector queueCreateInfos; - std::set uniqueQueueFamilies = {indices.graphicsFamily.value(), indices.presentFamily.value()}; + //indices.presentFamily.value() + std::set uniqueQueueFamilies = {indices.graphicsFamily.value()}; float queuePriority = 1.0f; for (uint32_t queueFamily : uniqueQueueFamilies) { @@ -37,42 +42,34 @@ GN_EXPORT gnReturnCode gnRegisterOutputDeviceFn(gnOutputDevice* outputDevice, co createInfo.enabledExtensionCount = static_cast(deviceExtensions.size()); createInfo.ppEnabledExtensionNames = deviceExtensions.data(); - if (instance.debugger) { - auto validation_layers = instance.debugger->debug_layers; + const char* validation_layers[1] = { "VK_LAYER_KHRONOS_validation" }; - gnList validation_layers_c = gnCreateList(); - for (int i = 0; i < gnListLength(validation_layers); i++) - gnListAdd(validation_layers_c, gnToCString(validation_layers[i])); + createInfo.enabledLayerCount = 1; + createInfo.ppEnabledLayerNames = validation_layers; - createInfo.enabledLayerCount = static_cast(gnListLength(validation_layers_c)); - createInfo.ppEnabledLayerNames = gnListData(validation_layers_c); - } else { - createInfo.enabledLayerCount = 0; - } - - if (vkCreateDevice(physicalDevice.physicalOutputDevice->device, &createInfo, nullptr, &outputDevice->outputDevice->device) != VK_SUCCESS) { - return GN_FAILED; + if (vkCreateDevice(physicalDevice.physicalDevice->device, &createInfo, nullptr, &outputDevice->outputDevice->device) != VK_SUCCESS) { + return GN_FAILED_TO_CREATE_DEVICE; } vkGetDeviceQueue(outputDevice->outputDevice->device, indices.graphicsFamily.value(), 0, &outputDevice->outputDevice->graphicsQueue); - vkGetDeviceQueue(outputDevice->outputDevice->device, indices.presentFamily.value(), 0, &outputDevice->outputDevice->presentQueue); - outputDevice->physicalOutputDevice = const_cast(&physicalDevice); + // vkGetDeviceQueue(outputDevice->outputDevice->device, indices.presentFamily.value(), 0, &outputDevice->outputDevice->presentQueue); + // outputDevice->physicalOutputDevice = const_cast(&physicalDevice); - { - QueueFamilyIndices queueFamilyIndices = findQueueFamilies( - outputDevice->physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface, - outputDevice->physicalOutputDevice->physicalOutputDevice->device - ); + // { + // 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(); + // 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; - } - } + // if (vkCreateCommandPool(outputDevice->outputDevice->device, &poolInfo, nullptr, &outputDevice->outputDevice->commandPool) != VK_SUCCESS) { + // return GN_FAILED; + // } + // } return GN_SUCCESS; } @@ -82,6 +79,6 @@ GN_EXPORT void gnWaitForDeviceFn(const gnOutputDevice& device) { } GN_EXPORT void gnDestroyOutputDeviceFn(gnOutputDevice& device) { - vkDestroyCommandPool(device.outputDevice->device, device.outputDevice->commandPool, nullptr); + // vkDestroyCommandPool(device.outputDevice->device, device.outputDevice->commandPool, nullptr); vkDestroyDevice(device.outputDevice->device, nullptr); } diff --git a/rendering_api/vulkan/src/output_device/vulkan_output_devices.h b/rendering_api/vulkan/src/output_device/vulkan_output_devices.h index 0321d11..c7724b6 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_output_devices.h +++ b/rendering_api/vulkan/src/output_device/vulkan_output_devices.h @@ -1,16 +1,10 @@ #pragma once #include -#include "core/output_device/gryphn_output_device.h" - -struct gnPlatformPhysicalOutputDevice { - VkPhysicalDevice device; - gnInstance* instance; -}; +#include struct gnPlatformOutputDevice { VkDevice device; VkQueue presentQueue; VkQueue graphicsQueue; - - VkCommandPool commandPool; + // VkCommandPool commandPool; }; diff --git a/rendering_api/vulkan/src/output_device/vulkan_physical_device.cpp b/rendering_api/vulkan/src/output_device/vulkan_physical_device.cpp index 68c170a..1d67665 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_physical_device.cpp +++ b/rendering_api/vulkan/src/output_device/vulkan_physical_device.cpp @@ -1,45 +1,49 @@ -#include "core/output_device/gryphn_physical_output_device.h" -#include +#include "gryphn/gryphn_utils.h" +#include "vulkan_physical_device.h" #include -#include "presentation_queue/vulkan_queue_families.h" -#include "vulkan_output_devices.h" -#include "presentation_queue/vulkan_swapchain.h" +#include +#include "vulkan_device_extensions.h" -GN_EXPORT gnPhysicalOutputDevice* gnGetPhysicalOutputDevicesFn(const gnInstance& instance, uint32_t* deviceCount) { - vkEnumeratePhysicalDevices(instance.instance->vk_instance, deviceCount, nullptr); +// #include "core/output_device/gryphn_physical_output_device.h" +// #include +// #include "vulkan_output_devices.h" +// #include "presentation_queue/vulkan_swapchain.h" + +GN_EXPORT gnPhysicalDevice* gnGetPhysicalDevicesFn(gnInstance* instance, uint32_t* deviceCount) { + vkEnumeratePhysicalDevices(instance->instance->vk_instance, deviceCount, nullptr); if (deviceCount == 0) return nullptr; std::vector devices(*deviceCount); - vkEnumeratePhysicalDevices(instance.instance->vk_instance, deviceCount, devices.data()); - - gnPhysicalOutputDevice* outputDevices = (gnPhysicalOutputDevice*)malloc(sizeof(gnPhysicalOutputDevice) * *deviceCount); + vkEnumeratePhysicalDevices(instance->instance->vk_instance, deviceCount, devices.data()); + gnPhysicalDevice* outputDevices = (gnPhysicalDevice*)malloc(sizeof(gnPhysicalDevice) * *deviceCount); for (int i = 0; i < *deviceCount; i++) { - outputDevices[i].physicalOutputDevice = new gnPlatformPhysicalOutputDevice(); - outputDevices[i].physicalOutputDevice->device = devices[i]; - outputDevices[i].physicalOutputDevice->instance = const_cast(&instance); + outputDevices[i].physicalDevice = new gnPlatformPhysicalDevice(); + outputDevices[i].physicalDevice->device = devices[i]; VkPhysicalDeviceProperties deviceProperties; vkGetPhysicalDeviceProperties(devices[i], &deviceProperties); - outputDevices[i].outputDeviceName = gnCreateString(deviceProperties.deviceName); + outputDevices[i].name = gnCreateString(deviceProperties.deviceName); } return outputDevices; } -GN_EXPORT bool gnDeviceSupportsAPIFn(const gnPhysicalOutputDevice& device) { - QueueFamilyIndices indices = findQueueFamilies(device.physicalOutputDevice->instance->instance->window_surface, device.physicalOutputDevice->device); - bool extensionsSupported = checkDeviceExtensionSupport(deviceExtensions, device.physicalOutputDevice->device); +GN_EXPORT gnBool gnDeviceSupportsAPIFn(const gnPhysicalDevice device) { + //QueueFamilyIndices indices = findQueueFamilies(device.instance->instance->window_surface, device.physicalDevice->device); + //bool swapChainAdequate = true, extensionsSupported = true; + // bool extensionsSupported = checkDeviceExtensionSupport(deviceExtensions, device.physicalDevice->device); - bool swapChainAdequate = false; - if (extensionsSupported) { - SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device.physicalOutputDevice->instance->instance->window_surface, device.physicalOutputDevice->device); - swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty(); - } + // bool swapChainAdequate = false; + // if (extensionsSupported) { + // SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device.physicalOutputDevice->instance->instance->window_surface, device.physicalOutputDevice->device); + // swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty(); + // } - VkPhysicalDeviceFeatures supportedFeatures; - vkGetPhysicalDeviceFeatures(device.physicalOutputDevice->device, &supportedFeatures); + //VkPhysicalDeviceFeatures supportedFeatures; + //vkGetPhysicalDeviceFeatures(device.physicalDevice->device, &supportedFeatures); - return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy; + //return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy; + return gnTrue; } diff --git a/rendering_api/vulkan/src/output_device/vulkan_physical_device.h b/rendering_api/vulkan/src/output_device/vulkan_physical_device.h new file mode 100644 index 0000000..718c177 --- /dev/null +++ b/rendering_api/vulkan/src/output_device/vulkan_physical_device.h @@ -0,0 +1,7 @@ +#pragma once +#include +#include + +struct gnPlatformPhysicalDevice { + VkPhysicalDevice device; +}; diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_queue_families.h b/rendering_api/vulkan/src/presentation_queue/vulkan_queue_families.h index 4ae4cdf..8b60c21 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_queue_families.h +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_queue_families.h @@ -9,14 +9,14 @@ // it does work tho struct QueueFamilyIndices { std::optional graphicsFamily; - std::optional presentFamily; + // std::optional presentFamily; bool isComplete() { - return graphicsFamily.has_value() && presentFamily.has_value(); + return graphicsFamily.has_value(); //&& presentFamily.has_value(); } }; -static QueueFamilyIndices findQueueFamilies(const VkSurfaceKHR& surface, const VkPhysicalDevice& device) { +static QueueFamilyIndices findQueueFamilies(const VkPhysicalDevice& device) { QueueFamilyIndices indices; uint32_t queueFamilyCount = 0; @@ -26,11 +26,11 @@ static QueueFamilyIndices findQueueFamilies(const VkSurfaceKHR& surface, const V vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); int i = 0; for (const auto& queueFamily : queueFamilies) { - VkBool32 presentSupport = false; - vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); + // VkBool32 presentSupport = false; + // vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); - if (presentSupport) - indices.presentFamily = i; + // if (presentSupport) + // indices.presentFamily = i; if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) indices.graphicsFamily = i; diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 5ad04fd..6d1360f 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -3,6 +3,8 @@ // why I dont know #include "instance/gryphn_instance.h" #include "debugger/gryphn_debugger.h" +#include "output_device/gryphn_physical_output_device.h" +#include "output_device/gryphn_output_device.h" typedef struct gnFunctions_t { gnReturnCode (*_gnCreateInstance)(gnInstance* instance, struct gnInstanceInfo_t info); @@ -10,4 +12,14 @@ typedef struct gnFunctions_t { gnReturnCode (*_gnCreateDebugger)(gnDebugger* debugger, gnInstance* instance, const struct gnDebuggerInfo_t info); void (*_gnDestroyDebugger)(gnDebugger* debugger); + + gnBool (*_gnDeviceSupportsAPI)(const gnPhysicalDevice device); + gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstance* instance, uint32_t* count); + + gnReturnCode (*_gnRegisterOutputDevice)(gnOutputDevice* outputDevice, gnInstance* instance, const gnPhysicalDevice physicalDevice); + void (*_gnDestroyOutputDevice)(gnOutputDevice* device); } gnFunctions; + +typedef struct gnDeviceFunctions_t { + +} gnDeviceFunctions; diff --git a/src/core/instance/gryphn_instance.c b/src/core/instance/gryphn_instance.c index b357a8d..168d48e 100644 --- a/src/core/instance/gryphn_instance.c +++ b/src/core/instance/gryphn_instance.c @@ -8,7 +8,6 @@ gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info if (instance->dynamicLib == NULL) return GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY; instance->functions = malloc(sizeof(struct gnFunctions_t)); gnLoadFunctions(instance->dynamicLib, instance->functions); - return instance->functions->_gnCreateInstance(instance, info); } void gnDestroyInstance(gnInstance* instance) { diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index 9d48850..22ac11a 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -40,4 +40,12 @@ void gnLoadFunctions(struct gnDynamicLibrary_t* lib, struct gnFunctions_t* funct gnLoadDLLFunction(lib, functions->_gnDestroyInstance, "gnDestroyInstanceFn"); gnLoadDLLFunction(lib, functions->_gnCreateDebugger, "gnCreateDebuggerFn"); gnLoadDLLFunction(lib, functions->_gnDestroyDebugger, "gnDestroyDebuggerFn"); + gnLoadDLLFunction(lib, functions->_gnGetPhysicalDevices, "gnGetPhysicalDevicesFn"); + gnLoadDLLFunction(lib, functions->_gnDeviceSupportsAPI, "gnDeviceSupportsAPIFn"); + gnLoadDLLFunction(lib, functions->_gnRegisterOutputDevice, "gnRegisterOutputDeviceFn"); + gnLoadDLLFunction(lib, functions->_gnDestroyOutputDevice, "gnDestroyOutputDeviceFn"); +} + +void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions) { + } diff --git a/src/core/instance/init/gryphn_init.h b/src/core/instance/init/gryphn_init.h index 058f657..03ff382 100644 --- a/src/core/instance/init/gryphn_init.h +++ b/src/core/instance/init/gryphn_init.h @@ -7,6 +7,7 @@ gnBool gnIsAPISupported(gnRenderingAPI RenderingAPI); struct gnDynamicLibrary_t* gnLoadRenderingDLL(gnRenderingAPI RenderingAPI); void gnLoadFunctions(struct gnDynamicLibrary_t* lib, struct gnFunctions_t* functions); +void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions); // #ifdef GN_REVEAL_IMPL // gnErrorCode gnInit(gnRenderingAPI RenderingAPI); diff --git a/src/core/output_device/gryphn_output_device.c b/src/core/output_device/gryphn_output_device.c new file mode 100644 index 0000000..cc4d540 --- /dev/null +++ b/src/core/output_device/gryphn_output_device.c @@ -0,0 +1,14 @@ +#include "gryphn_output_device.h" +#include "core/instance/gryphn_instance.h" +#include "core/gryphn_platform_functions.h" +#include "core/instance/init/gryphn_init.h" + +gnReturnCode gnRegisterOutputDevice(gnOutputDevice* outputDevice, gnInstance* instance, const gnPhysicalDevice physicalDevice) { + outputDevice->deviceFunctions = malloc(sizeof(gnDeviceFunctions)); + gnLoadDeviceFunctions(instance->dynamicLib, outputDevice->deviceFunctions); + outputDevice->physicalDevice = (gnPhysicalDevice*)(&physicalDevice); + return instance->functions->_gnRegisterOutputDevice(outputDevice, instance, physicalDevice); +} +void gnDestroyOutputDevice(gnOutputDevice* device) { + device->physicalDevice->instance->functions->_gnDestroyOutputDevice(device); +} diff --git a/src/core/output_device/gryphn_output_device.h b/src/core/output_device/gryphn_output_device.h index 28a2902..29e416c 100644 --- a/src/core/output_device/gryphn_output_device.h +++ b/src/core/output_device/gryphn_output_device.h @@ -1,19 +1,16 @@ #pragma once -#include -#include "gryphn_physical_output_device.h" +#include struct gnPlatformOutputDevice; -struct gnPhysicalOutputDevice; -struct gnInstance; +struct gnDeviceFunctions_t; -struct gnOutputDevice { -ACCESS_LEVEL: - gnPlatformOutputDevice* outputDevice = nullptr; - gnPhysicalOutputDevice* physicalOutputDevice; -public: - gnOutputDevice() {} -}; +typedef struct gnOutputDevice_t { + struct gnPlatformOutputDevice* outputDevice; + struct gnDeviceFunctions_t* deviceFunctions; + gnPhysicalDevice* physicalDevice; +} gnOutputDevice; -inline gnReturnCode (*gnRegisterOutputDevice)(gnOutputDevice* outputDevice, const gnInstance& instance, const gnPhysicalOutputDevice& physicalDevice); -inline void (*gnWaitForDevice)(const gnOutputDevice& device); -inline void (*gnDestroyOutputDevice)(gnOutputDevice& device); +gnReturnCode gnRegisterOutputDevice(gnOutputDevice* outputDevice, gnInstance* instance, const gnPhysicalDevice physicalDevice); +void gnDestroyOutputDevice(gnOutputDevice* device); + +// inline void (*gnWaitForDevice)(const gnOutputDevice& device); diff --git a/src/core/output_device/gryphn_physical_output_device.c b/src/core/output_device/gryphn_physical_output_device.c new file mode 100644 index 0000000..663088c --- /dev/null +++ b/src/core/output_device/gryphn_physical_output_device.c @@ -0,0 +1,13 @@ +#include "gryphn_physical_output_device.h" +#include "core/gryphn_platform_functions.h" + +gnPhysicalDevice* gnGetPhyscialDevices(gnInstance* instance, uint32_t* count) { + gnPhysicalDevice* devices = instance->functions->_gnGetPhysicalDevices(instance, count); + for (int i = 0; i < *count; i++) { + devices[i].instance = instance; + } + return devices; +} +gnBool gnDeviceSupportsAPI(const gnPhysicalDevice device) { + return device.instance->functions->_gnDeviceSupportsAPI(device); +} diff --git a/src/core/output_device/gryphn_physical_output_device.h b/src/core/output_device/gryphn_physical_output_device.h index 78b7ae8..3865955 100644 --- a/src/core/output_device/gryphn_physical_output_device.h +++ b/src/core/output_device/gryphn_physical_output_device.h @@ -1,19 +1,19 @@ #pragma once -#include #include "core/instance/gryphn_instance.h" -struct gnPlatformPhysicalOutputDevice; -struct gnInstance; +struct gnPlatformPhysicalDevice; -struct gnPhysicalOutputDevice { -ACCESS_LEVEL: - bool valid = false; - gnPlatformPhysicalOutputDevice* physicalOutputDevice = nullptr; - gnString outputDeviceName; -public: - gnPhysicalOutputDevice() {} -}; +typedef struct gnPhysicalDeviceProperties_t { + // there are currently no properties +} gnPhysicalDeviceProperties; -gnString gnGetPhysicalOutputDeviceName(const gnPhysicalOutputDevice& device); -inline bool (*gnDeviceSupportsAPI)(const gnPhysicalOutputDevice& device); -inline gnPhysicalOutputDevice* (*gnGetPhysicalOutputDevices)(const gnInstance& instance, uint32_t* count); +typedef struct gnPhysicalDevice_t { + struct gnPlatformPhysicalDevice* physicalDevice; + gnString name; + struct gnPhysicalDeviceProperties_t properties; + + gnInstance* instance; +} gnPhysicalDevice; + +gnPhysicalDevice* gnGetPhyscialDevices(gnInstance* instance, uint32_t* count); +gnBool gnDeviceSupportsAPI(const gnPhysicalDevice device); diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index 73eeccf..74f592d 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -6,7 +6,8 @@ typedef enum gnReturnCode_t { GN_UNSUPPORTED_RENDERING_API, GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY, GN_FAILED_CREATE_INSTANCE, - GN_FAILED_TO_CREATE_DEBUGGER + GN_FAILED_TO_CREATE_DEBUGGER, + GN_FAILED_TO_CREATE_DEVICE // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT, @@ -16,7 +17,6 @@ typedef enum gnReturnCode_t { // GN_UNSUPPORTED_COLOR_FORMAT, // GN_UNKNOWN_COLOR_FORMAT, // GN_FUNCTION_NOT_FOUND, - // GN_FAILED_CREATE_DEVICE, // GN_FAILED_CREATE_GRAPHICS_PIPELINE, // GN_FAILED_CREATE_PRESENTATION_QUEUE, // GN_FAILED_TO_CREATE_FRAMEBUFFER, @@ -35,5 +35,6 @@ static const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) { case GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY: return "GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY"; case GN_FAILED_CREATE_INSTANCE: return "GN_FAILED_CREATE_INSTANCE"; case GN_FAILED_TO_CREATE_DEBUGGER: return "GN_FAILED_TO_CREATE_DEBUGGER"; + case GN_FAILED_TO_CREATE_DEVICE: return "GN_FAILED_TO_CREATE_DEVICE"; } }