early-access version 3444
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 3443. | ||||
| This is the source code for early-access 3444. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user