Alexandre Julliard : winex11: Add a critical section to protect the OpenGL context list.

Alexandre Julliard julliard at winehq.org
Wed Aug 15 14:08:34 CDT 2012


Module: wine
Branch: master
Commit: b8cc4d50ef0e38832b43e16f882441dcb43d5998
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b8cc4d50ef0e38832b43e16f882441dcb43d5998

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Aug 14 14:54:39 2012 +0200

winex11: Add a critical section to protect the OpenGL context list.

---

 dlls/winex11.drv/opengl.c |   51 ++++++++++++++++++++++++--------------------
 1 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index ff8b0ae..63ab09f 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -196,6 +196,15 @@ static int use_render_texture_emulation = 1;
 static BOOL has_swap_control;
 static int swap_interval = 1;
 
+static CRITICAL_SECTION context_section;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+    0, 0, &context_section,
+    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+      0, 0, { (DWORD_PTR)(__FILE__ ": context_section") }
+};
+static CRITICAL_SECTION context_section = { &critsect_debug, -1, 0, 0, 0, 0 };
+
 static struct opengl_funcs opengl_funcs;
 
 #define USE_GL_FUNC(name) #name,
@@ -1088,6 +1097,8 @@ static int pixelformat_from_fbconfig_id(XID fbconfig_id)
 void mark_drawable_dirty(Drawable old, Drawable new)
 {
     struct wgl_context *ctx;
+
+    EnterCriticalSection( &context_section );
     LIST_FOR_EACH_ENTRY( ctx, &context_list, struct wgl_context, entry )
     {
         if (old == ctx->drawables[0]) {
@@ -1099,12 +1110,14 @@ void mark_drawable_dirty(Drawable old, Drawable new)
             ctx->refresh_drawables = TRUE;
         }
     }
+    LeaveCriticalSection( &context_section );
 }
 
 /* Given the current context, make sure its drawable is sync'd */
 static inline void sync_context(struct wgl_context *context)
 {
-    if(context && context->refresh_drawables) {
+    EnterCriticalSection( &context_section );
+    if (context->refresh_drawables) {
         if (glxRequireVersion(3))
             pglXMakeContextCurrent(gdi_display, context->drawables[0],
                                    context->drawables[1], context->ctx);
@@ -1112,6 +1125,7 @@ static inline void sync_context(struct wgl_context *context)
             pglXMakeCurrent(gdi_display, context->drawables[0], context->ctx);
         context->refresh_drawables = FALSE;
     }
+    LeaveCriticalSection( &context_section );
 }
 
 
@@ -1435,11 +1449,12 @@ static struct wgl_context *glxdrv_wglCreateContext( HDC hdc )
     ret->has_been_current = FALSE;
     ret->sharing = FALSE;
 
-    wine_tsx11_lock();
     ret->vis = pglXGetVisualFromFBConfig(gdi_display, fmt->fbconfig);
     ret->ctx = create_glxcontext(gdi_display, ret, NULL);
+
+    EnterCriticalSection( &context_section );
     list_add_head( &context_list, &ret->entry );
-    wine_tsx11_unlock();
+    LeaveCriticalSection( &context_section );
 
     TRACE(" creating context %p (GL context creation delayed)\n", ret);
     return ret;
@@ -1452,12 +1467,12 @@ static void glxdrv_wglDeleteContext(struct wgl_context *ctx)
 {
     TRACE("(%p)\n", ctx);
 
-    wine_tsx11_lock();
+    EnterCriticalSection( &context_section );
     list_remove( &ctx->entry );
+    LeaveCriticalSection( &context_section );
+
     if (ctx->ctx) pglXDestroyContext( gdi_display, ctx->ctx );
     if (ctx->vis) XFree( ctx->vis );
-    wine_tsx11_unlock();
-
     HeapFree( GetProcessHeap(), 0, ctx );
 }
 
@@ -1507,8 +1522,6 @@ static BOOL glxdrv_wglMakeCurrent(HDC hdc, struct wgl_context *ctx)
     }
     else
     {
-        wine_tsx11_lock();
-
         if (TRACE_ON(wgl)) {
             int vis_id;
             pglXGetFBConfigAttrib(gdi_display, ctx->fmt->fbconfig, GLX_VISUAL_ID, &vis_id);
@@ -1523,15 +1536,16 @@ static BOOL glxdrv_wglMakeCurrent(HDC hdc, struct wgl_context *ctx)
         {
             NtCurrentTeb()->glContext = ctx;
 
+            EnterCriticalSection( &context_section );
             ctx->has_been_current = TRUE;
             ctx->hdc = hdc;
             ctx->drawables[0] = escape.gl_drawable;
             ctx->drawables[1] = escape.gl_drawable;
             ctx->refresh_drawables = FALSE;
+            LeaveCriticalSection( &context_section );
         }
         else
             SetLastError(ERROR_INVALID_HANDLE);
-        wine_tsx11_unlock();
     }
     TRACE(" returning %s\n", (ret ? "True" : "False"));
     return ret;
@@ -1574,20 +1588,20 @@ static BOOL X11DRV_wglMakeContextCurrentARB( HDC draw_hdc, HDC read_hdc, struct
     {
         if (!pglXMakeContextCurrent) return FALSE;
 
-        wine_tsx11_lock();
         ret = pglXMakeContextCurrent(gdi_display, escape_draw.gl_drawable, escape_read.gl_drawable, ctx->ctx);
         if (ret)
         {
+            EnterCriticalSection( &context_section );
             ctx->has_been_current = TRUE;
             ctx->hdc = draw_hdc;
             ctx->drawables[0] = escape_draw.gl_drawable;
             ctx->drawables[1] = escape_read.gl_drawable;
             ctx->refresh_drawables = FALSE;
+            LeaveCriticalSection( &context_section );
             NtCurrentTeb()->glContext = ctx;
         }
         else
             SetLastError(ERROR_INVALID_HANDLE);
-        wine_tsx11_unlock();
     }
 
     TRACE(" returning %s\n", (ret ? "True" : "False"));
@@ -1674,10 +1688,8 @@ static void wglFinish(void)
     struct wgl_context *ctx = NtCurrentTeb()->glContext;
     enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE;
 
-    wine_tsx11_lock();
     sync_context(ctx);
     pglFinish();
-    wine_tsx11_unlock();
     ExtEscape( ctx->hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
 }
 
@@ -1686,10 +1698,8 @@ static void wglFlush(void)
     struct wgl_context *ctx = NtCurrentTeb()->glContext;
     enum x11drv_escape_codes code = X11DRV_FLUSH_GL_DRAWABLE;
 
-    wine_tsx11_lock();
     sync_context(ctx);
     pglFlush();
-    wine_tsx11_unlock();
     ExtEscape( ctx->hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
 }
 
@@ -1767,7 +1777,6 @@ static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wg
         }
     }
 
-    wine_tsx11_lock();
     X11DRV_expect_error(gdi_display, GLXErrorHandler, NULL);
     ret->ctx = create_glxcontext(gdi_display, ret, NULL);
 
@@ -1777,12 +1786,13 @@ static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wg
         /* In the future we should convert the GLX error to a win32 one here if needed */
         ERR("Context creation failed\n");
         HeapFree( GetProcessHeap(), 0, ret );
-        wine_tsx11_unlock();
         return NULL;
     }
 
+    EnterCriticalSection( &context_section );
     list_add_head( &context_list, &ret->entry );
-    wine_tsx11_unlock();
+    LeaveCriticalSection( &context_section );
+
     TRACE(" creating context %p\n", ret);
     return ret;
 }
@@ -2210,10 +2220,8 @@ static BOOL X11DRV_wglChoosePixelFormatARB( HDC hdc, const int *piAttribIList, c
     }
 
     /* Search for FB configurations matching the requirements in attribs */
-    wine_tsx11_lock();
     cfgs = pglXChooseFBConfig(gdi_display, DefaultScreen(gdi_display), attribs, &nCfgs);
     if (NULL == cfgs) {
-        wine_tsx11_unlock();
         WARN("Compatible Pixel Format not found\n");
         return GL_FALSE;
     }
@@ -2248,7 +2256,6 @@ static BOOL X11DRV_wglChoosePixelFormatARB( HDC hdc, const int *piAttribIList, c
     *nNumFormats = pfmt_it;
     /** free list */
     XFree(cfgs);
-    wine_tsx11_unlock();
     return GL_TRUE;
 }
 
@@ -2879,7 +2886,6 @@ static BOOL glxdrv_SwapBuffers(PHYSDEV dev)
       return FALSE;
   }
 
-  wine_tsx11_lock();
   sync_context(ctx);
   switch (physdev->type)
   {
@@ -2903,7 +2909,6 @@ static BOOL glxdrv_SwapBuffers(PHYSDEV dev)
   }
 
   flush_gl_drawable( physdev );
-  wine_tsx11_unlock();
 
   /* FPS support */
   if (TRACE_ON(fps))




More information about the wine-cvs mailing list