Browse Source
Merge pull request #9925 from ameerj/gl-sync-signal
OpenGL: Prefer glClientWaitSync for OGLSync objects
pull/15/merge
liamwhite
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with
16 additions and
10 deletions
-
src/video_core/renderer_opengl/gl_fence_manager.cpp
-
src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
-
src/video_core/renderer_opengl/gl_resource_manager.cpp
-
src/video_core/renderer_opengl/gl_resource_manager.h
-
src/video_core/renderer_opengl/gl_texture_cache.cpp
|
|
|
@ -27,9 +27,7 @@ bool GLInnerFence::IsSignaled() const { |
|
|
|
return true; |
|
|
|
} |
|
|
|
ASSERT(sync_object.handle != 0); |
|
|
|
GLint sync_status; |
|
|
|
glGetSynciv(sync_object.handle, GL_SYNC_STATUS, 1, nullptr, &sync_status); |
|
|
|
return sync_status == GL_SIGNALED; |
|
|
|
return sync_object.IsSignaled(); |
|
|
|
} |
|
|
|
|
|
|
|
void GLInnerFence::Wait() { |
|
|
|
|
|
|
|
@ -621,10 +621,7 @@ bool GraphicsPipeline::IsBuilt() noexcept { |
|
|
|
if (built_fence.handle == 0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
// Timeout of zero means this is non-blocking
|
|
|
|
const auto sync_status = glClientWaitSync(built_fence.handle, 0, 0); |
|
|
|
ASSERT(sync_status != GL_WAIT_FAILED); |
|
|
|
is_built = sync_status != GL_TIMEOUT_EXPIRED; |
|
|
|
is_built = built_fence.IsSignaled(); |
|
|
|
return is_built; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -3,6 +3,7 @@ |
|
|
|
|
|
|
|
#include <string_view>
|
|
|
|
#include <glad/glad.h>
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "common/microprofile.h"
|
|
|
|
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
|
|
|
#include "video_core/renderer_opengl/gl_shader_util.h"
|
|
|
|
@ -158,6 +159,15 @@ void OGLSync::Release() { |
|
|
|
handle = 0; |
|
|
|
} |
|
|
|
|
|
|
|
bool OGLSync::IsSignaled() const noexcept { |
|
|
|
// At least on Nvidia, glClientWaitSync with a timeout of 0
|
|
|
|
// is faster than glGetSynciv of GL_SYNC_STATUS.
|
|
|
|
// Timeout of 0 means this check is non-blocking.
|
|
|
|
const auto sync_status = glClientWaitSync(handle, 0, 0); |
|
|
|
ASSERT(sync_status != GL_WAIT_FAILED); |
|
|
|
return sync_status != GL_TIMEOUT_EXPIRED; |
|
|
|
} |
|
|
|
|
|
|
|
void OGLFramebuffer::Create() { |
|
|
|
if (handle != 0) |
|
|
|
return; |
|
|
|
|
|
|
|
@ -263,6 +263,9 @@ public: |
|
|
|
/// Deletes the internal OpenGL resource |
|
|
|
void Release(); |
|
|
|
|
|
|
|
/// Checks if the sync has been signaled |
|
|
|
bool IsSignaled() const noexcept; |
|
|
|
|
|
|
|
GLsync handle = 0; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@ -717,9 +717,7 @@ std::optional<size_t> TextureCacheRuntime::StagingBuffers::FindBuffer(size_t req |
|
|
|
continue; |
|
|
|
} |
|
|
|
if (syncs[index].handle != 0) { |
|
|
|
GLint status; |
|
|
|
glGetSynciv(syncs[index].handle, GL_SYNC_STATUS, 1, nullptr, &status); |
|
|
|
if (status != GL_SIGNALED) { |
|
|
|
if (!syncs[index].IsSignaled()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
syncs[index].Release(); |
|
|
|
|