diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index 9c62407..bfeb19a 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -943,7 +943,57 @@ KrResult KRContext::createWindowSurface(const KrCreateWindowSurfaceInfo* createW } vkGetDeviceQueue(info.logicalDevice, selectedDeviceGraphicsFamilyQueue, 0, &info.graphicsQueue); + VkSurfaceCapabilitiesKHR surfaceCapabilities{}; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(info.device, info.surface, &surfaceCapabilities); + + std::vector surfaceFormats; + uint32_t formatCount = 0; + vkGetPhysicalDeviceSurfaceFormatsKHR(info.device, info.surface, &formatCount, nullptr); + + m_surfaces.insert(std::pair(createWindowSurfaceInfo->surfaceHandle, info)); + if (formatCount != 0) { + surfaceFormats.resize(formatCount); + vkGetPhysicalDeviceSurfaceFormatsKHR(info.device, info.surface, &formatCount, surfaceFormats.data()); + } + + std::vector surfacePresentModes; + + uint32_t presentModeCount = 0; + vkGetPhysicalDeviceSurfacePresentModesKHR(info.device, info.surface, &presentModeCount, nullptr); + + if (presentModeCount != 0) { + surfacePresentModes.resize(presentModeCount); + vkGetPhysicalDeviceSurfacePresentModesKHR(info.device, info.surface, &presentModeCount, surfacePresentModes.data()); + } + + VkSurfaceFormatKHR selectedSurfaceFormat = surfaceFormats[0]; + for (const auto& availableFormat : surfaceFormats) { + if (availableFormat.format == VK_FORMAT_B8G8R8A8_SRGB && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { + selectedSurfaceFormat = availableFormat; + break; + } + } + + // VK_PRESENT_MODE_FIFO_KHR is always available + VkPresentModeKHR selectedPresentMode = VK_PRESENT_MODE_FIFO_KHR; + + // Try to find a better mode + for (const auto& availablePresentMode : surfacePresentModes) { + if (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR) { + selectedPresentMode = availablePresentMode; + } + } + + VkExtent2D swapExtent; + if (surfaceCapabilities.currentExtent.width != UINT32_MAX) { + swapExtent = surfaceCapabilities.currentExtent; + } else { + const uint32_t MAX_WIDTH = 8192; + const uint32_t MAX_HEIGHT = 8192; + swapExtent.width = std::max(surfaceCapabilities.minImageExtent.width, std::min(surfaceCapabilities.maxImageExtent.width, MAX_WIDTH)); + swapExtent.height = std::max(surfaceCapabilities.minImageExtent.height, std::min(surfaceCapabilities.maxImageExtent.height, MAX_HEIGHT)); + } return KR_SUCCESS; #else