diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index cb3dd32..e8e581f 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -6,6 +6,7 @@ #include #include #include +#include // #pragma once diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.c b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.c deleted file mode 100644 index 554065d..0000000 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.c +++ /dev/null @@ -1,14 +0,0 @@ -// #include "vulkan_swapchain.h" -// #include "core/presentation_queue/gryphn_device_presentation_details.h" -// #include "../output_device/vulkan_output_devices.h" -// #include "../instance/vulkan_instance.h" - -// GN_EXPORT gnDevicePresentationDetails gnGetDevicePresentationDetailsFn(const gnPhysicalOutputDevice& physicalOutputDevice) { -// SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalOutputDevice.physicalOutputDevice->instance->instance->window_surface, physicalOutputDevice.physicalOutputDevice->device); - -// gnDevicePresentationDetails presentationDetails = gnDevicePresentationDetails{}; -// presentationDetails.MinimumImageCount = swapChainSupport.capabilities.minImageCount; -// presentationDetails.MaximumImageCount = swapChainSupport.capabilities.maxImageCount; - -// return presentationDetails; -// } diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.cpp b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.cpp deleted file mode 100644 index c8611c2..0000000 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_details.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "vulkan_swapchain.h" -#include "core/presentation_queue/gryphn_device_presentation_details.h" -#include "../output_device/vulkan_output_devices.h" -#include "../instance/vulkan_instance.h" - -GN_EXPORT gnDevicePresentationDetails gnGetDevicePresentationDetailsFn(const gnPhysicalOutputDevice& physicalOutputDevice) { - SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalOutputDevice.physicalOutputDevice->instance->instance->window_surface, physicalOutputDevice.physicalOutputDevice->device); - - gnDevicePresentationDetails presentationDetails = gnDevicePresentationDetails{}; - presentationDetails.MinimumImageCount = swapChainSupport.capabilities.minImageCount; - presentationDetails.MaximumImageCount = swapChainSupport.capabilities.maxImageCount; - - return presentationDetails; -} diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c index 7e9973f..66ac6de 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c @@ -1,7 +1,31 @@ #include "vulkan_presentation_queue.h" +#include "vulkan_swapchain_support.h" +#include +#include "vulkan_surface/vulkan_surface.h" +#include "core/debugger/gryphn_debugger.h" -gnReturnCode gnCreatePresentationQueueFn() { +gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, const gnOutputDevice* device, struct gnPresentationQueueInfo_t presentationInfo) { + vkSwapchainSupportDetails details = vkGetSwapchainSupport(device->physicalDevice.physicalDevice->device, presentationInfo.surface.windowSurface->surface); + if (details.formatCount == 0) { + gnDebuggerSetErrorMessage(device->instance->debugger, + (gnMessageData){ + .message = gnCreateString("Format count for presentation queue is zero") + } + ); + return GN_NO_SUPPORTED_FORMATS; + } + + if (details.presentModeCount == 0) { + gnDebuggerSetErrorMessage(device->instance->debugger, + (gnMessageData){ + .message = gnCreateString("Present mode count for presentation queue is zero") + } + ); + return GN_NO_SUPPORTED_PRESENT_MODES; + } + + return GN_SUCCESS; } // #include "core/presentation_queue/gryphn_presentation_queue.h" diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h deleted file mode 100644 index 1173d4d..0000000 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain.h +++ /dev/null @@ -1,99 +0,0 @@ -// #pragma once -// #include -// #include -// #include // Necessary for uint32_t -// #include // Necessary for std::numeric_limits -// #include // Necessary for std::clamp -// #include "vector" -// #include "set" -// #include - -// const std::vector deviceExtensions = { -// VK_KHR_SWAPCHAIN_EXTENSION_NAME, -// "VK_KHR_portability_subset" -// }; - -// static VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector& availableFormats) { -// for (const auto& availableFormat : availableFormats) { -// if (availableFormat.format == VK_FORMAT_B8G8R8A8_SRGB && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { -// return availableFormat; -// } -// } - -// return availableFormats[0]; -// } - -// static VkPresentModeKHR chooseSwapPresentMode(const std::vector& availablePresentModes) { -// for (const auto& availablePresentMode : availablePresentModes) { -// if (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR) { -// return availablePresentMode; -// } -// } - -// return VK_PRESENT_MODE_FIFO_KHR; -// } - -// static VkExtent2D chooseSwapExtent(gnVec2 size, const VkSurfaceCapabilitiesKHR& capabilities) { -// if (capabilities.currentExtent.width != std::numeric_limits::max()) { -// return capabilities.currentExtent; -// } else { -// // int width, height; -// // glfwGetFramebufferSize(window, &width, &height); - -// VkExtent2D actualExtent = { -// static_cast(size.x), -// static_cast(size.y) -// }; - -// actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width); -// actualExtent.height = std::clamp(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height); - -// return actualExtent; -// } -// } - -// static bool checkDeviceExtensionSupport(std::vector deviceExtensions, const VkPhysicalDevice& device) { -// uint32_t extensionCount; -// vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr); - -// std::vector availableExtensions(extensionCount); -// vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data()); - -// std::set requiredExtensions(deviceExtensions.begin(), deviceExtensions.end()); - -// for (const auto& extension : availableExtensions) { -// requiredExtensions.erase(extension.extensionName); -// } - -// return requiredExtensions.empty(); -// } - -// struct SwapChainSupportDetails { -// VkSurfaceCapabilitiesKHR capabilities; -// std::vector formats; -// std::vector presentModes; -// }; - -// static SwapChainSupportDetails querySwapChainSupport(const VkSurfaceKHR& surface, const VkPhysicalDevice& device) { -// SwapChainSupportDetails details; - -// vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities); - -// uint32_t formatCount; -// vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr); - -// if (formatCount != 0) { -// details.formats.resize(formatCount); -// vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data()); -// } - -// uint32_t presentModeCount; -// vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr); - -// if (presentModeCount != 0) { -// details.presentModes.resize(presentModeCount); -// vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data()); -// } - -// return details; -// } diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.c b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.c new file mode 100644 index 0000000..00bba22 --- /dev/null +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.c @@ -0,0 +1,23 @@ +#include "vulkan_swapchain_support.h" + +struct vkSwapchainSupportDetails_t vkGetSwapchainSupport( + const VkPhysicalDevice device, + const VkSurfaceKHR surface +) { + struct vkSwapchainSupportDetails_t details; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities); + + vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &details.formatCount, NULL); + if (details.formatCount > 0) { + details.formats = malloc(sizeof(VkSurfaceFormatKHR) * details.formatCount); + vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &details.formatCount, details.formats); + } + + vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &details.presentModeCount, NULL); + if (details.presentModeCount > 0) { + details.presentModes = malloc(sizeof(VkPresentModeKHR) * details.presentModeCount); + vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &details.presentModeCount, details.presentModes); + } + + return details; +} diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h index 7128694..61288f2 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_swapchain_support.h @@ -1,24 +1,17 @@ -// #pragma once -// #include "vulkan/vulkan.h" -// #include "vulkan_swapchain.h" -// #include "../output_device/vulkan_output_devices.h" +#pragma once +#include +#include -// struct vulkanSwapchainDetails { -// VkSurfaceFormatKHR surfaceFormat; -// VkPresentModeKHR presentMode; -// VkExtent2D extent; +typedef struct vkSwapchainSupportDetails_t { + VkSurfaceCapabilitiesKHR capabilities; + uint32_t formatCount; + VkSurfaceFormatKHR* formats; -// SwapChainSupportDetails swapChainSupport; -// }; + uint32_t presentModeCount; + VkPresentModeKHR* presentModes; +} vkSwapchainSupportDetails; -// static vulkanSwapchainDetails vulkanGetSwapchainDetails(gnVec2 size, const VkSurfaceKHR& surface, const VkPhysicalDevice& physicalDevice) { -// SwapChainSupportDetails swapChainSupport = querySwapChainSupport(surface, physicalDevice); - -// VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats); -// VkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes); -// VkExtent2D extent = chooseSwapExtent(size, swapChainSupport.capabilities); - -// return { -// surfaceFormat, presentMode, extent, swapChainSupport -// }; -// } +struct vkSwapchainSupportDetails_t vkGetSwapchainSupport( + const VkPhysicalDevice device, + const VkSurfaceKHR surface +); diff --git a/src/core/debugger/gryphn_debugger.c b/src/core/debugger/gryphn_debugger.c index 318076a..c7217bb 100644 --- a/src/core/debugger/gryphn_debugger.c +++ b/src/core/debugger/gryphn_debugger.c @@ -13,12 +13,3 @@ gnReturnCode gnCreateDebugger(gnDebugger* debugger, gnInstance* instance, const void gnDestroyDebugger(gnDebugger* debugger) { debugger->instance->functions->_gnDestroyDebugger(debugger); } - -void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data) { - debugger->info.callback( - GN_MESSAGE_ERROR, - GN_DEBUG_MESSAGE_VALIDATION, - data, - debugger->info.userData - ); -} diff --git a/src/core/debugger/gryphn_debugger.h b/src/core/debugger/gryphn_debugger.h index 317c083..35cea38 100644 --- a/src/core/debugger/gryphn_debugger.h +++ b/src/core/debugger/gryphn_debugger.h @@ -53,4 +53,11 @@ typedef struct gnDebugger_t { gnReturnCode gnCreateDebugger(gnDebugger* debugger, gnInstance* instance, const struct gnDebuggerInfo_t info); void gnDestroyDebugger(gnDebugger* debugger); -void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data); +static void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data) { + debugger->info.callback( + GN_MESSAGE_ERROR, + GN_DEBUG_MESSAGE_VALIDATION, + data, + debugger->info.userData + ); +} diff --git a/src/core/output_device/gryphn_output_device.c b/src/core/output_device/gryphn_output_device.c index 7995560..42a467a 100644 --- a/src/core/output_device/gryphn_output_device.c +++ b/src/core/output_device/gryphn_output_device.c @@ -7,7 +7,7 @@ gnReturnCode gnCreateOutputDevice(gnOutputDevice* outputDevice, gnInstance* inst outputDevice->deviceFunctions = malloc(sizeof(gnDeviceFunctions)); gnLoadDeviceFunctions(instance->dynamicLib, outputDevice->deviceFunctions); outputDevice->instance = instance; - // outputDevice->physicalDevice = (gnPhysicalDevice*)(&deviceInfo.physicalDevice); + outputDevice->physicalDevice = deviceInfo.physicalDevice; return instance->functions->_gnCreateOutputDevoce(outputDevice, instance, deviceInfo); } void gnDestroyOutputDevice(gnOutputDevice* device) { diff --git a/src/core/output_device/gryphn_output_device.h b/src/core/output_device/gryphn_output_device.h index 4de8754..863c8f4 100644 --- a/src/core/output_device/gryphn_output_device.h +++ b/src/core/output_device/gryphn_output_device.h @@ -21,7 +21,7 @@ typedef struct gnOutputDevice_t { struct gnPlatformOutputDevice_t* outputDevice; struct gnDeviceFunctions_t* deviceFunctions; gnInstance* instance; - // gnPhysicalDevice* physicalDevice; + gnPhysicalDevice physicalDevice; } gnOutputDevice; gnReturnCode gnCreateOutputDevice(gnOutputDevice* outputDevice, gnInstance* instance, struct gnOutputDeviceInfo_t deviceInfo); diff --git a/src/core/presentation_queue/gryphn_presentation_queue.h b/src/core/presentation_queue/gryphn_presentation_queue.h index cc2d40b..767d9b1 100644 --- a/src/core/presentation_queue/gryphn_presentation_queue.h +++ b/src/core/presentation_queue/gryphn_presentation_queue.h @@ -1,7 +1,7 @@ #pragma once #include #include "core/output_device/gryphn_output_device.h" -#include "gryphn_present_queue_state.h" +#include // #include "core/sync_objects/gryphn_sync_semaphore.h" // #include "core/textures/gryphn_texture.h" // #include "gryphn_device_presentation_details.h" @@ -9,6 +9,7 @@ typedef struct gnPresentationQueueInfo_t { gnUInt ImageCount; gnUInt2 ImageSize; + struct gnWindowSurface_t surface; } gnPresentationQueueInfo; struct gnPlatformPresentationQueue_t; diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index 6001524..ac91496 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -10,7 +10,9 @@ typedef enum gnReturnCode_t { GN_FAILED_TO_CREATE_DEVICE, GN_FAILED_TO_ATTACH_WINDOW, GN_INVALID_INSTANCE, - GN_DEBUGGER_EXISTS + GN_DEBUGGER_EXISTS, + GN_NO_SUPPORTED_FORMATS, + GN_NO_SUPPORTED_PRESENT_MODES // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT, @@ -41,5 +43,7 @@ static const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) { 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"; + case GN_NO_SUPPORTED_FORMATS: return "GN_NO_SUPPORTED_FORMATS"; + case GN_NO_SUPPORTED_PRESENT_MODES: return "GN_NO_SUPPORTED_PRESENT_MODES"; } }