diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-15 16:36:14 -0400 |
|---|---|---|
| committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-22 11:36:18 -0400 |
| commit | 0649f0590047e8cc0b16a10dec5eb74938fef718 (patch) | |
| tree | b56cf7fb42c31f0012b063d356dc2b1eb1126a42 /src/video_core/fence_manager.h | |
| parent | 131b342130f21cf66ca64ece8034951ad6cce1f7 (diff) | |
QueryCache: Implement Async Flushes.
Diffstat (limited to 'src/video_core/fence_manager.h')
| -rw-r--r-- | src/video_core/fence_manager.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 417cb113f..99a138b5b 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -49,15 +49,17 @@ protected: bool is_stubbed; }; -template <typename TFence, typename TTextureCache, typename TTBufferCache> +template <typename TFence, typename TTextureCache, typename TTBufferCache, typename TQueryCache> class FenceManager { public: void SignalSemaphore(GPUVAddr addr, u32 value) { TryReleasePendingFences(); bool should_flush = texture_cache.HasUncommitedFlushes(); should_flush |= buffer_cache.HasUncommitedFlushes(); + should_flush |= query_cache.HasUncommitedFlushes(); texture_cache.CommitAsyncFlushes(); buffer_cache.CommitAsyncFlushes(); + query_cache.CommitAsyncFlushes(); TFence new_fence = CreateFence(addr, value, !should_flush); fences.push(new_fence); QueueFence(new_fence); @@ -71,8 +73,10 @@ public: TryReleasePendingFences(); bool should_flush = texture_cache.HasUncommitedFlushes(); should_flush |= buffer_cache.HasUncommitedFlushes(); + should_flush |= query_cache.HasUncommitedFlushes(); texture_cache.CommitAsyncFlushes(); buffer_cache.CommitAsyncFlushes(); + query_cache.CommitAsyncFlushes(); TFence new_fence = CreateFence(value, !should_flush); fences.push(new_fence); QueueFence(new_fence); @@ -87,11 +91,13 @@ public: TFence& current_fence = fences.front(); bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); should_wait |= buffer_cache.ShouldWaitAsyncFlushes(); + should_wait |= query_cache.ShouldWaitAsyncFlushes(); if (should_wait) { WaitFence(current_fence); } texture_cache.PopAsyncFlushes(); buffer_cache.PopAsyncFlushes(); + query_cache.PopAsyncFlushes(); auto& gpu{system.GPU()}; if (current_fence->IsSemaphore()) { auto& memory_manager{gpu.MemoryManager()}; @@ -105,9 +111,10 @@ public: protected: FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer, - TTextureCache& texture_cache, TTBufferCache& buffer_cache) - : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{ - buffer_cache} {} + TTextureCache& texture_cache, TTBufferCache& buffer_cache, + TQueryCache& query_cache) + : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, + buffer_cache{buffer_cache}, query_cache{query_cache} {} virtual TFence CreateFence(u32 value, bool is_stubbed) = 0; virtual TFence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) = 0; @@ -119,6 +126,7 @@ protected: VideoCore::RasterizerInterface& rasterizer; TTextureCache& texture_cache; TTBufferCache& buffer_cache; + TQueryCache& query_cache; private: void TryReleasePendingFences() { @@ -126,11 +134,13 @@ private: TFence& current_fence = fences.front(); bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); should_wait |= buffer_cache.ShouldWaitAsyncFlushes(); + should_wait |= query_cache.ShouldWaitAsyncFlushes(); if (should_wait && !IsFenceSignaled(current_fence)) { return; } texture_cache.PopAsyncFlushes(); buffer_cache.PopAsyncFlushes(); + query_cache.PopAsyncFlushes(); auto& gpu{system.GPU()}; if (current_fence->IsSemaphore()) { auto& memory_manager{gpu.MemoryManager()}; |
