Sfoglia il codice sorgente

renderer_vulkan: bound async presentation queue growth

Liam 2 anni fa
parent
commit
b560ade663

+ 10 - 3
src/video_core/renderer_vulkan/vk_present_manager.cpp

@@ -102,8 +102,8 @@ PresentManager::PresentManager(const vk::Instance& instance_,
       memory_allocator{memory_allocator_}, scheduler{scheduler_}, swapchain{swapchain_},
       surface{surface_}, blit_supported{CanBlitToSwapchain(device.GetPhysical(),
                                                            swapchain.GetImageViewFormat())},
-      use_present_thread{Settings::values.async_presentation.GetValue()},
-      image_count{swapchain.GetImageCount()} {
+      use_present_thread{Settings::values.async_presentation.GetValue()} {
+    SetImageCount();
 
     auto& dld = device.GetLogical();
     cmdpool = dld.CreateCommandPool({
@@ -289,7 +289,14 @@ void PresentManager::PresentThread(std::stop_token token) {
 
 void PresentManager::RecreateSwapchain(Frame* frame) {
     swapchain.Create(*surface, frame->width, frame->height);
-    image_count = swapchain.GetImageCount();
+    SetImageCount();
+}
+
+void PresentManager::SetImageCount() {
+    // We cannot have more than 5 images in flight at any given time.
+    // FRAMES_IN_FLIGHT is 7, and the cache TICKS_TO_DESTROY is 6.
+    // Mali drivers will give us 6.
+    image_count = std::min<size_t>(swapchain.GetImageCount(), 5);
 }
 
 void PresentManager::CopyToSwapchain(Frame* frame) {

+ 2 - 0
src/video_core/renderer_vulkan/vk_present_manager.h

@@ -62,6 +62,8 @@ private:
 
     void RecreateSwapchain(Frame* frame);
 
+    void SetImageCount();
+
 private:
     const vk::Instance& instance;
     Core::Frontend::EmuWindow& render_window;