summaryrefslogtreecommitdiffstats
path: root/src/video_core/fence_manager.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-02-18 22:20:39 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-04-22 17:36:15 +0200
commitb10db7e4a5f43414679b7969ea309b1829937a37 (patch)
tree5a2df21d974ee17488ee01960a823ae6f89d9edb /src/video_core/fence_manager.h
parentRasterizer: Document SignalFence & ReleaseFences and setup skeletons on Vulkan. (diff)
downloadyuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.gz
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.bz2
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.lz
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.xz
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.zst
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/fence_manager.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index 036f3996c..c4b190503 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.h
@@ -6,8 +6,8 @@
#include <algorithm>
#include <array>
-#include <queue>
#include <memory>
+#include <queue>
#include "common/assert.h"
#include "common/common_types.h"
@@ -37,7 +37,7 @@ private:
u32 payload;
};
-template <typename TFence, typename TTextureCache>
+template <typename TFence, typename TTextureCache, typename TTBufferCache>
class FenceManager {
public:
void SignalFence(GPUVAddr addr, u32 value) {
@@ -46,6 +46,7 @@ public:
QueueFence(new_fence);
fences.push(new_fence);
texture_cache.CommitAsyncFlushes();
+ buffer_cache.CommitAsyncFlushes();
rasterizer.FlushCommands();
rasterizer.SyncGuestHost();
}
@@ -54,10 +55,12 @@ public:
while (!fences.empty()) {
TFence& current_fence = fences.front();
bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
+ should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
if (should_wait) {
WaitFence(current_fence);
}
texture_cache.PopAsyncFlushes();
+ buffer_cache.PopAsyncFlushes();
auto& gpu{system.GPU()};
auto& memory_manager{gpu.MemoryManager()};
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload());
@@ -67,8 +70,9 @@ public:
protected:
FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
- TTextureCache& texture_cache)
- : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache} {}
+ TTextureCache& texture_cache, TTBufferCache& buffer_cache)
+ : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{
+ buffer_cache} {}
virtual TFence CreateFence(GPUVAddr addr, u32 value) = 0;
virtual void QueueFence(TFence& fence) = 0;
@@ -78,16 +82,19 @@ protected:
Core::System& system;
VideoCore::RasterizerInterface& rasterizer;
TTextureCache& texture_cache;
+ TTBufferCache& buffer_cache;
private:
void TryReleasePendingFences() {
while (!fences.empty()) {
TFence& current_fence = fences.front();
bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
+ should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
if (should_wait && !IsFenceSignaled(current_fence)) {
return;
}
texture_cache.PopAsyncFlushes();
+ buffer_cache.PopAsyncFlushes();
auto& gpu{system.GPU()};
auto& memory_manager{gpu.MemoryManager()};
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload());