diff options
| author | 2024-01-27 19:10:22 -0500 | |
|---|---|---|
| committer | 2024-02-09 09:20:53 -0500 | |
| commit | 78aac6b403de732e33a83c1b78eaa5384fd2ae61 (patch) | |
| tree | 5c48687e626ff1a5dd1b993aa57d26c752812725 /src/video_core/renderer_vulkan | |
| parent | nvnflinger/gpu: implement applet capture (diff) | |
| download | yuzu-78aac6b403de732e33a83c1b78eaa5384fd2ae61.tar.gz yuzu-78aac6b403de732e33a83c1b78eaa5384fd2ae61.tar.xz yuzu-78aac6b403de732e33a83c1b78eaa5384fd2ae61.zip | |
gpu: dependency-inject scaling/antialiasing filter state for capture layers
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/present/layer.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/present/layer.h | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.h | 5 |
5 files changed, 29 insertions, 17 deletions
diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 550955d4d..3847a9a13 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "video_core/present.h" | ||
| 4 | #include "video_core/renderer_vulkan/vk_rasterizer.h" | 5 | #include "video_core/renderer_vulkan/vk_rasterizer.h" |
| 5 | 6 | ||
| 6 | #include "common/settings.h" | 7 | #include "common/settings.h" |
| @@ -48,12 +49,12 @@ VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) { | |||
| 48 | 49 | ||
| 49 | Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Scheduler& scheduler_, | 50 | Layer::Layer(const Device& device_, MemoryAllocator& memory_allocator_, Scheduler& scheduler_, |
| 50 | Tegra::MaxwellDeviceMemoryManager& device_memory_, size_t image_count_, | 51 | Tegra::MaxwellDeviceMemoryManager& device_memory_, size_t image_count_, |
| 51 | VkExtent2D output_size, VkDescriptorSetLayout layout) | 52 | VkExtent2D output_size, VkDescriptorSetLayout layout, const PresentFilters& filters_) |
| 52 | : device(device_), memory_allocator(memory_allocator_), scheduler(scheduler_), | 53 | : device(device_), memory_allocator(memory_allocator_), scheduler(scheduler_), |
| 53 | device_memory(device_memory_), image_count(image_count_) { | 54 | device_memory(device_memory_), filters(filters_), image_count(image_count_) { |
| 54 | CreateDescriptorPool(); | 55 | CreateDescriptorPool(); |
| 55 | CreateDescriptorSets(layout); | 56 | CreateDescriptorSets(layout); |
| 56 | if (Settings::values.scaling_filter.GetValue() == Settings::ScalingFilter::Fsr) { | 57 | if (filters.get_scaling_filter() == Settings::ScalingFilter::Fsr) { |
| 57 | CreateFSR(output_size); | 58 | CreateFSR(output_size); |
| 58 | } | 59 | } |
| 59 | } | 60 | } |
| @@ -171,11 +172,11 @@ void Layer::RefreshResources(const Tegra::FramebufferConfig& framebuffer) { | |||
| 171 | } | 172 | } |
| 172 | 173 | ||
| 173 | void Layer::SetAntiAliasPass() { | 174 | void Layer::SetAntiAliasPass() { |
| 174 | if (anti_alias && anti_alias_setting == Settings::values.anti_aliasing.GetValue()) { | 175 | if (anti_alias && anti_alias_setting == filters.get_anti_aliasing()) { |
| 175 | return; | 176 | return; |
| 176 | } | 177 | } |
| 177 | 178 | ||
| 178 | anti_alias_setting = Settings::values.anti_aliasing.GetValue(); | 179 | anti_alias_setting = filters.get_anti_aliasing(); |
| 179 | 180 | ||
| 180 | const VkExtent2D render_area{ | 181 | const VkExtent2D render_area{ |
| 181 | .width = Settings::values.resolution_info.ScaleUp(raw_width), | 182 | .width = Settings::values.resolution_info.ScaleUp(raw_width), |
diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h index 88d43fc5f..f5effdcd7 100644 --- a/src/video_core/renderer_vulkan/present/layer.h +++ b/src/video_core/renderer_vulkan/present/layer.h | |||
| @@ -11,6 +11,8 @@ namespace Layout { | |||
| 11 | struct FramebufferLayout; | 11 | struct FramebufferLayout; |
| 12 | } | 12 | } |
| 13 | 13 | ||
| 14 | struct PresentFilters; | ||
| 15 | |||
| 14 | namespace Tegra { | 16 | namespace Tegra { |
| 15 | struct FramebufferConfig; | 17 | struct FramebufferConfig; |
| 16 | } | 18 | } |
| @@ -37,7 +39,8 @@ class Layer final { | |||
| 37 | public: | 39 | public: |
| 38 | explicit Layer(const Device& device, MemoryAllocator& memory_allocator, Scheduler& scheduler, | 40 | explicit Layer(const Device& device, MemoryAllocator& memory_allocator, Scheduler& scheduler, |
| 39 | Tegra::MaxwellDeviceMemoryManager& device_memory, size_t image_count, | 41 | Tegra::MaxwellDeviceMemoryManager& device_memory, size_t image_count, |
| 40 | VkExtent2D output_size, VkDescriptorSetLayout layout); | 42 | VkExtent2D output_size, VkDescriptorSetLayout layout, |
| 43 | const PresentFilters& filters); | ||
| 41 | ~Layer(); | 44 | ~Layer(); |
| 42 | 45 | ||
| 43 | void ConfigureDraw(PresentPushConstants* out_push_constants, | 46 | void ConfigureDraw(PresentPushConstants* out_push_constants, |
| @@ -71,6 +74,7 @@ private: | |||
| 71 | MemoryAllocator& memory_allocator; | 74 | MemoryAllocator& memory_allocator; |
| 72 | Scheduler& scheduler; | 75 | Scheduler& scheduler; |
| 73 | Tegra::MaxwellDeviceMemoryManager& device_memory; | 76 | Tegra::MaxwellDeviceMemoryManager& device_memory; |
| 77 | const PresentFilters& filters; | ||
| 74 | const size_t image_count{}; | 78 | const size_t image_count{}; |
| 75 | vk::DescriptorPool descriptor_pool{}; | 79 | vk::DescriptorPool descriptor_pool{}; |
| 76 | vk::DescriptorSets descriptor_sets{}; | 80 | vk::DescriptorSets descriptor_sets{}; |
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index c148efef2..d50417116 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include "core/telemetry_session.h" | 21 | #include "core/telemetry_session.h" |
| 22 | #include "video_core/capture.h" | 22 | #include "video_core/capture.h" |
| 23 | #include "video_core/gpu.h" | 23 | #include "video_core/gpu.h" |
| 24 | #include "video_core/present.h" | ||
| 24 | #include "video_core/renderer_vulkan/present/util.h" | 25 | #include "video_core/renderer_vulkan/present/util.h" |
| 25 | #include "video_core/renderer_vulkan/renderer_vulkan.h" | 26 | #include "video_core/renderer_vulkan/renderer_vulkan.h" |
| 26 | #include "video_core/renderer_vulkan/vk_blit_screen.h" | 27 | #include "video_core/renderer_vulkan/vk_blit_screen.h" |
| @@ -114,9 +115,12 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_, | |||
| 114 | render_window.GetFramebufferLayout().height), | 115 | render_window.GetFramebufferLayout().height), |
| 115 | present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain, | 116 | present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain, |
| 116 | surface), | 117 | surface), |
| 117 | blit_swapchain(device_memory, device, memory_allocator, present_manager, scheduler), | 118 | blit_swapchain(device_memory, device, memory_allocator, present_manager, scheduler, |
| 118 | blit_capture(device_memory, device, memory_allocator, present_manager, scheduler), | 119 | PresentFiltersForDisplay), |
| 119 | blit_applet(device_memory, device, memory_allocator, present_manager, scheduler), | 120 | blit_capture(device_memory, device, memory_allocator, present_manager, scheduler, |
| 121 | PresentFiltersForDisplay), | ||
| 122 | blit_applet(device_memory, device, memory_allocator, present_manager, scheduler, | ||
| 123 | PresentFiltersForAppletCapture), | ||
| 120 | rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, | 124 | rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, |
| 121 | scheduler), | 125 | scheduler), |
| 122 | applet_frame() { | 126 | applet_frame() { |
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index 2275fcc46..b7797f833 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "video_core/framebuffer_config.h" | 4 | #include "video_core/framebuffer_config.h" |
| 5 | #include "video_core/present.h" | ||
| 5 | #include "video_core/renderer_vulkan/present/filters.h" | 6 | #include "video_core/renderer_vulkan/present/filters.h" |
| 6 | #include "video_core/renderer_vulkan/present/layer.h" | 7 | #include "video_core/renderer_vulkan/present/layer.h" |
| 7 | #include "video_core/renderer_vulkan/vk_blit_screen.h" | 8 | #include "video_core/renderer_vulkan/vk_blit_screen.h" |
| @@ -12,9 +13,9 @@ namespace Vulkan { | |||
| 12 | 13 | ||
| 13 | BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_, const Device& device_, | 14 | BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_, const Device& device_, |
| 14 | MemoryAllocator& memory_allocator_, PresentManager& present_manager_, | 15 | MemoryAllocator& memory_allocator_, PresentManager& present_manager_, |
| 15 | Scheduler& scheduler_) | 16 | Scheduler& scheduler_, const PresentFilters& filters_) |
| 16 | : device_memory{device_memory_}, device{device_}, memory_allocator{memory_allocator_}, | 17 | : device_memory{device_memory_}, device{device_}, memory_allocator{memory_allocator_}, |
| 17 | present_manager{present_manager_}, scheduler{scheduler_}, image_count{1}, | 18 | present_manager{present_manager_}, scheduler{scheduler_}, filters{filters_}, image_count{1}, |
| 18 | swapchain_view_format{VK_FORMAT_B8G8R8A8_UNORM} {} | 19 | swapchain_view_format{VK_FORMAT_B8G8R8A8_UNORM} {} |
| 19 | 20 | ||
| 20 | BlitScreen::~BlitScreen() = default; | 21 | BlitScreen::~BlitScreen() = default; |
| @@ -27,7 +28,7 @@ void BlitScreen::WaitIdle() { | |||
| 27 | 28 | ||
| 28 | void BlitScreen::SetWindowAdaptPass() { | 29 | void BlitScreen::SetWindowAdaptPass() { |
| 29 | layers.clear(); | 30 | layers.clear(); |
| 30 | scaling_filter = Settings::values.scaling_filter.GetValue(); | 31 | scaling_filter = filters.get_scaling_filter(); |
| 31 | 32 | ||
| 32 | switch (scaling_filter) { | 33 | switch (scaling_filter) { |
| 33 | case Settings::ScalingFilter::NearestNeighbor: | 34 | case Settings::ScalingFilter::NearestNeighbor: |
| @@ -59,7 +60,7 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, | |||
| 59 | bool presentation_recreate_required = false; | 60 | bool presentation_recreate_required = false; |
| 60 | 61 | ||
| 61 | // Recreate dynamic resources if the adapting filter changed | 62 | // Recreate dynamic resources if the adapting filter changed |
| 62 | if (!window_adapt || scaling_filter != Settings::values.scaling_filter.GetValue()) { | 63 | if (!window_adapt || scaling_filter != filters.get_scaling_filter()) { |
| 63 | resource_update_required = true; | 64 | resource_update_required = true; |
| 64 | } | 65 | } |
| 65 | 66 | ||
| @@ -102,7 +103,7 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, | |||
| 102 | 103 | ||
| 103 | while (layers.size() < framebuffers.size()) { | 104 | while (layers.size() < framebuffers.size()) { |
| 104 | layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count, | 105 | layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count, |
| 105 | window_size, window_adapt->GetDescriptorSetLayout()); | 106 | window_size, window_adapt->GetDescriptorSetLayout(), filters); |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | // Perform the draw | 109 | // Perform the draw |
| @@ -119,8 +120,7 @@ vk::Framebuffer BlitScreen::CreateFramebuffer(const Layout::FramebufferLayout& l | |||
| 119 | VkFormat current_view_format) { | 120 | VkFormat current_view_format) { |
| 120 | const bool format_updated = | 121 | const bool format_updated = |
| 121 | std::exchange(swapchain_view_format, current_view_format) != current_view_format; | 122 | std::exchange(swapchain_view_format, current_view_format) != current_view_format; |
| 122 | if (!window_adapt || scaling_filter != Settings::values.scaling_filter.GetValue() || | 123 | if (!window_adapt || scaling_filter != filters.get_scaling_filter() || format_updated) { |
| 123 | format_updated) { | ||
| 124 | WaitIdle(); | 124 | WaitIdle(); |
| 125 | SetWindowAdaptPass(); | 125 | SetWindowAdaptPass(); |
| 126 | } | 126 | } |
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.h b/src/video_core/renderer_vulkan/vk_blit_screen.h index cbdf2d5d0..531c57fc5 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.h +++ b/src/video_core/renderer_vulkan/vk_blit_screen.h | |||
| @@ -16,6 +16,8 @@ namespace Core { | |||
| 16 | class System; | 16 | class System; |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | struct PresentFilters; | ||
| 20 | |||
| 19 | namespace Tegra { | 21 | namespace Tegra { |
| 20 | struct FramebufferConfig; | 22 | struct FramebufferConfig; |
| 21 | } | 23 | } |
| @@ -47,7 +49,7 @@ class BlitScreen { | |||
| 47 | public: | 49 | public: |
| 48 | explicit BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory, const Device& device, | 50 | explicit BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory, const Device& device, |
| 49 | MemoryAllocator& memory_allocator, PresentManager& present_manager, | 51 | MemoryAllocator& memory_allocator, PresentManager& present_manager, |
| 50 | Scheduler& scheduler); | 52 | Scheduler& scheduler, const PresentFilters& filters); |
| 51 | ~BlitScreen(); | 53 | ~BlitScreen(); |
| 52 | 54 | ||
| 53 | void DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, | 55 | void DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, |
| @@ -70,6 +72,7 @@ private: | |||
| 70 | MemoryAllocator& memory_allocator; | 72 | MemoryAllocator& memory_allocator; |
| 71 | PresentManager& present_manager; | 73 | PresentManager& present_manager; |
| 72 | Scheduler& scheduler; | 74 | Scheduler& scheduler; |
| 75 | const PresentFilters& filters; | ||
| 73 | std::size_t image_count{}; | 76 | std::size_t image_count{}; |
| 74 | std::size_t image_index{}; | 77 | std::size_t image_index{}; |
| 75 | VkFormat swapchain_view_format{}; | 78 | VkFormat swapchain_view_format{}; |