[PATCH v2 2/2] winex11drv: Add mutable pixel format awareness.

Connor McAdams cmcadams at codeweavers.com
Fri Apr 16 15:39:47 CDT 2021


Add the ability to check if the pixel format was changed by wined3d, and
if it was, allow the application to change it with a regular
SetPixelFormat call.

Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
---
 dlls/winex11.drv/opengl.c | 39 ++++++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index c44c587bf14..e2643a9f37d 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -249,6 +249,7 @@ struct gl_drawable
     SIZE                           pixmap_size;  /* pixmap size for GLXPixmap drawables */
     int                            swap_interval;
     BOOL                           refresh_swap_interval;
+    BOOL                           mutable_pf;
 };
 
 enum glx_swap_control_method
@@ -532,7 +533,7 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void)
 done:
     if(vis) XFree(vis);
     if(ctx) {
-        pglXMakeCurrent(gdi_display, None, NULL);    
+        pglXMakeCurrent(gdi_display, None, NULL);
         pglXDestroyContext(gdi_display, ctx);
     }
     if (win != root) XDestroyWindow( gdi_display, win );
@@ -751,7 +752,7 @@ static const char *debugstr_fbconfig( GLXFBConfig fbconfig )
 
 static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, struct wgl_pbuffer* pbuf) {
   int nAttribs = 0;
-  unsigned cur = 0; 
+  unsigned cur = 0;
   int attr, pop;
   int drawattrib = 0;
   int nvfloatattrib = GLX_DONT_CARE;
@@ -815,7 +816,7 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, struct wgl_
       case WGL_TYPE_RGBA_FLOAT_ATI: pixelattrib = GLX_RGBA_FLOAT_BIT; break ;
       case WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT: pixelattrib = GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT; break ;
       default:
-        ERR("unexpected PixelType(%x)\n", pop);	
+        ERR("unexpected PixelType(%x)\n", pop);
       }
       break;
 
@@ -924,7 +925,7 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, struct wgl_
     case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV:
     case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV:
     case WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV:
-      /** cannot be converted, see direct handling on 
+      /** cannot be converted, see direct handling on
        *   - wglGetPixelFormatAttribivARB
        *  TODO: wglChoosePixelFormat
        */
@@ -1306,7 +1307,8 @@ static GLXContext create_glxcontext(Display *display, struct wgl_context *contex
 /***********************************************************************
  *              create_gl_drawable
  */
-static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel_format *format, BOOL known_child )
+static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel_format *format, BOOL known_child,
+                                               BOOL mutable_pf )
 {
     struct gl_drawable *gl, *prev;
     XVisualInfo *visual = format->visual;
@@ -1326,6 +1328,7 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel
     gl->refresh_swap_interval = TRUE;
     gl->format = format;
     gl->ref = 1;
+    gl->mutable_pf = mutable_pf;
 
     if (!known_child && !GetWindow( hwnd, GW_CHILD ) && GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow())  /* childless top-level window */
     {
@@ -1384,13 +1387,13 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel
 /***********************************************************************
  *              set_win_format
  */
-static BOOL set_win_format( HWND hwnd, const struct wgl_pixel_format *format )
+static BOOL set_win_format( HWND hwnd, const struct wgl_pixel_format *format, BOOL mutable_pf )
 {
     struct gl_drawable *gl;
 
     if (!format->visual) return FALSE;
 
-    if (!(gl = create_gl_drawable( hwnd, format, FALSE ))) return FALSE;
+    if (!(gl = create_gl_drawable( hwnd, format, FALSE, mutable_pf ))) return FALSE;
 
     TRACE( "created GL drawable %lx for win %p %s\n",
            gl->drawable, hwnd, debugstr_fbconfig( format->fbconfig ));
@@ -1437,12 +1440,14 @@ static BOOL set_pixel_format(HDC hdc, int format, BOOL allow_change)
         if ((gl = get_gl_drawable( hwnd, hdc )))
         {
             int prev = pixel_format_index( gl->format );
+            BOOL mutable_pf = gl->mutable_pf;
             release_gl_drawable( gl );
-            return prev == format;  /* cannot change it if already set */
+            if (!mutable_pf)
+                return prev == format;  /* cannot change it if already set */
         }
     }
 
-    return set_win_format( hwnd, fmt );
+    return set_win_format( hwnd, fmt, allow_change );
 }
 
 
@@ -1461,7 +1466,7 @@ void sync_gl_drawable( HWND hwnd, BOOL known_child )
         if (!known_child) break; /* Still a childless top-level window */
         /* fall through */
     case DC_GL_PIXMAP_WIN:
-        if (!(new = create_gl_drawable( hwnd, old->format, known_child ))) break;
+        if (!(new = create_gl_drawable( hwnd, old->format, known_child, FALSE ))) break;
         mark_drawable_dirty( old, new );
         XFlush( gdi_display );
         TRACE( "Recreated GL drawable %lx to replace %lx\n", new->drawable, old->drawable );
@@ -1498,7 +1503,7 @@ void set_gl_drawable_parent( HWND hwnd, HWND parent )
         return;
     }
 
-    if ((new = create_gl_drawable( hwnd, old->format, FALSE )))
+    if ((new = create_gl_drawable( hwnd, old->format, FALSE, FALSE )))
     {
         mark_drawable_dirty( old, new );
         release_gl_drawable( new );
@@ -2140,7 +2145,7 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int iPixelFormat
     object->fmt = fmt;
 
     PUSH2(attribs, GLX_PBUFFER_WIDTH,  iWidth);
-    PUSH2(attribs, GLX_PBUFFER_HEIGHT, iHeight); 
+    PUSH2(attribs, GLX_PBUFFER_HEIGHT, iHeight);
     while (piAttribList && 0 != *piAttribList) {
         int attr_v;
         switch (*piAttribList) {
@@ -2686,7 +2691,7 @@ static BOOL X11DRV_wglGetPixelFormatAttribivARB( HDC hdc, int iPixelFormat, int
                 continue;
 
             case WGL_SUPPORT_OPENGL_ARB:
-                piValues[i] = GL_TRUE; 
+                piValues[i] = GL_TRUE;
                 continue;
 
             case WGL_ACCELERATION_ARB:
@@ -2734,14 +2739,14 @@ static BOOL X11DRV_wglGetPixelFormatAttribivARB( HDC hdc, int iPixelFormat, int
             case WGL_BIND_TO_TEXTURE_RGBA_ARB:
                 if (!use_render_texture_emulation) {
                     piValues[i] = GL_FALSE;
-                    continue;	
+                    continue;
                 }
                 curGLXAttr = GLX_RENDER_TYPE;
                 if (!fmt) goto pix_error;
                 hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, curGLXAttr, &tmp);
                 if (hTest) goto get_error;
                 if (GLX_COLOR_INDEX_BIT == tmp) {
-                    piValues[i] = GL_FALSE;  
+                    piValues[i] = GL_FALSE;
                     continue;
                 }
                 hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &tmp);
@@ -2896,8 +2901,8 @@ static BOOL X11DRV_wglGetPixelFormatAttribivARB( HDC hdc, int iPixelFormat, int
             hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, curGLXAttr, piValues + i);
             if (hTest) goto get_error;
             curGLXAttr = 0;
-        } else { 
-            piValues[i] = GL_FALSE; 
+        } else {
+            piValues[i] = GL_FALSE;
         }
     }
     return GL_TRUE;
-- 
2.25.1




More information about the wine-devel mailing list