Ken Thomases : winemac: Improve handling of swap interval with respect to pbuffers, clamping to 0.
Alexandre Julliard
julliard at winehq.org
Mon Mar 24 15:59:46 CDT 2014
Module: wine
Branch: master
Commit: fc37ed94d85fb951aad9c94fa3b3ac946f4670ae
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc37ed94d85fb951aad9c94fa3b3ac946f4670ae
Author: Ken Thomases <ken at 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;
More information about the wine-cvs
mailing list