diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.cpp | 89 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_blit_screen.h | 20 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 27 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 14 |
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 | ||
| 171 | void Vulkan::RendererVulkan::RenderScreenshot(const Tegra::FramebufferConfig& framebuffer, | 164 | void 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: | |||
| 59 | private: | 59 | private: |
| 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 { | |||
| 124 | BlitScreen::BlitScreen(Tegra::MaxwellDeviceMemoryManager& device_memory_, | 124 | BlitScreen::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 | ||
| 139 | BlitScreen::~BlitScreen() = default; | 138 | BlitScreen::~BlitScreen() = default; |
| 140 | 139 | ||
| 141 | static 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 | |||
| 191 | void BlitScreen::Recreate() { | 140 | void 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 | ||
| 198 | void BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer, | 147 | void 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 | ||
| 483 | void BlitScreen::DrawToSwapchain(Frame* frame, const Tegra::FramebufferConfig& framebuffer, | 439 | void 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 | ||
| 1436 | void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig& framebuffer, | 1392 | void 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 | ||
| 33 | namespace Vulkan { | 33 | namespace Vulkan { |
| 34 | 34 | ||
| 35 | struct ScreenInfo; | ||
| 36 | |||
| 37 | class Device; | 35 | class Device; |
| 38 | class FSR; | 36 | class FSR; |
| 39 | class RasterizerVulkan; | 37 | class RasterizerVulkan; |
| @@ -44,7 +42,7 @@ class PresentManager; | |||
| 44 | 42 | ||
| 45 | struct Frame; | 43 | struct Frame; |
| 46 | 44 | ||
| 47 | struct ScreenInfo { | 45 | struct 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 | ||
| 166 | RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, | 166 | RasterizerVulkan::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 | ||
| 786 | bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, | 785 | std::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 | ||
| 805 | void RasterizerVulkan::LoadDiskResources(u64 title_id, std::stop_token stop_loading, | 806 | void 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 | ||
| 44 | namespace Vulkan { | 44 | namespace Vulkan { |
| 45 | 45 | ||
| 46 | struct ScreenInfo; | 46 | struct FramebufferTextureInfo; |
| 47 | 47 | ||
| 48 | class StateTracker; | 48 | class StateTracker; |
| 49 | 49 | ||
| @@ -78,9 +78,8 @@ class RasterizerVulkan final : public VideoCore::RasterizerInterface, | |||
| 78 | public: | 78 | public: |
| 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 | |||
| 140 | private: | 141 | private: |
| 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; |