From a95e3a79b143df7a79d6055d960486e5b7115f08 Mon Sep 17 00:00:00 2001 From: Warwick New Date: Tue, 24 Dec 2024 18:36:22 +0000 Subject: [PATCH] added picker for present and formats --- src/main.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 95ca16d..444f1a2 100644 --- a/src/main.c +++ b/src/main.c @@ -304,20 +304,57 @@ bool checkDeviceExtensionSupport(VkPhysicalDevice device) { return true; } +// TODO: find a better way of managing memory SwapChainSupportDetails querySwapchainSupport(VkPhysicalDevice device, VkSurfaceKHR *surface) { SwapChainSupportDetails details = {0}; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, *surface, &details.capabilities); + vkGetPhysicalDeviceSurfaceFormatsKHR(device, *surface, &details.numFormats, - details.formats); - vkGetPhysicalDeviceSurfacePresentModesKHR( - device, *surface, &details.numPresentModes, details.presentModes); + NULL); + if (details.numFormats > 0) { + details.formats = malloc(details.numFormats * sizeof(VkSurfaceFormatKHR)); + vkGetPhysicalDeviceSurfaceFormatsKHR(device, *surface, &details.numFormats, + details.formats); + } + + vkGetPhysicalDeviceSurfacePresentModesKHR(device, *surface, + &details.numPresentModes, NULL); + if (details.numPresentModes > 0) { + details.presentModes = + malloc(details.numFormats * sizeof(VkPresentModeKHR)); + vkGetPhysicalDeviceSurfacePresentModesKHR( + device, *surface, &details.numPresentModes, details.presentModes); + } return details; } +// Prefer one format but otherwise go for +VkSurfaceFormatKHR chooseSwapSurfaceFormat(VkSurfaceFormatKHR *availableFormats, + size_t availableFormatCount) { + for (uint i = 0; i < availableFormatCount; i++) { + if (availableFormats[i].format == VK_FORMAT_B8G8R8_SRGB && + availableFormats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { + return availableFormats[i]; + } + } + return availableFormats[0]; +} + +// Prefer mailbox otherwise go for the garenteed available present mode +VkPresentModeKHR chooseSwapPresentMode(VkPresentModeKHR *availablePresentModes, + size_t availablePresentModesCount) { + for (uint i = 0; i < availablePresentModesCount; i++) { + if (availablePresentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR) { + return availablePresentModes[i]; + } + } + return VK_PRESENT_MODE_FIFO_KHR; +} + bool isDeviceSuitable(VkPhysicalDevice device, VkSurfaceKHR *surface) { QueueFamilyIndices indices = findQueueFamilies(device, surface); bool completeIndeces = @@ -325,10 +362,21 @@ bool isDeviceSuitable(VkPhysicalDevice device, VkSurfaceKHR *surface) { bool extensionsSupported = checkDeviceExtensionSupport(device); - SwapChainSupportDetails swapChaindetails = - querySwapchainSupport(device, surface); + bool swapChainAdequate = false; + if (extensionsSupported) { + SwapChainSupportDetails swapChainDetails = + querySwapchainSupport(device, surface); - return completeIndeces && extensionsSupported; + if (swapChainDetails.numFormats > 0 && + swapChainDetails.numPresentModes > 0) { + swapChainAdequate = true; + } + + free(swapChainDetails.presentModes); + free(swapChainDetails.formats); + } + + return completeIndeces && extensionsSupported && swapChainAdequate; } void pickPhysicalDevice(Application *app) {