diff options
| author | 2022-01-31 18:08:21 -0700 | |
|---|---|---|
| committer | 2022-01-31 18:08:21 -0700 | |
| commit | 34dc1c8bc2fc7d837787a4e779f354b339b12799 (patch) | |
| tree | 5bbbdf9b9e67a8374c9b19cb2166d817abe60a9b /src/video_core/renderer_vulkan | |
| parent | Merge pull request #7791 from german77/wall_clock (diff) | |
| parent | Rasterizer: Refactor inlineToMemory. (diff) | |
| download | yuzu-34dc1c8bc2fc7d837787a4e779f354b339b12799.tar.gz yuzu-34dc1c8bc2fc7d837787a4e779f354b339b12799.tar.xz yuzu-34dc1c8bc2fc7d837787a4e779f354b339b12799.zip | |
Merge pull request #7805 from FernandoS27/rodrigo-failed-me
Inline2Memory: Flush before writing buffer.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index fd334a146..2227d9197 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -548,6 +548,28 @@ Tegra::Engines::AccelerateDMAInterface& RasterizerVulkan::AccessAccelerateDMA() | |||
| 548 | return accelerate_dma; | 548 | return accelerate_dma; |
| 549 | } | 549 | } |
| 550 | 550 | ||
| 551 | void RasterizerVulkan::AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, | ||
| 552 | std::span<u8> memory) { | ||
| 553 | auto cpu_addr = gpu_memory.GpuToCpuAddress(address); | ||
| 554 | if (!cpu_addr) [[unlikely]] { | ||
| 555 | gpu_memory.WriteBlock(address, memory.data(), copy_size); | ||
| 556 | return; | ||
| 557 | } | ||
| 558 | gpu_memory.WriteBlockUnsafe(address, memory.data(), copy_size); | ||
| 559 | { | ||
| 560 | std::unique_lock<std::mutex> lock{buffer_cache.mutex}; | ||
| 561 | if (!buffer_cache.InlineMemory(*cpu_addr, copy_size, memory)) { | ||
| 562 | buffer_cache.WriteMemory(*cpu_addr, copy_size); | ||
| 563 | } | ||
| 564 | } | ||
| 565 | { | ||
| 566 | std::scoped_lock lock_texture{texture_cache.mutex}; | ||
| 567 | texture_cache.WriteMemory(*cpu_addr, copy_size); | ||
| 568 | } | ||
| 569 | pipeline_cache.InvalidateRegion(*cpu_addr, copy_size); | ||
| 570 | query_cache.InvalidateRegion(*cpu_addr, copy_size); | ||
| 571 | } | ||
| 572 | |||
| 551 | bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, | 573 | bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config, |
| 552 | VAddr framebuffer_addr, u32 pixel_stride) { | 574 | VAddr framebuffer_addr, u32 pixel_stride) { |
| 553 | if (!framebuffer_addr) { | 575 | if (!framebuffer_addr) { |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 866827247..5af2e275b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -99,6 +99,8 @@ public: | |||
| 99 | const Tegra::Engines::Fermi2D::Surface& dst, | 99 | const Tegra::Engines::Fermi2D::Surface& dst, |
| 100 | const Tegra::Engines::Fermi2D::Config& copy_config) override; | 100 | const Tegra::Engines::Fermi2D::Config& copy_config) override; |
| 101 | Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; | 101 | Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; |
| 102 | void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, | ||
| 103 | std::span<u8> memory) override; | ||
| 102 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, | 104 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, |
| 103 | u32 pixel_stride) override; | 105 | u32 pixel_stride) override; |
| 104 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, | 106 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, |