summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Liam2024-01-03 22:46:59 -0500
committerGravatar Liam2024-01-31 11:27:20 -0500
commit80de01a5b4a7f57ec7850079fbd38fac76b9d08f (patch)
tree18086d7a71ffcd9f5bc6651aec20de37e3b1c33d /src/video_core/renderer_vulkan
parentMerge pull request #12760 from liamwhite/mp-am (diff)
downloadyuzu-80de01a5b4a7f57ec7850079fbd38fac76b9d08f.tar.gz
yuzu-80de01a5b4a7f57ec7850079fbd38fac76b9d08f.tar.xz
yuzu-80de01a5b4a7f57ec7850079fbd38fac76b9d08f.zip
video_core: simplify accelerated surface fetch and crop handling between APIs
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp22
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.cpp89
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.h20
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp27
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h14
6 files changed, 61 insertions, 115 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index 1631276c6..e1fe53bbd 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -98,9 +98,9 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_,
98 present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain, 98 present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain,
99 surface), 99 surface),
100 blit_screen(device_memory, render_window, device, memory_allocator, swapchain, 100 blit_screen(device_memory, render_window, device, memory_allocator, swapchain,
101 present_manager, scheduler, screen_info), 101 present_manager, scheduler),
102 rasterizer(render_window, gpu, device_memory, screen_info, device, memory_allocator, 102 rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker,
103 state_tracker, scheduler) { 103 scheduler) {
104 if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { 104 if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) {
105 turbo_mode.emplace(instance, dld); 105 turbo_mode.emplace(instance, dld);
106 scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); 106 scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); });
@@ -124,17 +124,10 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
124 if (!render_window.IsShown()) { 124 if (!render_window.IsShown()) {
125 return; 125 return;
126 } 126 }
127 // Update screen info if the framebuffer size has changed.
128 screen_info.width = framebuffer->width;
129 screen_info.height = framebuffer->height;
130
131 const DAddr framebuffer_addr = framebuffer->address + framebuffer->offset;
132 const bool use_accelerated =
133 rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride);
134 RenderScreenshot(*framebuffer, use_accelerated);
135 127
128 RenderScreenshot(*framebuffer);
136 Frame* frame = present_manager.GetRenderFrame(); 129 Frame* frame = present_manager.GetRenderFrame();
137 blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated); 130 blit_screen.DrawToSwapchain(rasterizer, frame, *framebuffer);
138 scheduler.Flush(*frame->render_ready); 131 scheduler.Flush(*frame->render_ready);
139 present_manager.Present(frame); 132 present_manager.Present(frame);
140 133
@@ -168,8 +161,7 @@ void RendererVulkan::Report() const {
168 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions); 161 telemetry_session.AddField(field, "GPU_Vulkan_Extensions", extensions);
169} 162}
170 163
171void Vulkan::RendererVulkan::RenderScreenshot(const Tegra::FramebufferConfig& framebuffer, 164void Vulkan::RendererVulkan::RenderScreenshot(const Tegra::FramebufferConfig& framebuffer) {
172 bool use_accelerated) {
173 if (!renderer_settings.screenshot_requested) { 165 if (!renderer_settings.screenshot_requested) {
174 return; 166 return;
175 } 167 }
@@ -221,7 +213,7 @@ void Vulkan::RendererVulkan::RenderScreenshot(const Tegra::FramebufferConfig& fr
221 }); 213 });
222 const VkExtent2D render_area{.width = layout.width, .height = layout.height}; 214 const VkExtent2D render_area{.width = layout.width, .height = layout.height};
223 const vk::Framebuffer screenshot_fb = blit_screen.CreateFramebuffer(*dst_view, render_area); 215 const vk::Framebuffer screenshot_fb = blit_screen.CreateFramebuffer(*dst_view, render_area);
224 blit_screen.Draw(framebuffer, *screenshot_fb, layout, render_area, use_accelerated); 216 blit_screen.Draw(rasterizer, framebuffer, *screenshot_fb, layout, render_area);
225 217
226 const auto buffer_size = static_cast<VkDeviceSize>(layout.width * layout.height * 4); 218 const auto buffer_size = static_cast<VkDeviceSize>(layout.width * layout.height * 4);
227 const VkBufferCreateInfo dst_buffer_info{ 219 const VkBufferCreateInfo dst_buffer_info{
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h
index 11c52287a..d7d006b20 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.h
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.h
@@ -59,7 +59,7 @@ public:
59private: 59private:
60 void Report() const; 60 void Report() const;
61 61
62 void RenderScreenshot(const Tegra::FramebufferConfig& framebuffer, bool use_accelerated); 62 void RenderScreenshot(const Tegra::FramebufferConfig& framebuffer);
63 63
64 Core::TelemetrySession& telemetry_session; 64 Core::TelemetrySession& telemetry_session;
65 Tegra::MaxwellDeviceMemoryManager& device_memory; 65 Tegra::MaxwellDeviceMemoryManager& device_memory;
@@ -72,8 +72,6 @@ private:
72 vk::DebugUtilsMessenger debug_messenger; 72 vk::DebugUtilsMessenger debug_messenger;
73 vk::SurfaceKHR surface; 73 vk::SurfaceKHR surface;
74 74
75 ScreenInfo screen_info;
76
77 Device device; 75 Device device;
78 MemoryAllocator memory_allocator; 76 MemoryAllocator memory_allocator;
79 StateTracker state_tracker; 77 StateTracker state_tracker;
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index 610f27c84..c21a9c8fe 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -124,11 +124,10 @@ struct BlitScreen::BufferData {
124BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_, 124BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_,
125 Core::Frontend::EmuWindow& render_window_, const Device& device_, 125 Core::Frontend::EmuWindow& render_window_, const Device& device_,
126 MemoryAllocator& memory_allocator_, Swapchain& swapchain_, 126 MemoryAllocator& memory_allocator_, Swapchain& swapchain_,
127 PresentManager& present_manager_, Scheduler& scheduler_, 127 PresentManager& present_manager_, Scheduler& scheduler_)
128 const ScreenInfo& screen_info_)
129 : device_memory{device_memory_}, render_window{render_window_}, device{device_}, 128 : device_memory{device_memory_}, render_window{render_window_}, device{device_},
130 memory_allocator{memory_allocator_}, swapchain{swapchain_}, present_manager{present_manager_}, 129 memory_allocator{memory_allocator_}, swapchain{swapchain_}, present_manager{present_manager_},
131 scheduler{scheduler_}, image_count{swapchain.GetImageCount()}, screen_info{screen_info_} { 130 scheduler{scheduler_}, image_count{swapchain.GetImageCount()} {
132 resource_ticks.resize(image_count); 131 resource_ticks.resize(image_count);
133 swapchain_view_format = swapchain.GetImageViewFormat(); 132 swapchain_view_format = swapchain.GetImageViewFormat();
134 133
@@ -138,56 +137,6 @@ BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_,
138 137
139BlitScreen::~BlitScreen() = default; 138BlitScreen::~BlitScreen() = default;
140 139
141static Common::Rectangle<f32> NormalizeCrop(const Tegra::FramebufferConfig& framebuffer,
142 const ScreenInfo& screen_info) {
143 f32 left, top, right, bottom;
144
145 if (!framebuffer.crop_rect.IsEmpty()) {
146 // If crop rectangle is not empty, apply properties from rectangle.
147 left = static_cast<f32>(framebuffer.crop_rect.left);
148 top = static_cast<f32>(framebuffer.crop_rect.top);
149 right = static_cast<f32>(framebuffer.crop_rect.right);
150 bottom = static_cast<f32>(framebuffer.crop_rect.bottom);
151 } else {
152 // Otherwise, fall back to framebuffer dimensions.
153 left = 0;
154 top = 0;
155 right = static_cast<f32>(framebuffer.width);
156 bottom = static_cast<f32>(framebuffer.height);
157 }
158
159 // Apply transformation flags.
160 auto framebuffer_transform_flags = framebuffer.transform_flags;
161
162 if (True(framebuffer_transform_flags & Service::android::BufferTransformFlags::FlipH)) {
163 // Switch left and right.
164 std::swap(left, right);
165 }
166 if (True(framebuffer_transform_flags & Service::android::BufferTransformFlags::FlipV)) {
167 // Switch top and bottom.
168 std::swap(top, bottom);
169 }
170
171 framebuffer_transform_flags &= ~Service::android::BufferTransformFlags::FlipH;
172 framebuffer_transform_flags &= ~Service::android::BufferTransformFlags::FlipV;
173 if (True(framebuffer_transform_flags)) {
174 UNIMPLEMENTED_MSG("Unsupported framebuffer_transform_flags={}",
175 static_cast<u32>(framebuffer_transform_flags));
176 }
177
178 // Get the screen properties.
179 const f32 screen_width = static_cast<f32>(screen_info.width);
180 const f32 screen_height = static_cast<f32>(screen_info.height);
181
182 // Normalize coordinate space.
183 left /= screen_width;
184 top /= screen_height;
185 right /= screen_width;
186 bottom /= screen_height;
187
188 return Common::Rectangle<f32>(left, top, right, bottom);
189}
190
191void BlitScreen::Recreate() { 140void BlitScreen::Recreate() {
192 present_manager.WaitPresent(); 141 present_manager.WaitPresent();
193 scheduler.Finish(); 142 scheduler.Finish();
@@ -195,9 +144,16 @@ void BlitScreen::Recreate() {
195 CreateDynamicResources(); 144 CreateDynamicResources();
196} 145}
197 146
198void BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, 147void BlitScreen::Draw(RasterizerVulkan& rasterizer, const Tegra::FramebufferConfig& framebuffer,
199 const VkFramebuffer& host_framebuffer, const Layout::FramebufferLayout layout, 148 const VkFramebuffer& host_framebuffer, const Layout::FramebufferLayout layout,
200 VkExtent2D render_area, bool use_accelerated) { 149 VkExtent2D render_area) {
150
151 const auto texture_info = rasterizer.AccelerateDisplay(
152 framebuffer, framebuffer.address + framebuffer.offset, framebuffer.stride);
153 const u32 texture_width = texture_info ? texture_info->width : framebuffer.width;
154 const u32 texture_height = texture_info ? texture_info->height : framebuffer.height;
155 const bool use_accelerated = texture_info.has_value();
156
201 RefreshResources(framebuffer); 157 RefreshResources(framebuffer);
202 158
203 // Finish any pending renderpass 159 // Finish any pending renderpass
@@ -206,13 +162,13 @@ void BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,
206 scheduler.Wait(resource_ticks[image_index]); 162 scheduler.Wait(resource_ticks[image_index]);
207 resource_ticks[image_index] = scheduler.CurrentTick(); 163 resource_ticks[image_index] = scheduler.CurrentTick();
208 164
209 VkImage source_image = use_accelerated ? screen_info.image : *raw_images[image_index]; 165 VkImage source_image = texture_info ? texture_info->image : *raw_images[image_index];
210 VkImageView source_image_view = 166 VkImageView source_image_view =
211 use_accelerated ? screen_info.image_view : *raw_image_views[image_index]; 167 texture_info ? texture_info->image_view : *raw_image_views[image_index];
212 168
213 BufferData data; 169 BufferData data;
214 SetUniformData(data, layout); 170 SetUniformData(data, layout);
215 SetVertexData(data, framebuffer, layout); 171 SetVertexData(data, framebuffer, layout, texture_width, texture_height);
216 172
217 const std::span<u8> mapped_span = buffer.Mapped(); 173 const std::span<u8> mapped_span = buffer.Mapped();
218 std::memcpy(mapped_span.data(), &data, sizeof(data)); 174 std::memcpy(mapped_span.data(), &data, sizeof(data));
@@ -405,10 +361,10 @@ void BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,
405 source_image_view = smaa->Draw(scheduler, image_index, source_image, source_image_view); 361 source_image_view = smaa->Draw(scheduler, image_index, source_image, source_image_view);
406 } 362 }
407 if (fsr) { 363 if (fsr) {
408 const auto crop_rect = NormalizeCrop(framebuffer, screen_info); 364 const auto crop_rect = Tegra::NormalizeCrop(framebuffer, texture_width, texture_height);
409 const VkExtent2D fsr_input_size{ 365 const VkExtent2D fsr_input_size{
410 .width = Settings::values.resolution_info.ScaleUp(screen_info.width), 366 .width = Settings::values.resolution_info.ScaleUp(texture_width),
411 .height = Settings::values.resolution_info.ScaleUp(screen_info.height), 367 .height = Settings::values.resolution_info.ScaleUp(texture_height),
412 }; 368 };
413 VkImageView fsr_image_view = 369 VkImageView fsr_image_view =
414 fsr->Draw(scheduler, image_index, source_image_view, fsr_input_size, crop_rect); 370 fsr->Draw(scheduler, image_index, source_image_view, fsr_input_size, crop_rect);
@@ -480,8 +436,8 @@ void BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,
480 }); 436 });
481} 437}
482 438
483void BlitScreen::DrawToSwapchain(Frame* frame, const Tegra::FramebufferConfig& framebuffer, 439void BlitScreen::DrawToSwapchain(RasterizerVulkan& rasterizer, Frame* frame,
484 bool use_accelerated) { 440 const Tegra::FramebufferConfig& framebuffer) {
485 // Recreate dynamic resources if the the image count or input format changed 441 // Recreate dynamic resources if the the image count or input format changed
486 const VkFormat current_framebuffer_format = 442 const VkFormat current_framebuffer_format =
487 std::exchange(framebuffer_view_format, GetFormat(framebuffer)); 443 std::exchange(framebuffer_view_format, GetFormat(framebuffer));
@@ -500,7 +456,7 @@ void BlitScreen::DrawToSwapchain(Frame* frame, const Tegra::FramebufferConfig& f
500 } 456 }
501 457
502 const VkExtent2D render_area{frame->width, frame->height}; 458 const VkExtent2D render_area{frame->width, frame->height};
503 Draw(framebuffer, *frame->framebuffer, layout, render_area, use_accelerated); 459 Draw(rasterizer, framebuffer, *frame->framebuffer, layout, render_area);
504 if (++image_index >= image_count) { 460 if (++image_index >= image_count) {
505 image_index = 0; 461 image_index = 0;
506 } 462 }
@@ -1434,7 +1390,8 @@ void BlitScreen::SetUniformData(BufferData& data, const Layout::FramebufferLayou
1434} 1390}
1435 1391
1436void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig& framebuffer, 1392void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig& framebuffer,
1437 const Layout::FramebufferLayout layout) const { 1393 const Layout::FramebufferLayout layout, u32 texture_width,
1394 u32 texture_height) const {
1438 f32 left, top, right, bottom; 1395 f32 left, top, right, bottom;
1439 1396
1440 if (fsr) { 1397 if (fsr) {
@@ -1446,7 +1403,7 @@ void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig&
1446 bottom = 1; 1403 bottom = 1;
1447 } else { 1404 } else {
1448 // Get the normalized crop rectangle. 1405 // Get the normalized crop rectangle.
1449 const auto crop = NormalizeCrop(framebuffer, screen_info); 1406 const auto crop = Tegra::NormalizeCrop(framebuffer, texture_width, texture_height);
1450 1407
1451 // Apply the crop. 1408 // Apply the crop.
1452 left = crop.left; 1409 left = crop.left;
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.h b/src/video_core/renderer_vulkan/vk_blit_screen.h
index 3eff76009..40338886a 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.h
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.h
@@ -32,8 +32,6 @@ enum class PixelFormat : u32;
32 32
33namespace Vulkan { 33namespace Vulkan {
34 34
35struct ScreenInfo;
36
37class Device; 35class Device;
38class FSR; 36class FSR;
39class RasterizerVulkan; 37class RasterizerVulkan;
@@ -44,7 +42,7 @@ class PresentManager;
44 42
45struct Frame; 43struct Frame;
46 44
47struct ScreenInfo { 45struct FramebufferTextureInfo {
48 VkImage image{}; 46 VkImage image{};
49 VkImageView image_view{}; 47 VkImageView image_view{};
50 u32 width{}; 48 u32 width{};
@@ -56,17 +54,17 @@ public:
56 explicit BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory, 54 explicit BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory,
57 Core::Frontend::EmuWindow& render_window, const Device& device, 55 Core::Frontend::EmuWindow& render_window, const Device& device,
58 MemoryAllocator& memory_manager, Swapchain& swapchain, 56 MemoryAllocator& memory_manager, Swapchain& swapchain,
59 PresentManager& present_manager, Scheduler& scheduler, 57 PresentManager& present_manager, Scheduler& scheduler);
60 const ScreenInfo& screen_info);
61 ~BlitScreen(); 58 ~BlitScreen();
62 59
63 void Recreate(); 60 void Recreate();
64 61
65 void Draw(const Tegra::FramebufferConfig& framebuffer, const VkFramebuffer& host_framebuffer, 62 void Draw(RasterizerVulkan& rasterizer, const Tegra::FramebufferConfig& framebuffer,
66 const Layout::FramebufferLayout layout, VkExtent2D render_area, bool use_accelerated); 63 const VkFramebuffer& host_framebuffer, const Layout::FramebufferLayout layout,
64 VkExtent2D render_area);
67 65
68 void DrawToSwapchain(Frame* frame, const Tegra::FramebufferConfig& framebuffer, 66 void DrawToSwapchain(RasterizerVulkan& rasterizer, Frame* frame,
69 bool use_accelerated); 67 const Tegra::FramebufferConfig& framebuffer);
70 68
71 [[nodiscard]] vk::Framebuffer CreateFramebuffer(const VkImageView& image_view, 69 [[nodiscard]] vk::Framebuffer CreateFramebuffer(const VkImageView& image_view,
72 VkExtent2D extent); 70 VkExtent2D extent);
@@ -99,7 +97,8 @@ private:
99 void UpdateAADescriptorSet(VkImageView image_view, bool nn) const; 97 void UpdateAADescriptorSet(VkImageView image_view, bool nn) const;
100 void SetUniformData(BufferData& data, const Layout::FramebufferLayout layout) const; 98 void SetUniformData(BufferData& data, const Layout::FramebufferLayout layout) const;
101 void SetVertexData(BufferData& data, const Tegra::FramebufferConfig& framebuffer, 99 void SetVertexData(BufferData& data, const Tegra::FramebufferConfig& framebuffer,
102 const Layout::FramebufferLayout layout) const; 100 const Layout::FramebufferLayout layout, u32 texture_width,
101 u32 texture_height) const;
103 102
104 void CreateSMAA(VkExtent2D smaa_size); 103 void CreateSMAA(VkExtent2D smaa_size);
105 void CreateFSR(); 104 void CreateFSR();
@@ -116,7 +115,6 @@ private:
116 Scheduler& scheduler; 115 Scheduler& scheduler;
117 std::size_t image_count; 116 std::size_t image_count;
118 std::size_t image_index{}; 117 std::size_t image_index{};
119 const ScreenInfo& screen_info;
120 118
121 vk::ShaderModule vertex_shader; 119 vk::ShaderModule vertex_shader;
122 vk::ShaderModule fxaa_vertex_shader; 120 vk::ShaderModule fxaa_vertex_shader;
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 5bf41b81f..e593d7225 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -165,10 +165,9 @@ DrawParams MakeDrawParams(const MaxwellDrawState& draw_state, u32 num_instances,
165 165
166RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, 166RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_,
167 Tegra::MaxwellDeviceMemoryManager& device_memory_, 167 Tegra::MaxwellDeviceMemoryManager& device_memory_,
168 ScreenInfo& screen_info_, const Device& device_, 168 const Device& device_, MemoryAllocator& memory_allocator_,
169 MemoryAllocator& memory_allocator_, StateTracker& state_tracker_, 169 StateTracker& state_tracker_, Scheduler& scheduler_)
170 Scheduler& scheduler_) 170 : gpu{gpu_}, device_memory{device_memory_}, device{device_},
171 : gpu{gpu_}, device_memory{device_memory_}, screen_info{screen_info_}, device{device_},
172 memory_allocator{memory_allocator_}, state_tracker{state_tracker_}, scheduler{scheduler_}, 171 memory_allocator{memory_allocator_}, state_tracker{state_tracker_}, scheduler{scheduler_},
173 staging_pool(device, memory_allocator, scheduler), descriptor_pool(device, scheduler), 172 staging_pool(device, memory_allocator, scheduler), descriptor_pool(device, scheduler),
174 guest_descriptor_queue(device, scheduler), compute_pass_descriptor_queue(device, scheduler), 173 guest_descriptor_queue(device, scheduler), compute_pass_descriptor_queue(device, scheduler),
@@ -783,23 +782,25 @@ void RasterizerVulkan::AccelerateInlineToMemory(GPUVAddr address, size_t copy_si
783 query_cache.InvalidateRegion(*cpu_addr, copy_size); 782 query_cache.InvalidateRegion(*cpu_addr, copy_size);
784} 783}
785 784
786bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, 785std::optional<FramebufferTextureInfo> RasterizerVulkan::AccelerateDisplay(
787 DAddr framebuffer_addr, u32 pixel_stride) { 786 const Tegra::FramebufferConfig& config, DAddr framebuffer_addr, u32 pixel_stride) {
788 if (!framebuffer_addr) { 787 if (!framebuffer_addr) {
789 return false; 788 return {};
790 } 789 }
791 std::scoped_lock lock{texture_cache.mutex}; 790 std::scoped_lock lock{texture_cache.mutex};
792 ImageView* const image_view = 791 ImageView* const image_view =
793 texture_cache.TryFindFramebufferImageView(config, framebuffer_addr); 792 texture_cache.TryFindFramebufferImageView(config, framebuffer_addr);
794 if (!image_view) { 793 if (!image_view) {
795 return false; 794 return {};
796 } 795 }
797 query_cache.NotifySegment(false); 796 query_cache.NotifySegment(false);
798 screen_info.image = image_view->ImageHandle(); 797
799 screen_info.image_view = image_view->Handle(Shader::TextureType::Color2D); 798 FramebufferTextureInfo info{};
800 screen_info.width = image_view->size.width; 799 info.image = image_view->ImageHandle();
801 screen_info.height = image_view->size.height; 800 info.image_view = image_view->Handle(Shader::TextureType::Color2D);
802 return true; 801 info.width = image_view->size.width;
802 info.height = image_view->size.height;
803 return info;
803} 804}
804 805
805void RasterizerVulkan::LoadDiskResources(u64 title_id, std::stop_token stop_loading, 806void RasterizerVulkan::LoadDiskResources(u64 title_id, std::stop_token stop_loading,
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h
index 881ee0993..0617b37f0 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.h
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.h
@@ -43,7 +43,7 @@ class Maxwell3D;
43 43
44namespace Vulkan { 44namespace Vulkan {
45 45
46struct ScreenInfo; 46struct FramebufferTextureInfo;
47 47
48class StateTracker; 48class StateTracker;
49 49
@@ -78,9 +78,8 @@ class RasterizerVulkan final : public VideoCore::RasterizerInterface,
78public: 78public:
79 explicit RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, 79 explicit RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_,
80 Tegra::MaxwellDeviceMemoryManager& device_memory_, 80 Tegra::MaxwellDeviceMemoryManager& device_memory_,
81 ScreenInfo& screen_info_, const Device& device_, 81 const Device& device_, MemoryAllocator& memory_allocator_,
82 MemoryAllocator& memory_allocator_, StateTracker& state_tracker_, 82 StateTracker& state_tracker_, Scheduler& scheduler_);
83 Scheduler& scheduler_);
84 ~RasterizerVulkan() override; 83 ~RasterizerVulkan() override;
85 84
86 void Draw(bool is_indexed, u32 instance_count) override; 85 void Draw(bool is_indexed, u32 instance_count) override;
@@ -126,8 +125,6 @@ public:
126 Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; 125 Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override;
127 void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, 126 void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size,
128 std::span<const u8> memory) override; 127 std::span<const u8> memory) override;
129 bool AccelerateDisplay(const Tegra::FramebufferConfig& config, DAddr framebuffer_addr,
130 u32 pixel_stride) override;
131 void LoadDiskResources(u64 title_id, std::stop_token stop_loading, 128 void LoadDiskResources(u64 title_id, std::stop_token stop_loading,
132 const VideoCore::DiskResourceLoadCallback& callback) override; 129 const VideoCore::DiskResourceLoadCallback& callback) override;
133 130
@@ -137,6 +134,10 @@ public:
137 134
138 void ReleaseChannel(s32 channel_id) override; 135 void ReleaseChannel(s32 channel_id) override;
139 136
137 std::optional<FramebufferTextureInfo> AccelerateDisplay(const Tegra::FramebufferConfig& config,
138 VAddr framebuffer_addr,
139 u32 pixel_stride);
140
140private: 141private:
141 static constexpr size_t MAX_TEXTURES = 192; 142 static constexpr size_t MAX_TEXTURES = 192;
142 static constexpr size_t MAX_IMAGES = 48; 143 static constexpr size_t MAX_IMAGES = 48;
@@ -182,7 +183,6 @@ private:
182 Tegra::GPU& gpu; 183 Tegra::GPU& gpu;
183 Tegra::MaxwellDeviceMemoryManager& device_memory; 184 Tegra::MaxwellDeviceMemoryManager& device_memory;
184 185
185 ScreenInfo& screen_info;
186 const Device& device; 186 const Device& device;
187 MemoryAllocator& memory_allocator; 187 MemoryAllocator& memory_allocator;
188 StateTracker& state_tracker; 188 StateTracker& state_tracker;