Alexandre Julliard : winex11: Use a standard Wine list for the OpenGL context list.

Alexandre Julliard julliard at winehq.org
Mon May 7 14:29:26 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon May  7 12:57:29 2012 +0200

winex11: Use a standard Wine list for the OpenGL context list.

---

 dlls/winex11.drv/opengl.c |   59 ++++++++++++++++-----------------------------
 1 files changed, 21 insertions(+), 38 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 7c1251d..0ab607f 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -123,8 +123,7 @@ typedef struct wine_glcontext {
     HDC read_hdc;
     Drawable drawables[2];
     BOOL refresh_drawables;
-    struct wine_glcontext *next;
-    struct wine_glcontext *prev;
+    struct list entry;
 } Wine_GLContext;
 
 typedef struct wine_glpbuffer {
@@ -146,7 +145,7 @@ typedef struct wine_glpbuffer {
     int        texture_level;
 } Wine_GLPBuffer;
 
-static Wine_GLContext *context_list;
+static struct list context_list = LIST_INIT( context_list );
 static struct WineGLInfo WineGLInfo = { 0 };
 static int use_render_texture_emulation = 1;
 static int use_render_texture_ati = 0;
@@ -611,34 +610,16 @@ failed:
     return FALSE;
 }
 
-static inline Wine_GLContext *alloc_context(void)
-{
-    Wine_GLContext *ret;
-
-    if ((ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Wine_GLContext))))
-    {
-        ret->next = context_list;
-        if (context_list) context_list->prev = ret;
-        context_list = ret;
-    }
-    return ret;
-}
-
 static inline void free_context(Wine_GLContext *context)
 {
-    if (context->next != NULL) context->next->prev = context->prev;
-    if (context->prev != NULL) context->prev->next = context->next;
-    else context_list = context->next;
-
-    if (context->vis) XFree(context->vis);
-    HeapFree(GetProcessHeap(), 0, context);
 }
 
 static inline BOOL is_valid_context( Wine_GLContext *ctx )
 {
     Wine_GLContext *ptr;
-    for (ptr = context_list; ptr; ptr = ptr->next) if (ptr == ctx) break;
-    return (ptr != NULL);
+    LIST_FOR_EACH_ENTRY( ptr, &context_list, struct wine_glcontext, entry )
+        if (ptr == ctx) return TRUE;
+    return FALSE;
 }
 
 static int describeContext(Wine_GLContext* ctx) {
@@ -1124,7 +1105,8 @@ int pixelformat_from_fbconfig_id(XID fbconfig_id)
 void mark_drawable_dirty(Drawable old, Drawable new)
 {
     Wine_GLContext *ctx;
-    for (ctx = context_list; ctx; ctx = ctx->next) {
+    LIST_FOR_EACH_ENTRY( ctx, &context_list, struct wine_glcontext, entry )
+    {
         if (old == ctx->drawables[0]) {
             ctx->drawables[0] = new;
             ctx->refresh_drawables = TRUE;
@@ -1719,15 +1701,17 @@ HGLRC X11DRV_wglCreateContext(PHYSDEV dev)
         return NULL;
     }
 
-    wine_tsx11_lock();
-    ret = alloc_context();
+    if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) return 0;
+
     ret->hdc = hdc;
     ret->fmt = fmt;
     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);
+    list_add_head( &context_list, &ret->entry );
     wine_tsx11_unlock();
 
     TRACE(" creating context %p (GL context creation delayed)\n", ret);
@@ -1766,14 +1750,13 @@ BOOL X11DRV_wglDeleteContext(HGLRC hglrc)
     if (ctx == NtCurrentTeb()->glContext)
         wglMakeCurrent(ctx->hdc, NULL);
 
-    if (ctx->ctx)
-    {
-        wine_tsx11_lock();
-        pglXDestroyContext(gdi_display, ctx->ctx);
-        wine_tsx11_unlock();
-    }
+    wine_tsx11_lock();
+    list_remove( &ctx->entry );
+    if (ctx->ctx) pglXDestroyContext( gdi_display, ctx->ctx );
+    if (ctx->vis) XFree( ctx->vis );
+    wine_tsx11_unlock();
 
-    free_context(ctx);
+    HeapFree( GetProcessHeap(), 0, ctx );
     return TRUE;
 }
 
@@ -2280,9 +2263,8 @@ HGLRC X11DRV_wglCreateContextAttribsARB(PHYSDEV dev, HGLRC hShareContext, const
         return NULL;
     }
 
-    wine_tsx11_lock();
-    ret = alloc_context();
-    wine_tsx11_unlock();
+    if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) return 0;
+
     ret->hdc = dev->hdc;
     ret->fmt = fmt;
     ret->vis = NULL; /* glXCreateContextAttribsARB requires a fbconfig instead of a visual */
@@ -2336,11 +2318,12 @@ HGLRC X11DRV_wglCreateContextAttribsARB(PHYSDEV dev, HGLRC hShareContext, const
     {
         /* In the future we should convert the GLX error to a win32 one here if needed */
         ERR("Context creation failed\n");
-        free_context(ret);
+        HeapFree( GetProcessHeap(), 0, ret );
         wine_tsx11_unlock();
         return NULL;
     }
 
+    list_add_head( &context_list, &ret->entry );
     wine_tsx11_unlock();
     TRACE(" creating context %p\n", ret);
     return (HGLRC) ret;




More information about the wine-cvs mailing list