summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
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_opengl
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_opengl')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp51
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h13
2 files changed, 42 insertions, 22 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 0807d0b88..d58dcedea 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -352,46 +352,60 @@ void RasterizerOpenGL::DisableGraphicsUniformBuffer(size_t stage, u32 index) {
352 352
353void RasterizerOpenGL::FlushAll() {} 353void RasterizerOpenGL::FlushAll() {}
354 354
355void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { 355void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) {
356 MICROPROFILE_SCOPE(OpenGL_CacheManagement); 356 MICROPROFILE_SCOPE(OpenGL_CacheManagement);
357 if (addr == 0 || size == 0) { 357 if (addr == 0 || size == 0) {
358 return; 358 return;
359 } 359 }
360 { 360 if (bool(which & VideoCommon::CacheType::TextureCache)) {
361 std::scoped_lock lock{texture_cache.mutex}; 361 std::scoped_lock lock{texture_cache.mutex};
362 texture_cache.DownloadMemory(addr, size); 362 texture_cache.DownloadMemory(addr, size);
363 } 363 }
364 { 364 if ((bool(which & VideoCommon::CacheType::BufferCache))) {
365 std::scoped_lock lock{buffer_cache.mutex}; 365 std::scoped_lock lock{buffer_cache.mutex};
366 buffer_cache.DownloadMemory(addr, size); 366 buffer_cache.DownloadMemory(addr, size);
367 } 367 }
368 query_cache.FlushRegion(addr, size); 368 if ((bool(which & VideoCommon::CacheType::QueryCache))) {
369 query_cache.FlushRegion(addr, size);
370 }
369} 371}
370 372
371bool RasterizerOpenGL::MustFlushRegion(VAddr addr, u64 size) { 373bool RasterizerOpenGL::MustFlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) {
372 std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; 374 if ((bool(which & VideoCommon::CacheType::BufferCache))) {
375 std::scoped_lock lock{buffer_cache.mutex};
376 if (buffer_cache.IsRegionGpuModified(addr, size)) {
377 return true;
378 }
379 }
373 if (!Settings::IsGPULevelHigh()) { 380 if (!Settings::IsGPULevelHigh()) {
374 return buffer_cache.IsRegionGpuModified(addr, size); 381 return false;
382 }
383 if (bool(which & VideoCommon::CacheType::TextureCache)) {
384 std::scoped_lock lock{texture_cache.mutex};
385 return texture_cache.IsRegionGpuModified(addr, size);
375 } 386 }
376 return texture_cache.IsRegionGpuModified(addr, size) || 387 return false;
377 buffer_cache.IsRegionGpuModified(addr, size);
378} 388}
379 389
380void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { 390void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size, VideoCommon::CacheType which) {
381 MICROPROFILE_SCOPE(OpenGL_CacheManagement); 391 MICROPROFILE_SCOPE(OpenGL_CacheManagement);
382 if (addr == 0 || size == 0) { 392 if (addr == 0 || size == 0) {
383 return; 393 return;
384 } 394 }
385 { 395 if (bool(which & VideoCommon::CacheType::TextureCache)) {
386 std::scoped_lock lock{texture_cache.mutex}; 396 std::scoped_lock lock{texture_cache.mutex};
387 texture_cache.WriteMemory(addr, size); 397 texture_cache.WriteMemory(addr, size);
388 } 398 }
389 { 399 if (bool(which & VideoCommon::CacheType::BufferCache)) {
390 std::scoped_lock lock{buffer_cache.mutex}; 400 std::scoped_lock lock{buffer_cache.mutex};
391 buffer_cache.WriteMemory(addr, size); 401 buffer_cache.WriteMemory(addr, size);
392 } 402 }
393 shader_cache.InvalidateRegion(addr, size); 403 if (bool(which & VideoCommon::CacheType::ShaderCache)) {
394 query_cache.InvalidateRegion(addr, size); 404 shader_cache.InvalidateRegion(addr, size);
405 }
406 if (bool(which & VideoCommon::CacheType::QueryCache)) {
407 query_cache.InvalidateRegion(addr, size);
408 }
395} 409}
396 410
397void RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { 411void RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) {
@@ -458,11 +472,12 @@ void RasterizerOpenGL::ReleaseFences() {
458 fence_manager.WaitPendingFences(); 472 fence_manager.WaitPendingFences();
459} 473}
460 474
461void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { 475void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size,
476 VideoCommon::CacheType which) {
462 if (Settings::IsGPULevelExtreme()) { 477 if (Settings::IsGPULevelExtreme()) {
463 FlushRegion(addr, size); 478 FlushRegion(addr, size, which);
464 } 479 }
465 InvalidateRegion(addr, size); 480 InvalidateRegion(addr, size, which);
466} 481}
467 482
468void RasterizerOpenGL::WaitForIdle() { 483void RasterizerOpenGL::WaitForIdle() {
@@ -531,7 +546,7 @@ void RasterizerOpenGL::AccelerateInlineToMemory(GPUVAddr address, size_t copy_si
531 } 546 }
532 gpu_memory->WriteBlockUnsafe(address, memory.data(), copy_size); 547 gpu_memory->WriteBlockUnsafe(address, memory.data(), copy_size);
533 { 548 {
534 std::unique_lock<std::mutex> lock{buffer_cache.mutex}; 549 std::unique_lock<std::recursive_mutex> lock{buffer_cache.mutex};
535 if (!buffer_cache.InlineMemory(*cpu_addr, copy_size, memory)) { 550 if (!buffer_cache.InlineMemory(*cpu_addr, copy_size, memory)) {
536 buffer_cache.WriteMemory(*cpu_addr, copy_size); 551 buffer_cache.WriteMemory(*cpu_addr, copy_size);
537 } 552 }
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index efd19f880..94e65d64b 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -77,9 +77,12 @@ public:
77 void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; 77 void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override;
78 void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; 78 void DisableGraphicsUniformBuffer(size_t stage, u32 index) override;
79 void FlushAll() override; 79 void FlushAll() override;
80 void FlushRegion(VAddr addr, u64 size) override; 80 void FlushRegion(VAddr addr, u64 size,
81 bool MustFlushRegion(VAddr addr, u64 size) override; 81 VideoCommon::CacheType which = VideoCommon::CacheType::All) override;
82 void InvalidateRegion(VAddr addr, u64 size) override; 82 bool MustFlushRegion(VAddr addr, u64 size,
83 VideoCommon::CacheType which = VideoCommon::CacheType::All) override;
84 void InvalidateRegion(VAddr addr, u64 size,
85 VideoCommon::CacheType which = VideoCommon::CacheType::All) override;
83 void OnCPUWrite(VAddr addr, u64 size) override; 86 void OnCPUWrite(VAddr addr, u64 size) override;
84 void InvalidateGPUCache() override; 87 void InvalidateGPUCache() override;
85 void UnmapMemory(VAddr addr, u64 size) override; 88 void UnmapMemory(VAddr addr, u64 size) override;
@@ -89,7 +92,9 @@ public:
89 void SignalSyncPoint(u32 value) override; 92 void SignalSyncPoint(u32 value) override;
90 void SignalReference() override; 93 void SignalReference() override;
91 void ReleaseFences() override; 94 void ReleaseFences() override;
92 void FlushAndInvalidateRegion(VAddr addr, u64 size) override; 95 void FlushAndInvalidateRegion(
96 VAddr addr, u64 size,
97 VideoCommon::CacheType which = VideoCommon::CacheType::All) override;
93 void WaitForIdle() override; 98 void WaitForIdle() override;
94 void FragmentBarrier() override; 99 void FragmentBarrier() override;
95 void TiledCacheBarrier() override; 100 void TiledCacheBarrier() override;