[PATCH v2] wined3d: Reduce timeout to avoid GL_TIMEOUT_EXPIRED on macOS
Robert Xiao
brx at cs.cmu.edu
Sat Aug 12 04:21:29 CDT 2017
I observed intermittent fence_wait failures on macOS due to
GL_TIMEOUT_EXPIRED while running Path of Exile 3.0.0c. My hypothesis is
that the previous value, ~(GLuint64)0xffff, overflowed internally after
being adjusted by the driver; after overflow, the timeout would be very
small and thus expire instantly.
To avoid that from happening, this patch uses a new, smaller timeout
value which should not be capable of overflow. The "- 0xffff" is
preserved to keep the low bits the same in case some driver needs them.
Signed-off-by: Robert Xiao <brx at cs.cmu.edu>
---
dlls/wined3d/query.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index f1e7803..9959ce7 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -198,11 +198,12 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
if (gl_info->supported[ARB_SYNC])
{
- /* Apple seems to be into arbitrary limits, and timeouts larger than
- * 0xfffffffffffffbff immediately return GL_TIMEOUT_EXPIRED. We don't
- * really care and can live with waiting a few μs less. (OS X 10.7.4). */
+ /* Timeouts near 0xffffffffffffffff may immediately return GL_TIMEOUT_EXPIRED,
+ * possibly because macOS internally adds some slop to the timer. To avoid this,
+ * we use a large number that isn't near the point of overflow (macOS 10.12.5).
+ */
GLenum gl_ret = GL_EXTCALL(glClientWaitSync(fence->object.sync,
- GL_SYNC_FLUSH_COMMANDS_BIT, ~(GLuint64)0xffff));
+ GL_SYNC_FLUSH_COMMANDS_BIT, (GLuint64)((1ULL << 62ULL) - 0xffff)));
checkGLcall("glClientWaitSync");
switch (gl_ret)
@@ -212,7 +213,7 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
ret = WINED3D_FENCE_OK;
break;
- /* We don't expect a timeout for a ~584 year wait */
+ /* We don't expect a timeout for a ~146 year wait */
default:
ERR("glClientWaitSync returned %#x.\n", gl_ret);
ret = WINED3D_FENCE_ERROR;
--
2.10.1 (Apple Git-78)
More information about the wine-patches
mailing list