vk_swapchain: Fix incorrect image_count

* Sometimes the swapchain won't create as many images as requested. Adjust image_count for fix that
This commit is contained in:
GPUCode
2023-01-23 21:39:22 +02:00
parent 1e42a40640
commit 247b6900c7
2 changed files with 11 additions and 6 deletions

View File

@@ -176,7 +176,8 @@ bool PipelineCache::GraphicsPipeline::Build(bool fail_on_compile_required) {
const VertexAttribute& attrib = info.vertex_layout.attributes[i]; const VertexAttribute& attrib = info.vertex_layout.attributes[i];
const vk::Format format = ToVkAttributeFormat(attrib.type, attrib.size); const vk::Format format = ToVkAttributeFormat(attrib.type, attrib.size);
const bool is_supported = IsAttribFormatSupported(attrib, instance); const bool is_supported = IsAttribFormatSupported(attrib, instance);
ASSERT_MSG(is_supported || attrib.size == 3); ASSERT_MSG(is_supported || attrib.size == 3, "Failed attrib is_supported {} size {}",
is_supported, attrib.size);
attributes[i] = vk::VertexInputAttributeDescription{ attributes[i] = vk::VertexInputAttributeDescription{
.location = attrib.location, .location = attrib.location,

View File

@@ -3,6 +3,7 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include <algorithm> #include <algorithm>
#include <limits>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/microprofile.h" #include "common/microprofile.h"
#include "common/settings.h" #include "common/settings.h"
@@ -73,8 +74,8 @@ void Swapchain::Create(vk::SurfaceKHR new_surface) {
UNREACHABLE(); UNREACHABLE();
} }
RefreshSemaphores();
SetupImages(); SetupImages();
RefreshSemaphores();
resource_ticks.clear(); resource_ticks.clear();
resource_ticks.resize(image_count); resource_ticks.resize(image_count);
@@ -86,8 +87,9 @@ MICROPROFILE_DEFINE(Vulkan_Acquire, "Vulkan", "Swapchain Acquire", MP_RGB(185, 6
void Swapchain::AcquireNextImage() { void Swapchain::AcquireNextImage() {
MICROPROFILE_SCOPE(Vulkan_Acquire); MICROPROFILE_SCOPE(Vulkan_Acquire);
vk::Device device = instance.GetDevice(); vk::Device device = instance.GetDevice();
vk::Result result = device.acquireNextImageKHR( vk::Result result =
swapchain, UINT64_MAX, image_acquired[frame_index], VK_NULL_HANDLE, &image_index); device.acquireNextImageKHR(swapchain, std::numeric_limits<u64>::max(),
image_acquired[frame_index], VK_NULL_HANDLE, &image_index);
switch (result) { switch (result) {
case vk::Result::eSuccess: case vk::Result::eSuccess:
@@ -99,7 +101,7 @@ void Swapchain::AcquireNextImage() {
is_outdated = true; is_outdated = true;
break; break;
default: default:
LOG_ERROR(Render_Vulkan, "vkAcquireNextImageKHR returned unknown result {}", result); ASSERT_MSG(false, "vkAcquireNextImageKHR returned unknown result {}", result);
break; break;
} }
@@ -204,7 +206,7 @@ void Swapchain::SetSurfaceProperties() {
image_count = std::min(image_count, capabilities.maxImageCount); image_count = std::min(image_count, capabilities.maxImageCount);
} }
LOG_INFO(Render_Vulkan, "Using {} images", image_count); LOG_INFO(Render_Vulkan, "Requesting {} images", image_count);
// Prefer identity transform if possible // Prefer identity transform if possible
transform = vk::SurfaceTransformFlagBitsKHR::eIdentity; transform = vk::SurfaceTransformFlagBitsKHR::eIdentity;
@@ -259,6 +261,8 @@ void Swapchain::RefreshSemaphores() {
void Swapchain::SetupImages() { void Swapchain::SetupImages() {
vk::Device device = instance.GetDevice(); vk::Device device = instance.GetDevice();
images = device.getSwapchainImagesKHR(swapchain); images = device.getSwapchainImagesKHR(swapchain);
image_count = static_cast<u32>(images.size());
LOG_INFO(Render_Vulkan, "Using {} images", image_count);
for (const vk::Image image : images) { for (const vk::Image image : images) {
const vk::ImageViewCreateInfo view_info = { const vk::ImageViewCreateInfo view_info = {