diff --git a/src/video_core/renderer_vulkan/vk_present_window.cpp b/src/video_core/renderer_vulkan/vk_present_window.cpp index 5d4754526..261dcdb4a 100644 --- a/src/video_core/renderer_vulkan/vk_present_window.cpp +++ b/src/video_core/renderer_vulkan/vk_present_window.cpp @@ -109,7 +109,9 @@ PresentWindow::PresentWindow(Frontend::EmuWindow& emu_window_, const Instance& i use_present_thread{Settings::values.async_presentation.GetValue()}, last_render_surface{emu_window.GetWindowInfo().render_surface} { + const u32 num_images = swapchain.GetImageCount(); const vk::Device device = instance.GetDevice(); + const vk::CommandPoolCreateInfo pool_info = { .flags = vk::CommandPoolCreateFlagBits::eResetCommandBuffer | vk::CommandPoolCreateFlagBits::eTransient, @@ -120,11 +122,12 @@ PresentWindow::PresentWindow(Frontend::EmuWindow& emu_window_, const Instance& i const vk::CommandBufferAllocateInfo alloc_info = { .commandPool = command_pool, .level = vk::CommandBufferLevel::ePrimary, - .commandBufferCount = SWAP_CHAIN_SIZE, + .commandBufferCount = num_images, }; const std::vector command_buffers = device.allocateCommandBuffers(alloc_info); - for (u32 i = 0; i < SWAP_CHAIN_SIZE; i++) { + swap_chain.resize(num_images); + for (u32 i = 0; i < num_images; i++) { Frame& frame = swap_chain[i]; frame.cmdbuf = command_buffers[i]; frame.render_ready = device.createSemaphore({}); diff --git a/src/video_core/renderer_vulkan/vk_present_window.h b/src/video_core/renderer_vulkan/vk_present_window.h index d559d1eab..e55b0e757 100644 --- a/src/video_core/renderer_vulkan/vk_present_window.h +++ b/src/video_core/renderer_vulkan/vk_present_window.h @@ -35,8 +35,6 @@ struct Frame { }; class PresentWindow final { - static constexpr std::size_t SWAP_CHAIN_SIZE = 6; - public: explicit PresentWindow(Frontend::EmuWindow& emu_window, const Instance& instance, Scheduler& scheduler); @@ -81,7 +79,7 @@ private: vk::CommandPool command_pool; vk::Queue graphics_queue; vk::RenderPass present_renderpass; - std::array swap_chain{}; + std::vector swap_chain; std::queue free_queue; std::queue present_queue; std::condition_variable free_cv; diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 6a8f85735..bc72f00c9 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -44,8 +44,7 @@ void Scheduler::CommandChunk::ExecuteAll(vk::CommandBuffer cmdbuf) { Scheduler::Scheduler(const Instance& instance, RenderpassCache& renderpass_cache) : renderpass_cache{renderpass_cache}, master_semaphore{MakeMasterSemaphore(instance)}, - command_pool{instance, master_semaphore.get()}, use_worker_thread{ - !Settings::values.renderer_debug} { + command_pool{instance, master_semaphore.get()}, use_worker_thread{true} { AllocateWorkerCommandBuffers(); if (use_worker_thread) { AcquireNewChunk(); diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index e6b78a297..4dc222c1e 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -275,7 +275,7 @@ VideoCore::StagingData TextureRuntime::FindStaging(u32 size, bool upload) { } u32 TextureRuntime::RemoveThreshold() { - return num_swapchain_images + 2; + return num_swapchain_images; } void TextureRuntime::Finish() {