summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_fence_manager.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-02-18 01:19:26 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-04-22 17:36:10 +0200
commit1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1 (patch)
treed0c9926af3f60d35e3cf06f52e114e57fefea4b8 /src/video_core/renderer_opengl/gl_fence_manager.cpp
parentOpenGL: Implement Fencing backend. (diff)
downloadyuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar.gz
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar.bz2
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar.lz
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar.xz
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.tar.zst
yuzu-1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_fence_manager.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_fence_manager.cpp b/src/video_core/renderer_opengl/gl_fence_manager.cpp
new file mode 100644
index 000000000..4517ef150
--- /dev/null
+++ b/src/video_core/renderer_opengl/gl_fence_manager.cpp
@@ -0,0 +1,55 @@
+// Copyright 2020 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/assert.h"
+
+#include "video_core/renderer_opengl/gl_fence_manager.h"
+
+namespace OpenGL {
+
+GLInnerFence::GLInnerFence(GPUVAddr address, u32 payload)
+ : VideoCommon::FenceBase(address, payload), sync_object{} {}
+
+GLInnerFence::~GLInnerFence() = default;
+
+void GLInnerFence::Queue() {
+ ASSERT(sync_object.handle == 0);
+ sync_object.Create();
+}
+
+bool GLInnerFence::IsSignaled() const {
+ ASSERT(sync_object.handle != 0);
+ GLsizei length;
+ GLint sync_status;
+ glGetSynciv(sync_object.handle, GL_SYNC_STATUS, sizeof(GLint), &length, &sync_status);
+ return sync_status == GL_SIGNALED;
+}
+
+void GLInnerFence::Wait() {
+ ASSERT(sync_object.handle != 0);
+ while (glClientWaitSync(sync_object.handle, 0, 1000) == GL_TIMEOUT_EXPIRED)
+ ;
+}
+
+FenceManagerOpenGL::FenceManagerOpenGL(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
+ TextureCacheOpenGL& texture_cache)
+ : GenericFenceManager(system, rasterizer, texture_cache) {}
+
+Fence FenceManagerOpenGL::CreateFence(GPUVAddr addr, u32 value) {
+ return std::make_shared<GLInnerFence>(addr, value);
+}
+
+void FenceManagerOpenGL::QueueFence(Fence& fence) {
+ fence->Queue();
+}
+
+bool FenceManagerOpenGL::IsFenceSignaled(Fence& fence) {
+ return fence->IsSignaled();
+}
+
+void FenceManagerOpenGL::WaitFence(Fence& fence) {
+ fence->Wait();
+}
+
+} // namespace OpenGL