summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2022-11-20 03:07:14 +0100
committerGravatar Fernando Sahmkow2023-01-01 16:43:58 -0500
commit3630bfaef332768e08ecc0c34cd4bca83a2579f8 (patch)
tree6bd52f659411c16300ab437a418df3e0283d1c31 /src/video_core/renderer_vulkan
parentVulkan: Allow stagging buffer deferrals. (diff)
downloadyuzu-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.cpp52
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h13
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
424void RasterizerVulkan::FlushAll() {} 424void RasterizerVulkan::FlushAll() {}
425 425
426void RasterizerVulkan::FlushRegion(VAddr addr, u64 size) { 426void 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
441bool RasterizerVulkan::MustFlushRegion(VAddr addr, u64 size) { 443bool 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
447void RasterizerVulkan::InvalidateRegion(VAddr addr, u64 size) { 460void 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
463void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { 480void 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
525void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { 542void 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
532void RasterizerVulkan::WaitForIdle() { 550void 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;