Module: wine Branch: master Commit: fc37ed94d85fb951aad9c94fa3b3ac946f4670ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc37ed94d85fb951aad9c94fa3...
Author: Ken Thomases ken@codeweavers.com Date: Sun Mar 23 22:44:25 2014 -0500
winemac: Improve handling of swap interval with respect to pbuffers, clamping to 0.
---
dlls/winemac.drv/opengl.c | 66 ++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 22 deletions(-)
diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index 4265797..0187822 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -1504,13 +1504,25 @@ static BOOL set_swap_interval(struct wgl_context *context, long interval) */ static void sync_swap_interval(struct wgl_context *context) { - struct macdrv_win_data *data; - - if (InterlockedCompareExchange(&context->update_swap_interval, FALSE, TRUE) && - (data = get_win_data(context->draw_hwnd))) + if (InterlockedCompareExchange(&context->update_swap_interval, FALSE, TRUE)) { - set_swap_interval(context, data->swap_interval); - release_win_data(data); + int interval; + + if (context->draw_hwnd) + { + struct macdrv_win_data *data = get_win_data(context->draw_hwnd); + if (data) + { + interval = data->swap_interval; + release_win_data(data); + } + else /* window was destroyed? */ + interval = 1; + } + else /* pbuffer */ + interval = 0; + + set_swap_interval(context, interval); } }
@@ -2718,6 +2730,10 @@ static BOOL macdrv_wglMakeContextCurrentARB(HDC draw_hdc, HDC read_hdc, struct w SetLastError(ERROR_INVALID_PIXEL_FORMAT); return FALSE; } + + if (allow_vsync && + (InterlockedCompareExchange(&context->update_swap_interval, FALSE, TRUE) || pbuffer != context->draw_pbuffer)) + set_swap_interval(context, 0); } else { @@ -3019,7 +3035,7 @@ static BOOL macdrv_wglSetPixelFormatWINE(HDC hdc, int fmt) static BOOL macdrv_wglSwapIntervalEXT(int interval) { struct wgl_context *context = NtCurrentTeb()->glContext; - struct macdrv_win_data *data; + BOOL changed = FALSE;
TRACE("interval %d\n", interval);
@@ -3031,6 +3047,20 @@ static BOOL macdrv_wglSwapIntervalEXT(int interval) if (interval > 1) interval = 1;
+ if (context->draw_hwnd) + { + struct macdrv_win_data *data = get_win_data(context->draw_hwnd); + if (data) + { + changed = data->swap_interval != interval; + if (changed) + data->swap_interval = interval; + release_win_data(data); + } + } + else /* pbuffer */ + interval = 0; + InterlockedExchange(&context->update_swap_interval, FALSE); if (!set_swap_interval(context, interval)) { @@ -3038,25 +3068,17 @@ static BOOL macdrv_wglSwapIntervalEXT(int interval) return FALSE; }
- if ((data = get_win_data(context->draw_hwnd))) + if (changed) { - BOOL changed = data->swap_interval != interval; - if (changed) - data->swap_interval = interval; - release_win_data(data); + struct wgl_context *ctx;
- if (changed) + EnterCriticalSection(&context_section); + LIST_FOR_EACH_ENTRY(ctx, &context_list, struct wgl_context, entry) { - struct wgl_context *ctx; - - EnterCriticalSection(&context_section); - LIST_FOR_EACH_ENTRY(ctx, &context_list, struct wgl_context, entry) - { - if (ctx != context && ctx->draw_hwnd == context->draw_hwnd) - InterlockedExchange(&context->update_swap_interval, TRUE); - } - LeaveCriticalSection(&context_section); + if (ctx != context && ctx->draw_hwnd == context->draw_hwnd) + InterlockedExchange(&context->update_swap_interval, TRUE); } + LeaveCriticalSection(&context_section); }
return TRUE;