[PATCH v3 1/2] winex11.drv: Store wgl_drawable instead of GLX drawable in wgl_pbuffer.

Paul Gofman wine at gitlab.winehq.org
Mon Jun 20 09:31:13 CDT 2022


From: Paul Gofman <pgofman at codeweavers.com>

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/winex11.drv/opengl.c | 84 ++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 41 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 017a8813caa..468d10fbbae 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -209,26 +209,6 @@ struct wgl_context
     struct list entry;
 };
 
-struct wgl_pbuffer
-{
-    Drawable   drawable;
-    const struct wgl_pixel_format* fmt;
-    int        width;
-    int        height;
-    int*       attribList;
-    int        use_render_texture; /* This is also the internal texture format */
-    int        texture_bind_target;
-    int        texture_bpp;
-    GLint      texture_format;
-    GLuint     texture_target;
-    GLenum     texture_type;
-    GLuint     texture;
-    int        texture_level;
-    GLXContext tmp_context;
-    GLXContext prev_context;
-    struct list entry;
-};
-
 enum dc_gl_type
 {
     DC_GL_NONE,       /* no GL support (pixel format not set yet) */
@@ -252,6 +232,26 @@ struct gl_drawable
     BOOL                           mutable_pf;
 };
 
+struct wgl_pbuffer
+{
+    struct gl_drawable *gl;
+    const struct wgl_pixel_format* fmt;
+    int        width;
+    int        height;
+    int*       attribList;
+    int        use_render_texture; /* This is also the internal texture format */
+    int        texture_bind_target;
+    int        texture_bpp;
+    GLint      texture_format;
+    GLuint     texture_target;
+    GLenum     texture_type;
+    GLuint     texture;
+    int        texture_level;
+    GLXContext tmp_context;
+    GLXContext prev_context;
+    struct list entry;
+};
+
 enum glx_swap_control_method
 {
     GLX_SWAP_CONTROL_NONE,
@@ -2276,9 +2276,19 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int iPixelFormat
     }
 
     PUSH1(attribs, None);
-    object->drawable = pglXCreatePbuffer(gdi_display, fmt->fbconfig, attribs);
-    TRACE("new Pbuffer drawable as %lx\n", object->drawable);
-    if (!object->drawable) {
+    if (!(object->gl = calloc( 1, sizeof(*object->gl) )))
+    {
+        SetLastError(ERROR_NO_SYSTEM_RESOURCES);
+        goto create_failed;
+    }
+    object->gl->type = DC_GL_PBUFFER;
+    object->gl->format = object->fmt;
+    object->gl->ref = 1;
+
+    object->gl->drawable = pglXCreatePbuffer(gdi_display, fmt->fbconfig, attribs);
+    TRACE("new Pbuffer drawable as %p (%lx)\n", object->gl, object->gl->drawable);
+    if (!object->gl->drawable) {
+        free( object->gl );
         SetLastError(ERROR_NO_SYSTEM_RESOURCES);
         goto create_failed; /* unexpected error */
     }
@@ -2306,7 +2316,8 @@ static BOOL X11DRV_wglDestroyPbufferARB( struct wgl_pbuffer *object )
     pthread_mutex_lock( &context_mutex );
     list_remove( &object->entry );
     pthread_mutex_unlock( &context_mutex );
-    pglXDestroyPbuffer(gdi_display, object->drawable);
+    pglXDestroyPbuffer(gdi_display, object->gl->drawable);
+    release_gl_drawable( object->gl );
     if (object->tmp_context)
         pglXDestroyContext(gdi_display, object->tmp_context);
     free( object );
@@ -2321,30 +2332,21 @@ static BOOL X11DRV_wglDestroyPbufferARB( struct wgl_pbuffer *object )
 static HDC X11DRV_wglGetPbufferDCARB( struct wgl_pbuffer *object )
 {
     struct x11drv_escape_set_drawable escape;
-    struct gl_drawable *gl, *prev;
+    struct gl_drawable *prev;
     HDC hdc;
 
     hdc = NtGdiOpenDCW( NULL, NULL, NULL, 0, TRUE, NULL, NULL, NULL );
     if (!hdc) return 0;
 
-    if (!(gl = calloc( 1, sizeof(*gl) )))
-    {
-        NtGdiDeleteObjectApp( hdc );
-        return 0;
-    }
-    gl->type = DC_GL_PBUFFER;
-    gl->drawable = object->drawable;
-    gl->format = object->fmt;
-    gl->ref = 1;
-
     pthread_mutex_lock( &context_mutex );
     if (!XFindContext( gdi_display, (XID)hdc, gl_pbuffer_context, (char **)&prev ))
         release_gl_drawable( prev );
-    XSaveContext( gdi_display, (XID)hdc, gl_pbuffer_context, (char *)gl );
+    grab_gl_drawable( object->gl );
+    XSaveContext( gdi_display, (XID)hdc, gl_pbuffer_context, (char *)object->gl );
     pthread_mutex_unlock( &context_mutex );
 
     escape.code = X11DRV_SET_DRAWABLE;
-    escape.drawable = object->drawable;
+    escape.drawable = object->gl->drawable;
     escape.mode = IncludeInferiors;
     SetRect( &escape.dc_rect, 0, 0, object->width, object->height );
     NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
@@ -2364,10 +2366,10 @@ static BOOL X11DRV_wglQueryPbufferARB( struct wgl_pbuffer *object, int iAttribut
 
     switch (iAttribute) {
         case WGL_PBUFFER_WIDTH_ARB:
-            pglXQueryDrawable(gdi_display, object->drawable, GLX_WIDTH, (unsigned int*) piValue);
+            pglXQueryDrawable(gdi_display, object->gl->drawable, GLX_WIDTH, (unsigned int*) piValue);
             break;
         case WGL_PBUFFER_HEIGHT_ARB:
-            pglXQueryDrawable(gdi_display, object->drawable, GLX_HEIGHT, (unsigned int*) piValue);
+            pglXQueryDrawable(gdi_display, object->gl->drawable, GLX_HEIGHT, (unsigned int*) piValue);
             break;
 
         case WGL_PBUFFER_LOST_ARB:
@@ -2981,7 +2983,7 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer )
             FIXME("partial stub!\n");
         }
 
-        TRACE("drawable=%lx, context=%p\n", object->drawable, prev_context);
+        TRACE("drawable=%p (%lx), context=%p\n", object->gl, object->gl->drawable, prev_context);
         if (!object->tmp_context || object->prev_context != prev_context) {
             if (object->tmp_context)
                 pglXDestroyContext(gdi_display, object->tmp_context);
@@ -2992,7 +2994,7 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer )
         opengl_funcs.gl.p_glGetIntegerv(object->texture_bind_target, &prev_binded_texture);
 
         /* Switch to our pbuffer */
-        pglXMakeCurrent(gdi_display, object->drawable, object->tmp_context);
+        pglXMakeCurrent(gdi_display, object->gl->drawable, object->tmp_context);
 
         /* Make sure that the prev_binded_texture is set as the current texture state isn't shared between contexts.
          * After that copy the pbuffer texture data. */
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/244



More information about the wine-devel mailing list