diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-02-18 01:19:26 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-04-22 17:36:10 +0200 |
commit | 1f345ebe3a5501b50f26f0c5c21cac5d55dd79c1 (patch) | |
tree | d0c9926af3f60d35e3cf06f52e114e57fefea4b8 /src/video_core/renderer_opengl/gl_fence_manager.cpp | |
parent | OpenGL: Implement Fencing backend. (diff) | |
download | yuzu-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.cpp | 55 |
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 |