diff options
| author | 2022-11-20 03:07:14 +0100 | |
|---|---|---|
| committer | 2023-01-01 16:43:58 -0500 | |
| commit | 3630bfaef332768e08ecc0c34cd4bca83a2579f8 (patch) | |
| tree | 6bd52f659411c16300ab437a418df3e0283d1c31 /src/video_core/renderer_vulkan | |
| parent | Vulkan: Allow stagging buffer deferrals. (diff) | |
| download | yuzu-3630bfaef332768e08ecc0c34cd4bca83a2579f8.tar.gz yuzu-3630bfaef332768e08ecc0c34cd4bca83a2579f8.tar.xz yuzu-3630bfaef332768e08ecc0c34cd4bca83a2579f8.zip | |
RasterizerMemory: Add filtering for flushing/invalidation operations.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 52 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 13 |
2 files changed, 44 insertions, 21 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 143af93c5..463c49f9c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -423,41 +423,58 @@ void Vulkan::RasterizerVulkan::DisableGraphicsUniformBuffer(size_t stage, u32 in | |||
| 423 | 423 | ||
| 424 | void RasterizerVulkan::FlushAll() {} | 424 | void RasterizerVulkan::FlushAll() {} |
| 425 | 425 | ||
| 426 | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { | 426 | void RasterizerVulkan::FlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { |
| 427 | if (addr == 0 || size == 0) { | 427 | if (addr == 0 || size == 0) { |
| 428 | return; | 428 | return; |
| 429 | } | 429 | } |
| 430 | { | 430 | if (bool(which & VideoCommon::CacheType::TextureCache)) { |
| 431 | std::scoped_lock lock{texture_cache.mutex}; | 431 | std::scoped_lock lock{texture_cache.mutex}; |
| 432 | texture_cache.DownloadMemory(addr, size); | 432 | texture_cache.DownloadMemory(addr, size); |
| 433 | } | 433 | } |
| 434 | { | 434 | if ((bool(which & VideoCommon::CacheType::BufferCache))) { |
| 435 | std::scoped_lock lock{buffer_cache.mutex}; | 435 | std::scoped_lock lock{buffer_cache.mutex}; |
| 436 | buffer_cache.DownloadMemory(addr, size); | 436 | buffer_cache.DownloadMemory(addr, size); |
| 437 | } | 437 | } |
| 438 | query_cache.FlushRegion(addr, size); | 438 | if ((bool(which & VideoCommon::CacheType::QueryCache))) { |
| 439 | query_cache.FlushRegion(addr, size); | ||
| 440 | } | ||
| 439 | } | 441 | } |
| 440 | 442 | ||
| 441 | bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size) { | 443 | bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { |
| 442 | std::scoped_lock lock{texture_cache.mutex, buffer_cache.mutex}; | 444 | if ((bool(which & VideoCommon::CacheType::BufferCache))) { |
| 443 | return texture_cache.IsRegionGpuModified(addr, size) || | 445 | std::scoped_lock lock{buffer_cache.mutex}; |
| 444 | buffer_cache.IsRegionGpuModified(addr, size); | 446 | if (buffer_cache.IsRegionGpuModified(addr, size)) { |
| 447 | return true; | ||
| 448 | } | ||
| 449 | } | ||
| 450 | if (!Settings::IsGPULevelHigh()) { | ||
| 451 | return false; | ||
| 452 | } | ||
| 453 | if (bool(which & VideoCommon::CacheType::TextureCache)) { | ||
| 454 | std::scoped_lock lock{texture_cache.mutex}; | ||
| 455 | return texture_cache.IsRegionGpuModified(addr, size); | ||
| 456 | } | ||
| 457 | return false; | ||
| 445 | } | 458 | } |
| 446 | 459 | ||
| 447 | void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size) { | 460 | void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { |
| 448 | if (addr == 0 || size == 0) { | 461 | if (addr == 0 || size == 0) { |
| 449 | return; | 462 | return; |
| 450 | } | 463 | } |
| 451 | { | 464 | if (bool(which & VideoCommon::CacheType::TextureCache)) { |
| 452 | std::scoped_lock lock{texture_cache.mutex}; | 465 | std::scoped_lock lock{texture_cache.mutex}; |
| 453 | texture_cache.WriteMemory(addr, size); | 466 | texture_cache.WriteMemory(addr, size); |
| 454 | } | 467 | } |
| 455 | { | 468 | if ((bool(which & VideoCommon::CacheType::BufferCache))) { |
| 456 | std::scoped_lock lock{buffer_cache.mutex}; | 469 | std::scoped_lock lock{buffer_cache.mutex}; |
| 457 | buffer_cache.WriteMemory(addr, size); | 470 | buffer_cache.WriteMemory(addr, size); |
| 458 | } | 471 | } |
| 459 | pipeline_cache.InvalidateRegion(addr, size); | 472 | if ((bool(which & VideoCommon::CacheType::QueryCache))) { |
| 460 | query_cache.InvalidateRegion(addr, size); | 473 | query_cache.InvalidateRegion(addr, size); |
| 474 | } | ||
| 475 | if ((bool(which & VideoCommon::CacheType::ShaderCache))) { | ||
| 476 | pipeline_cache.InvalidateRegion(addr, size); | ||
| 477 | } | ||
| 461 | } | 478 | } |
| 462 | 479 | ||
| 463 | void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { | 480 | void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { |
| @@ -522,11 +539,12 @@ void RasterizerVulkan::ReleaseFences() { | |||
| 522 | fence_manager.WaitPendingFences(); | 539 | fence_manager.WaitPendingFences(); |
| 523 | } | 540 | } |
| 524 | 541 | ||
| 525 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { | 542 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size, |
| 543 | VideoCommon::CacheType which) { | ||
| 526 | if (Settings::IsGPULevelExtreme()) { | 544 | if (Settings::IsGPULevelExtreme()) { |
| 527 | FlushRegion(addr, size); | 545 | FlushRegion(addr, size, which); |
| 528 | } | 546 | } |
| 529 | InvalidateRegion(addr, size); | 547 | InvalidateRegion(addr, size, which); |
| 530 | } | 548 | } |
| 531 | 549 | ||
| 532 | void RasterizerVulkan::WaitForIdle() { | 550 | void RasterizerVulkan::WaitForIdle() { |
| @@ -602,7 +620,7 @@ void RasterizerVulkan::AccelerateInlineToMemory(GPUVAddr address, size_t copy_si | |||
| 602 | } | 620 | } |
| 603 | gpu_memory->WriteBlockUnsafe(address, memory.data(), copy_size); | 621 | gpu_memory->WriteBlockUnsafe(address, memory.data(), copy_size); |
| 604 | { | 622 | { |
| 605 | std::unique_lock<std::mutex> lock{buffer_cache.mutex}; | 623 | std::unique_lock<std::recursive_mutex> lock{buffer_cache.mutex}; |
| 606 | if (!buffer_cache.InlineMemory(*cpu_addr, copy_size, memory)) { | 624 | if (!buffer_cache.InlineMemory(*cpu_addr, copy_size, memory)) { |
| 607 | buffer_cache.WriteMemory(*cpu_addr, copy_size); | 625 | buffer_cache.WriteMemory(*cpu_addr, copy_size); |
| 608 | } | 626 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 839de6b26..82b28a54a 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -73,9 +73,12 @@ public: | |||
| 73 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | 73 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; |
| 74 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | 74 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; |
| 75 | void FlushAll() override; | 75 | void FlushAll() override; |
| 76 | void FlushRegion(VAddr addr, u64 size) override; | 76 | void FlushRegion(VAddr addr, u64 size, |
| 77 | bool MustFlushRegion(VAddr addr, u64 size) override; | 77 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; |
| 78 | void InvalidateRegion(VAddr addr, u64 size) override; | 78 | bool MustFlushRegion(VAddr addr, u64 size, |
| 79 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | ||
| 80 | void InvalidateRegion(VAddr addr, u64 size, | ||
| 81 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | ||
| 79 | void OnCPUWrite(VAddr addr, u64 size) override; | 82 | void OnCPUWrite(VAddr addr, u64 size) override; |
| 80 | void InvalidateGPUCache() override; | 83 | void InvalidateGPUCache() override; |
| 81 | void UnmapMemory(VAddr addr, u64 size) override; | 84 | void UnmapMemory(VAddr addr, u64 size) override; |
| @@ -85,7 +88,9 @@ public: | |||
| 85 | void SignalSyncPoint(u32 value) override; | 88 | void SignalSyncPoint(u32 value) override; |
| 86 | void SignalReference() override; | 89 | void SignalReference() override; |
| 87 | void ReleaseFences() override; | 90 | void ReleaseFences() override; |
| 88 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; | 91 | void FlushAndInvalidateRegion( |
| 92 | VAddr addr, u64 size, | ||
| 93 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | ||
| 89 | void WaitForIdle() override; | 94 | void WaitForIdle() override; |
| 90 | void FragmentBarrier() override; | 95 | void FragmentBarrier() override; |
| 91 | void TiledCacheBarrier() override; | 96 | void TiledCacheBarrier() override; |