diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.h | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_swapchain.cpp | 26 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_swapchain.h | 8 |
5 files changed, 23 insertions, 25 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index bd254c45e..e7bfecb20 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h | |||
| @@ -71,7 +71,7 @@ private: | |||
| 71 | MemoryAllocator memory_allocator; | 71 | MemoryAllocator memory_allocator; |
| 72 | StateTracker state_tracker; | 72 | StateTracker state_tracker; |
| 73 | Scheduler scheduler; | 73 | Scheduler scheduler; |
| 74 | VKSwapchain swapchain; | 74 | Swapchain swapchain; |
| 75 | BlitScreen blit_screen; | 75 | BlitScreen blit_screen; |
| 76 | RasterizerVulkan rasterizer; | 76 | RasterizerVulkan rasterizer; |
| 77 | }; | 77 | }; |
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index ea0b15b78..1ec8392e1 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp | |||
| @@ -120,8 +120,7 @@ struct BlitScreen::BufferData { | |||
| 120 | 120 | ||
| 121 | BlitScreen::BlitScreen(Core::Memory::Memory& cpu_memory_, Core::Frontend::EmuWindow& render_window_, | 121 | BlitScreen::BlitScreen(Core::Memory::Memory& cpu_memory_, Core::Frontend::EmuWindow& render_window_, |
| 122 | const Device& device_, MemoryAllocator& memory_allocator_, | 122 | const Device& device_, MemoryAllocator& memory_allocator_, |
| 123 | VKSwapchain& swapchain_, Scheduler& scheduler_, | 123 | Swapchain& swapchain_, Scheduler& scheduler_, const ScreenInfo& screen_info_) |
| 124 | const ScreenInfo& screen_info_) | ||
| 125 | : cpu_memory{cpu_memory_}, render_window{render_window_}, device{device_}, | 124 | : cpu_memory{cpu_memory_}, render_window{render_window_}, device{device_}, |
| 126 | memory_allocator{memory_allocator_}, swapchain{swapchain_}, scheduler{scheduler_}, | 125 | memory_allocator{memory_allocator_}, swapchain{swapchain_}, scheduler{scheduler_}, |
| 127 | image_count{swapchain.GetImageCount()}, screen_info{screen_info_} { | 126 | image_count{swapchain.GetImageCount()}, screen_info{screen_info_} { |
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.h b/src/video_core/renderer_vulkan/vk_blit_screen.h index 322af27e1..b8c67bef0 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.h +++ b/src/video_core/renderer_vulkan/vk_blit_screen.h | |||
| @@ -36,7 +36,7 @@ class Device; | |||
| 36 | class FSR; | 36 | class FSR; |
| 37 | class RasterizerVulkan; | 37 | class RasterizerVulkan; |
| 38 | class Scheduler; | 38 | class Scheduler; |
| 39 | class VKSwapchain; | 39 | class Swapchain; |
| 40 | 40 | ||
| 41 | struct ScreenInfo { | 41 | struct ScreenInfo { |
| 42 | VkImageView image_view{}; | 42 | VkImageView image_view{}; |
| @@ -48,9 +48,8 @@ struct ScreenInfo { | |||
| 48 | class BlitScreen { | 48 | class BlitScreen { |
| 49 | public: | 49 | public: |
| 50 | explicit BlitScreen(Core::Memory::Memory& cpu_memory, Core::Frontend::EmuWindow& render_window, | 50 | explicit BlitScreen(Core::Memory::Memory& cpu_memory, Core::Frontend::EmuWindow& render_window, |
| 51 | const Device& device, MemoryAllocator& memory_manager, | 51 | const Device& device, MemoryAllocator& memory_manager, Swapchain& swapchain, |
| 52 | VKSwapchain& swapchain, Scheduler& scheduler, | 52 | Scheduler& scheduler, const ScreenInfo& screen_info); |
| 53 | const ScreenInfo& screen_info); | ||
| 54 | ~BlitScreen(); | 53 | ~BlitScreen(); |
| 55 | 54 | ||
| 56 | void Recreate(); | 55 | void Recreate(); |
| @@ -108,7 +107,7 @@ private: | |||
| 108 | Core::Frontend::EmuWindow& render_window; | 107 | Core::Frontend::EmuWindow& render_window; |
| 109 | const Device& device; | 108 | const Device& device; |
| 110 | MemoryAllocator& memory_allocator; | 109 | MemoryAllocator& memory_allocator; |
| 111 | VKSwapchain& swapchain; | 110 | Swapchain& swapchain; |
| 112 | Scheduler& scheduler; | 111 | Scheduler& scheduler; |
| 113 | const std::size_t image_count; | 112 | const std::size_t image_count; |
| 114 | const ScreenInfo& screen_info; | 113 | const ScreenInfo& screen_info; |
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 68adf8be7..a0c26a72a 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp | |||
| @@ -64,15 +64,15 @@ VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, u32 wi | |||
| 64 | 64 | ||
| 65 | } // Anonymous namespace | 65 | } // Anonymous namespace |
| 66 | 66 | ||
| 67 | VKSwapchain::VKSwapchain(VkSurfaceKHR surface_, const Device& device_, Scheduler& scheduler_, | 67 | Swapchain::Swapchain(VkSurfaceKHR surface_, const Device& device_, Scheduler& scheduler_, u32 width, |
| 68 | u32 width, u32 height, bool srgb) | 68 | u32 height, bool srgb) |
| 69 | : surface{surface_}, device{device_}, scheduler{scheduler_} { | 69 | : surface{surface_}, device{device_}, scheduler{scheduler_} { |
| 70 | Create(width, height, srgb); | 70 | Create(width, height, srgb); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | VKSwapchain::~VKSwapchain() = default; | 73 | Swapchain::~Swapchain() = default; |
| 74 | 74 | ||
| 75 | void VKSwapchain::Create(u32 width, u32 height, bool srgb) { | 75 | void Swapchain::Create(u32 width, u32 height, bool srgb) { |
| 76 | is_outdated = false; | 76 | is_outdated = false; |
| 77 | is_suboptimal = false; | 77 | is_suboptimal = false; |
| 78 | 78 | ||
| @@ -93,7 +93,7 @@ void VKSwapchain::Create(u32 width, u32 height, bool srgb) { | |||
| 93 | resource_ticks.resize(image_count); | 93 | resource_ticks.resize(image_count); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | void VKSwapchain::AcquireNextImage() { | 96 | void Swapchain::AcquireNextImage() { |
| 97 | const VkResult result = device.GetLogical().AcquireNextImageKHR( | 97 | const VkResult result = device.GetLogical().AcquireNextImageKHR( |
| 98 | *swapchain, std::numeric_limits<u64>::max(), *present_semaphores[frame_index], | 98 | *swapchain, std::numeric_limits<u64>::max(), *present_semaphores[frame_index], |
| 99 | VK_NULL_HANDLE, &image_index); | 99 | VK_NULL_HANDLE, &image_index); |
| @@ -114,7 +114,7 @@ void VKSwapchain::AcquireNextImage() { | |||
| 114 | resource_ticks[image_index] = scheduler.CurrentTick(); | 114 | resource_ticks[image_index] = scheduler.CurrentTick(); |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | void VKSwapchain::Present(VkSemaphore render_semaphore) { | 117 | void Swapchain::Present(VkSemaphore render_semaphore) { |
| 118 | const auto present_queue{device.GetPresentQueue()}; | 118 | const auto present_queue{device.GetPresentQueue()}; |
| 119 | const VkPresentInfoKHR present_info{ | 119 | const VkPresentInfoKHR present_info{ |
| 120 | .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, | 120 | .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, |
| @@ -145,8 +145,8 @@ void VKSwapchain::Present(VkSemaphore render_semaphore) { | |||
| 145 | } | 145 | } |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | void VKSwapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities, u32 width, | 148 | void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities, u32 width, u32 height, |
| 149 | u32 height, bool srgb) { | 149 | bool srgb) { |
| 150 | const auto physical_device{device.GetPhysical()}; | 150 | const auto physical_device{device.GetPhysical()}; |
| 151 | const auto formats{physical_device.GetSurfaceFormatsKHR(surface)}; | 151 | const auto formats{physical_device.GetSurfaceFormatsKHR(surface)}; |
| 152 | const auto present_modes{physical_device.GetSurfacePresentModesKHR(surface)}; | 152 | const auto present_modes{physical_device.GetSurfacePresentModesKHR(surface)}; |
| @@ -212,13 +212,13 @@ void VKSwapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities, | |||
| 212 | image_view_format = srgb ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_B8G8R8A8_UNORM; | 212 | image_view_format = srgb ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_B8G8R8A8_UNORM; |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | void VKSwapchain::CreateSemaphores() { | 215 | void Swapchain::CreateSemaphores() { |
| 216 | present_semaphores.resize(image_count); | 216 | present_semaphores.resize(image_count); |
| 217 | std::ranges::generate(present_semaphores, | 217 | std::ranges::generate(present_semaphores, |
| 218 | [this] { return device.GetLogical().CreateSemaphore(); }); | 218 | [this] { return device.GetLogical().CreateSemaphore(); }); |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | void VKSwapchain::CreateImageViews() { | 221 | void Swapchain::CreateImageViews() { |
| 222 | VkImageViewCreateInfo ci{ | 222 | VkImageViewCreateInfo ci{ |
| 223 | .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, | 223 | .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, |
| 224 | .pNext = nullptr, | 224 | .pNext = nullptr, |
| @@ -250,7 +250,7 @@ void VKSwapchain::CreateImageViews() { | |||
| 250 | } | 250 | } |
| 251 | } | 251 | } |
| 252 | 252 | ||
| 253 | void VKSwapchain::Destroy() { | 253 | void Swapchain::Destroy() { |
| 254 | frame_index = 0; | 254 | frame_index = 0; |
| 255 | present_semaphores.clear(); | 255 | present_semaphores.clear(); |
| 256 | framebuffers.clear(); | 256 | framebuffers.clear(); |
| @@ -258,11 +258,11 @@ void VKSwapchain::Destroy() { | |||
| 258 | swapchain.reset(); | 258 | swapchain.reset(); |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | bool VKSwapchain::HasFpsUnlockChanged() const { | 261 | bool Swapchain::HasFpsUnlockChanged() const { |
| 262 | return current_fps_unlocked != Settings::values.disable_fps_limit.GetValue(); | 262 | return current_fps_unlocked != Settings::values.disable_fps_limit.GetValue(); |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | bool VKSwapchain::NeedsPresentModeUpdate() const { | 265 | bool Swapchain::NeedsPresentModeUpdate() const { |
| 266 | // Mailbox present mode is the ideal for all scenarios. If it is not available, | 266 | // Mailbox present mode is the ideal for all scenarios. If it is not available, |
| 267 | // A different present mode is needed to support unlocked FPS above the monitor's refresh rate. | 267 | // A different present mode is needed to support unlocked FPS above the monitor's refresh rate. |
| 268 | return present_mode != VK_PRESENT_MODE_MAILBOX_KHR && HasFpsUnlockChanged(); | 268 | return present_mode != VK_PRESENT_MODE_MAILBOX_KHR && HasFpsUnlockChanged(); |
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 6160c6a06..111b3902d 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h | |||
| @@ -17,11 +17,11 @@ namespace Vulkan { | |||
| 17 | class Device; | 17 | class Device; |
| 18 | class Scheduler; | 18 | class Scheduler; |
| 19 | 19 | ||
| 20 | class VKSwapchain { | 20 | class Swapchain { |
| 21 | public: | 21 | public: |
| 22 | explicit VKSwapchain(VkSurfaceKHR surface, const Device& device, Scheduler& scheduler, | 22 | explicit Swapchain(VkSurfaceKHR surface, const Device& device, Scheduler& scheduler, u32 width, |
| 23 | u32 width, u32 height, bool srgb); | 23 | u32 height, bool srgb); |
| 24 | ~VKSwapchain(); | 24 | ~Swapchain(); |
| 25 | 25 | ||
| 26 | /// Creates (or recreates) the swapchain with a given size. | 26 | /// Creates (or recreates) the swapchain with a given size. |
| 27 | void Create(u32 width, u32 height, bool srgb); | 27 | void Create(u32 width, u32 height, bool srgb); |