[PATCH 2/2] winex11: use GLX 1.3 for windows

Miklós Máté mtmkls at gmail.com
Thu May 26 16:43:14 CDT 2016


Differentiate between X window and GLX window, use GLX 1.3 for
GL window create/destroy.

Signed-off-by: Miklós Máté <mtmkls at gmail.com>
---
 dlls/winex11.drv/opengl.c | 110 ++++++++++++++++++++++++++--------------------
 1 file changed, 62 insertions(+), 48 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 66e92f7..7397118 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -217,7 +217,7 @@ struct wgl_context
     int numAttribs; /* This is needed for delaying wglCreateContextAttribsARB */
     int attribList[16]; /* This is needed for delaying wglCreateContextAttribsARB */
     GLXContext ctx;
-    Drawable drawables[2];
+    GLXDrawable drawables[2];
     BOOL refresh_drawables;
     struct list entry;
 };
@@ -254,7 +254,8 @@ enum dc_gl_type
 struct gl_drawable
 {
     enum dc_gl_type                type;         /* type of GL surface */
-    Drawable                       drawable;     /* drawable for rendering to the client area */
+    Drawable                       xdrawable;    /* drawable for rendering to the client area */
+    GLXDrawable                    glxdrawable;  /* drawable for rendering with GL */
     Pixmap                         pixmap;       /* base pixmap if drawable is a GLXPixmap */
     Colormap                       colormap;     /* colormap used for the drawable */
     const struct wgl_pixel_format *format;       /* pixel format for the drawable */
@@ -397,6 +398,8 @@ static GLXContext (*pglXCreateNewContext)( Display *dpy, GLXFBConfig config, int
 static Bool (*pglXMakeContextCurrent)( Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx );
 static GLXPixmap (*pglXCreatePixmap)( Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list );
 static void (*pglXDestroyPixmap)( Display *dpy, GLXPixmap pixmap );
+static GLXWindow (*pglXCreateWindow)( Display *dpy, GLXFBConfig config, Window win, const int *attrib_list );
+static void (*pglXDestroyWindow)( Display *dpy, GLXWindow win );
 
 /* GLX Extensions */
 static GLXContext (*pglXCreateContextAttribsARB)(Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
@@ -647,6 +650,8 @@ static BOOL WINAPI init_opengl( INIT_ONCE *once, void *param, void **context )
     LOAD_FUNCPTR(glXGetFBConfigs);
     LOAD_FUNCPTR(glXCreatePixmap);
     LOAD_FUNCPTR(glXDestroyPixmap);
+    LOAD_FUNCPTR(glXCreateWindow);
+    LOAD_FUNCPTR(glXDestroyWindow);
 #undef LOAD_FUNCPTR
 
 /* It doesn't matter if these fail. They'll only be used if the driver reports
@@ -1199,7 +1204,7 @@ static const struct wgl_pixel_format *get_pixel_format(Display *display, int iPi
 }
 
 /* Mark any allocated context using the glx drawable 'old' to use 'new' */
-static void mark_drawable_dirty(Drawable old, Drawable new)
+static void mark_drawable_dirty(GLXDrawable old, GLXDrawable new)
 {
     struct wgl_context *ctx;
 
@@ -1229,7 +1234,7 @@ static inline void sync_context(struct wgl_context *context)
     }
 }
 
-static BOOL set_swap_interval(Drawable drawable, int interval)
+static BOOL set_swap_interval(GLXDrawable drawable, int interval)
 {
     BOOL ret = TRUE;
 
@@ -1310,11 +1315,12 @@ static void free_gl_drawable( struct gl_drawable *gl )
     switch (gl->type)
     {
     case DC_GL_CHILD_WIN:
-        XDestroyWindow( gdi_display, gl->drawable );
+        pglXDestroyWindow( gdi_display, gl->glxdrawable );
+        XDestroyWindow( gdi_display, gl->xdrawable );
         XFreeColormap( gdi_display, gl->colormap );
         break;
     case DC_GL_PIXMAP_WIN:
-        pglXDestroyPixmap( gdi_display, gl->drawable );
+        pglXDestroyPixmap( gdi_display, gl->glxdrawable );
         XFreePixmap( gdi_display, gl->pixmap );
         break;
     default:
@@ -1330,7 +1336,8 @@ static void free_gl_drawable( struct gl_drawable *gl )
  */
 static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl )
 {
-    gl->drawable = 0;
+    gl->xdrawable = 0;
+    gl->glxdrawable = 0;
 
     if (GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow())  /* top-level window */
     {
@@ -1339,7 +1346,9 @@ static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl )
         if (data)
         {
             gl->type = DC_GL_WINDOW;
-            gl->drawable = create_client_window( data, gl->visual );
+            gl->xdrawable = create_client_window( data, gl->visual );
+            if (gl->xdrawable)
+                gl->glxdrawable = pglXCreateWindow( gdi_display, gl->format->fbconfig, gl->xdrawable, NULL );
             release_win_data( data );
         }
     }
@@ -1365,14 +1374,18 @@ static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl )
         XInstallColormap(gdi_display, attrib.colormap);
 
         gl->type = DC_GL_CHILD_WIN;
-        gl->drawable = XCreateWindow( gdi_display, dummy_parent, 0, 0,
+        gl->xdrawable = XCreateWindow( gdi_display, dummy_parent, 0, 0,
                                       gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top,
                                       0, gl->visual->depth, InputOutput, gl->visual->visual,
                                       CWColormap | CWOverrideRedirect, &attrib );
-        if (gl->drawable)
+        if (gl->xdrawable)
         {
-            pXCompositeRedirectWindow(gdi_display, gl->drawable, CompositeRedirectManual);
-            XMapWindow(gdi_display, gl->drawable);
+            gl->glxdrawable = pglXCreateWindow( gdi_display, gl->format->fbconfig, gl->xdrawable, NULL );
+            if (gl->glxdrawable)
+            {
+                pXCompositeRedirectWindow(gdi_display, gl->xdrawable, CompositeRedirectManual);
+                XMapWindow(gdi_display, gl->xdrawable);
+            }
         }
         else XFreeColormap( gdi_display, gl->colormap );
     }
@@ -1387,14 +1400,14 @@ static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl )
                                     gl->visual->depth );
         if (gl->pixmap)
         {
-            gl->drawable = pglXCreatePixmap( gdi_display, gl->format->fbconfig, gl->pixmap, NULL );
-            if (!gl->drawable) XFreePixmap( gdi_display, gl->pixmap );
+            gl->glxdrawable = pglXCreatePixmap( gdi_display, gl->format->fbconfig, gl->pixmap, NULL );
+            if (!gl->glxdrawable) XFreePixmap( gdi_display, gl->pixmap );
         }
     }
 
-    if (gl->drawable)
+    if (gl->glxdrawable)
         gl->refresh_swap_interval = TRUE;
-    return gl->drawable != 0;
+    return gl->glxdrawable != 0;
 }
 
 
@@ -1431,7 +1444,7 @@ static BOOL set_win_format( HWND hwnd, const struct wgl_pixel_format *format )
     }
 
     TRACE( "created GL drawable %lx for win %p %s\n",
-           gl->drawable, hwnd, debugstr_fbconfig( format->fbconfig ));
+           gl->glxdrawable, hwnd, debugstr_fbconfig( format->fbconfig ));
 
     XFlush( gdi_display );
 
@@ -1498,7 +1511,7 @@ static BOOL set_pixel_format(HDC hdc, int format, BOOL allow_change)
 void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_rect )
 {
     struct gl_drawable *gl;
-    Drawable glxp;
+    GLXDrawable glxp;
     Pixmap pix;
     int mask = 0;
     XWindowChanges changes;
@@ -1511,12 +1524,12 @@ void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_r
     if (changes.width  != gl->rect.right - gl->rect.left) mask |= CWWidth;
     if (changes.height != gl->rect.bottom - gl->rect.top) mask |= CWHeight;
 
-    TRACE( "setting drawable %lx size %dx%d\n", gl->drawable, changes.width, changes.height );
+    TRACE( "setting drawable %lx size %dx%d\n", gl->xdrawable, changes.width, changes.height );
 
     switch (gl->type)
     {
     case DC_GL_CHILD_WIN:
-        if (mask) XConfigureWindow( gdi_display, gl->drawable, mask, &changes );
+        if (mask) XConfigureWindow( gdi_display, gl->xdrawable, mask, &changes );
         break;
     case DC_GL_PIXMAP_WIN:
         if (!mask) break;
@@ -1528,15 +1541,15 @@ void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_r
             XFreePixmap(gdi_display, pix);
             goto done;
         }
-        mark_drawable_dirty(gl->drawable, glxp);
+        mark_drawable_dirty(gl->glxdrawable, glxp);
         XFlush( gdi_display );
 
         XFreePixmap(gdi_display, gl->pixmap);
-        pglXDestroyPixmap(gdi_display, gl->drawable);
-        TRACE( "Recreated GL drawable %lx to replace %lx\n", glxp, gl->drawable );
+        pglXDestroyPixmap(gdi_display, gl->glxdrawable);
+        TRACE( "Recreated GL drawable %lx to replace %lx\n", glxp, gl->glxdrawable );
 
         gl->pixmap = pix;
-        gl->drawable = glxp;
+        gl->glxdrawable = glxp;
         break;
     default:
         break;
@@ -1553,25 +1566,26 @@ done:
 void set_gl_drawable_parent( HWND hwnd, HWND parent )
 {
     struct gl_drawable *gl;
-    Drawable old_drawable;
+    GLXDrawable old_drawable;
 
     if (!(gl = get_gl_drawable( hwnd, 0 ))) return;
 
-    TRACE( "setting drawable %lx parent %p\n", gl->drawable, parent );
+    TRACE( "setting drawable %lx parent %p\n", gl->xdrawable, parent );
 
-    old_drawable = gl->drawable;
+    old_drawable = gl->glxdrawable;
     switch (gl->type)
     {
     case DC_GL_WINDOW:
         break;
     case DC_GL_CHILD_WIN:
         if (parent != GetDesktopWindow()) goto done;
-        XDestroyWindow( gdi_display, gl->drawable );
+        pglXDestroyWindow( gdi_display, gl->glxdrawable );
+        XDestroyWindow( gdi_display, gl->xdrawable );
         XFreeColormap( gdi_display, gl->colormap );
         break;
     case DC_GL_PIXMAP_WIN:
         if (parent != GetDesktopWindow()) goto done;
-        pglXDestroyPixmap( gdi_display, gl->drawable );
+        pglXDestroyPixmap( gdi_display, gl->glxdrawable );
         XFreePixmap( gdi_display, gl->pixmap );
         break;
     default:
@@ -1587,7 +1601,7 @@ void set_gl_drawable_parent( HWND hwnd, HWND parent )
         __wine_set_pixel_format( hwnd, 0 );
         return;
     }
-    mark_drawable_dirty( old_drawable, gl->drawable );
+    mark_drawable_dirty( old_drawable, gl->glxdrawable );
 
 done:
     release_gl_drawable( gl );
@@ -1874,17 +1888,17 @@ static BOOL glxdrv_wglMakeCurrent(HDC hdc, struct wgl_context *ctx)
             goto done;
         }
 
-        TRACE("hdc %p drawable %lx fmt %p ctx %p %s\n", hdc, gl->drawable, gl->format, ctx->ctx,
+        TRACE("hdc %p drawable %lx fmt %p ctx %p %s\n", hdc, gl->glxdrawable, gl->format, ctx->ctx,
               debugstr_fbconfig( gl->format->fbconfig ));
 
-        ret = pglXMakeCurrent(gdi_display, gl->drawable, ctx->ctx);
+        ret = pglXMakeCurrent(gdi_display, gl->glxdrawable, ctx->ctx);
         if (ret)
         {
             NtCurrentTeb()->glContext = ctx;
             ctx->has_been_current = TRUE;
             ctx->hdc = hdc;
-            ctx->drawables[0] = gl->drawable;
-            ctx->drawables[1] = gl->drawable;
+            ctx->drawables[0] = gl->glxdrawable;
+            ctx->drawables[1] = gl->glxdrawable;
             ctx->refresh_drawables = FALSE;
             goto done;
         }
@@ -1919,14 +1933,14 @@ static BOOL X11DRV_wglMakeContextCurrentARB( HDC draw_hdc, HDC read_hdc, struct
     if ((draw_gl = get_gl_drawable( WindowFromDC( draw_hdc ), draw_hdc )))
     {
         read_gl = get_gl_drawable( WindowFromDC( read_hdc ), read_hdc );
-        ret = pglXMakeContextCurrent(gdi_display, draw_gl->drawable,
-                                     read_gl ? read_gl->drawable : 0, ctx->ctx);
+        ret = pglXMakeContextCurrent(gdi_display, draw_gl->glxdrawable,
+                                     read_gl ? read_gl->glxdrawable : 0, ctx->ctx);
         if (ret)
         {
             ctx->has_been_current = TRUE;
             ctx->hdc = draw_hdc;
-            ctx->drawables[0] = draw_gl->drawable;
-            ctx->drawables[1] = read_gl ? read_gl->drawable : 0;
+            ctx->drawables[0] = draw_gl->glxdrawable;
+            ctx->drawables[1] = read_gl ? read_gl->glxdrawable : 0;
             ctx->refresh_drawables = FALSE;
             NtCurrentTeb()->glContext = ctx;
             goto done;
@@ -1999,7 +2013,7 @@ static void wglFinish(void)
         switch (gl->type)
         {
         case DC_GL_PIXMAP_WIN: escape.gl_drawable = gl->pixmap; break;
-        case DC_GL_CHILD_WIN:  escape.gl_drawable = gl->drawable; break;
+        case DC_GL_CHILD_WIN:  escape.gl_drawable = gl->xdrawable; break;
         default: break;
         }
         sync_context(ctx);
@@ -2024,7 +2038,7 @@ static void wglFlush(void)
         switch (gl->type)
         {
         case DC_GL_PIXMAP_WIN: escape.gl_drawable = gl->pixmap; break;
-        case DC_GL_CHILD_WIN:  escape.gl_drawable = gl->drawable; break;
+        case DC_GL_CHILD_WIN:  escape.gl_drawable = gl->xdrawable; break;
         default: break;
         }
         sync_context(ctx);
@@ -2368,7 +2382,7 @@ static HDC X11DRV_wglGetPbufferDCARB( struct wgl_pbuffer *object )
         return 0;
     }
     gl->type = DC_GL_PBUFFER;
-    gl->drawable = object->drawable;
+    gl->glxdrawable = object->drawable;
     gl->format = object->fmt;
 
     EnterCriticalSection( &context_section );
@@ -2948,7 +2962,7 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer )
         static BOOL initialized = FALSE;
         int prev_binded_texture = 0;
         GLXContext prev_context;
-        Drawable prev_drawable;
+        GLXDrawable prev_drawable;
 
         prev_context = pglXGetCurrentContext();
         prev_drawable = pglXGetCurrentDrawable();
@@ -3076,7 +3090,7 @@ static BOOL X11DRV_wglSwapIntervalEXT(int interval)
         return FALSE;
     }
 
-    ret = set_swap_interval(gl->drawable, interval);
+    ret = set_swap_interval(gl->glxdrawable, interval);
     gl->refresh_swap_interval = FALSE;
     if (ret)
         gl->swap_interval = interval;
@@ -3300,7 +3314,7 @@ static BOOL glxdrv_wglSwapBuffers( HDC hdc )
 
     if (gl->refresh_swap_interval)
     {
-        set_swap_interval(gl->drawable, gl->swap_interval);
+        set_swap_interval(gl->glxdrawable, gl->swap_interval);
         gl->refresh_swap_interval = FALSE;
     }
 
@@ -3314,18 +3328,18 @@ static BOOL glxdrv_wglSwapBuffers( HDC hdc )
              * GLX_MESA_copy_sub_buffer doesn't. Make sure GL is flushed before
              * copying */
             pglFlush();
-            pglXCopySubBufferMESA( gdi_display, gl->drawable, 0, 0,
+            pglXCopySubBufferMESA( gdi_display, gl->glxdrawable, 0, 0,
                                    gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top );
             break;
         }
-        pglXSwapBuffers(gdi_display, gl->drawable);
+        pglXSwapBuffers(gdi_display, gl->glxdrawable);
         break;
     case DC_GL_CHILD_WIN:
         if (ctx) sync_context( ctx );
-        escape.gl_drawable = gl->drawable;
+        escape.gl_drawable = gl->xdrawable;
         /* fall through */
     default:
-        pglXSwapBuffers(gdi_display, gl->drawable);
+        pglXSwapBuffers(gdi_display, gl->glxdrawable);
         break;
     }
 
-- 
2.8.1




More information about the wine-patches mailing list