From 76da3f910b6acb1cd4242a04c0b5b59fced64b6c Mon Sep 17 00:00:00 2001 From: Jean Philippe Date: Mon, 27 Oct 2025 01:04:21 +0900 Subject: [PATCH 1/2] monitored swapchain image count --- ZEngine/ZEngine/Hardwares/VulkanDevice.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp b/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp index 51273024..160a352d 100644 --- a/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp +++ b/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp @@ -893,7 +893,8 @@ namespace ZEngine::Hardwares sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; - sampler_create_info.maxAnisotropy = PhysicalDeviceProperties.limits.maxSamplerAnisotropy; + sampler_create_info.anisotropyEnable = PhysicalDeviceFeature.samplerAnisotropy; + sampler_create_info.maxAnisotropy = PhysicalDeviceFeature.samplerAnisotropy ? PhysicalDeviceProperties.limits.maxSamplerAnisotropy : 1.0f; sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; sampler_create_info.unnormalizedCoordinates = VK_FALSE; sampler_create_info.compareEnable = VK_FALSE; @@ -1095,7 +1096,15 @@ namespace ZEngine::Hardwares ZENGINE_VALIDATE_ASSERT(vkCreateSwapchainKHR(LogicalDevice, &swapchain_create_info, nullptr, &SwapchainHandle) == VK_SUCCESS, "Failed to create Swapchain") - ZENGINE_VALIDATE_ASSERT(vkGetSwapchainImagesKHR(LogicalDevice, SwapchainHandle, &SwapchainImageCount, nullptr) == VK_SUCCESS, "Failed to get Images count from Swapchain") + uint32_t image_count = 0; + ZENGINE_VALIDATE_ASSERT(vkGetSwapchainImagesKHR(LogicalDevice, SwapchainHandle, &image_count, nullptr) == VK_SUCCESS, "Failed to get Images count from Swapchain") + + if (image_count < SwapchainImageCount) + { + ZENGINE_CORE_WARN("Max Swapchain image count supported is {}, but requested {}", image_count, SwapchainImageCount); + SwapchainImageCount = image_count; + ZENGINE_CORE_WARN("Swapchain image count has changed from {} to {}", SwapchainImageCount, image_count); + } Array SwapchainImages = {}; SwapchainImages.init(scratch.Arena, SwapchainImageCount, SwapchainImageCount); From 00ec1526a736f44d4cf63f1d9e94f3625f14b2f3 Mon Sep 17 00:00:00 2001 From: Jean Philippe Date: Tue, 28 Oct 2025 01:29:48 +0900 Subject: [PATCH 2/2] hardening swapchain image count --- ZEngine/ZEngine/Hardwares/VulkanDevice.cpp | 36 ++++++++++++++-------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp b/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp index 160a352d..6b9cd9e6 100644 --- a/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp +++ b/ZEngine/ZEngine/Hardwares/VulkanDevice.cpp @@ -1065,21 +1065,12 @@ namespace ZEngine::Hardwares } auto min_image_count = std::clamp(capabilities.minImageCount, capabilities.minImageCount + 1, capabilities.maxImageCount); + VkSwapchainCreateInfoKHR swapchain_create_info = { .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, .pNext = nullptr, .surface = Surface, .minImageCount = min_image_count, .imageFormat = SurfaceFormat.format, .imageColorSpace = SurfaceFormat.colorSpace, .imageExtent = VkExtent2D{.width = SwapchainImageWidth, .height = SwapchainImageHeight}, .imageArrayLayers = 1, .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, .preTransform = capabilities.currentTransform, .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, .presentMode = PresentMode, .clipped = VK_TRUE }; - if (SwapchainImageViews.capacity() <= 0) - { - SwapchainImageViews.init(Arena, SwapchainImageCount, SwapchainImageCount); - } - - if (SwapchainFramebuffers.capacity() <= 0) - { - SwapchainFramebuffers.init(Arena, SwapchainImageCount, SwapchainImageCount); - } - auto scratch = ZGetScratch(Arena); Array family_indice = {}; @@ -1096,16 +1087,35 @@ namespace ZEngine::Hardwares ZENGINE_VALIDATE_ASSERT(vkCreateSwapchainKHR(LogicalDevice, &swapchain_create_info, nullptr, &SwapchainHandle) == VK_SUCCESS, "Failed to create Swapchain") + ZReleaseScratch(scratch); + uint32_t image_count = 0; ZENGINE_VALIDATE_ASSERT(vkGetSwapchainImagesKHR(LogicalDevice, SwapchainHandle, &image_count, nullptr) == VK_SUCCESS, "Failed to get Images count from Swapchain") - if (image_count < SwapchainImageCount) + if (image_count == 0) + { + ZENGINE_CORE_ERROR("Swapchain returned zero images.") + return; + } + + if (SwapchainImageCount != image_count) { - ZENGINE_CORE_WARN("Max Swapchain image count supported is {}, but requested {}", image_count, SwapchainImageCount); SwapchainImageCount = image_count; - ZENGINE_CORE_WARN("Swapchain image count has changed from {} to {}", SwapchainImageCount, image_count); + ZENGINE_CORE_INFO("Swapchain Image Count changed to {}", SwapchainImageCount) + } + + if (SwapchainImageViews.capacity() <= 0) + { + SwapchainImageViews.init(Arena, SwapchainImageCount, SwapchainImageCount); } + if (SwapchainFramebuffers.capacity() <= 0) + { + SwapchainFramebuffers.init(Arena, SwapchainImageCount, SwapchainImageCount); + } + + scratch = ZGetScratch(Arena); + Array SwapchainImages = {}; SwapchainImages.init(scratch.Arena, SwapchainImageCount, SwapchainImageCount); ZENGINE_VALIDATE_ASSERT(vkGetSwapchainImagesKHR(LogicalDevice, SwapchainHandle, &SwapchainImageCount, SwapchainImages.data()) == VK_SUCCESS, "Failed to get VkImages from Swapchain")