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_opengl | |
| 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_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 51 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 13 |
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 | ||
| 353 | void RasterizerOpenGL::FlushAll() {} | 353 | void RasterizerOpenGL::FlushAll() {} |
| 354 | 354 | ||
| 355 | void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size) { | 355 | void 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 | ||
| 371 | bool RasterizerOpenGL::MustFlushRegion(VAddr addr, u64 size) { | 373 | bool 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 | ||
| 380 | void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size) { | 390 | void 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 | ||
| 397 | void RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { | 411 | void 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 | ||
| 461 | void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size) { | 475 | void 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 | ||
| 468 | void RasterizerOpenGL::WaitForIdle() { | 483 | void 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; |