From f9696eea8b1541506069e6f5a9d5fd67bb620a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20M=C3=A1t=C3=A9?= Date: Tue, 15 Mar 2016 18:58:26 +0100 Subject: [PATCH] winex11: Don't create a temporary context each time X11DRV_wglBindTexImageARB is called. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miklós Máté Signed-off-by: Matteo Bruni Signed-off-by: Alexandre Julliard --- dlls/winex11.drv/opengl.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 8177b00351d..ab29ce4f6bc 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -237,6 +237,9 @@ struct wgl_pbuffer GLenum texture_type; GLuint texture; int texture_level; + GLXContext tmp_context; + GLXContext prev_context; + struct list entry; }; enum dc_gl_type @@ -275,6 +278,7 @@ static XContext gl_hwnd_context; static XContext gl_pbuffer_context; static struct list context_list = LIST_INIT( context_list ); +static struct list pbuffer_list = LIST_INIT( pbuffer_list ); static struct WineGLInfo WineGLInfo = { 0 }; static struct wgl_pixel_format *pixel_formats; static int nb_pixel_formats, nb_onscreen_formats; @@ -1812,10 +1816,19 @@ static struct wgl_context *glxdrv_wglCreateContext( HDC hdc ) */ static void glxdrv_wglDeleteContext(struct wgl_context *ctx) { + struct wgl_pbuffer *pb; + TRACE("(%p)\n", ctx); EnterCriticalSection( &context_section ); list_remove( &ctx->entry ); + LIST_FOR_EACH_ENTRY( pb, &pbuffer_list, struct wgl_pbuffer, entry ) + { + if (pb->prev_context == ctx->ctx) { + pglXDestroyContext(gdi_display, pb->tmp_context); + pb->prev_context = pb->tmp_context = NULL; + } + } LeaveCriticalSection( &context_section ); if (ctx->ctx) pglXDestroyContext( gdi_display, ctx->ctx ); @@ -2301,6 +2314,9 @@ static struct wgl_pbuffer *X11DRV_wglCreatePbufferARB( HDC hdc, int iPixelFormat SetLastError(ERROR_NO_SYSTEM_RESOURCES); goto create_failed; /* unexpected error */ } + EnterCriticalSection( &context_section ); + list_add_head( &pbuffer_list, &object->entry ); + LeaveCriticalSection( &context_section ); TRACE("->(%p)\n", object); return object; @@ -2319,7 +2335,12 @@ static BOOL X11DRV_wglDestroyPbufferARB( struct wgl_pbuffer *object ) { TRACE("(%p)\n", object); + EnterCriticalSection( &context_section ); + list_remove( &object->entry ); + LeaveCriticalSection( &context_section ); pglXDestroyPbuffer(gdi_display, object->drawable); + if (object->tmp_context) + pglXDestroyContext(gdi_display, object->tmp_context); HeapFree(GetProcessHeap(), 0, object); return GL_TRUE; } @@ -2925,7 +2946,6 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) int prev_binded_texture = 0; GLXContext prev_context; Drawable prev_drawable; - GLXContext tmp_context; prev_context = pglXGetCurrentContext(); prev_drawable = pglXGetCurrentDrawable(); @@ -2940,21 +2960,25 @@ static BOOL X11DRV_wglBindTexImageARB( struct wgl_pbuffer *object, int iBuffer ) } TRACE("drawable=%lx, context=%p\n", object->drawable, prev_context); - tmp_context = pglXCreateNewContext(gdi_display, object->fmt->fbconfig, object->fmt->render_type, prev_context, True); + if (!object->tmp_context || object->prev_context != prev_context) { + if (object->tmp_context) + pglXDestroyContext(gdi_display, object->tmp_context); + object->tmp_context = pglXCreateNewContext(gdi_display, object->fmt->fbconfig, object->fmt->render_type, prev_context, True); + object->prev_context = prev_context; + } opengl_funcs.gl.p_glGetIntegerv(object->texture_bind_target, &prev_binded_texture); /* Switch to our pbuffer */ - pglXMakeCurrent(gdi_display, object->drawable, tmp_context); + pglXMakeCurrent(gdi_display, object->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 upload the pbuffer texture data. */ + * After that copy the pbuffer texture data. */ opengl_funcs.gl.p_glBindTexture(object->texture_target, prev_binded_texture); opengl_funcs.gl.p_glCopyTexImage2D(object->texture_target, 0, object->use_render_texture, 0, 0, object->width, object->height, 0); - /* Switch back to the original drawable and upload the pbuffer-texture */ + /* Switch back to the original drawable and context */ pglXMakeCurrent(gdi_display, prev_drawable, prev_context); - pglXDestroyContext(gdi_display, tmp_context); return GL_TRUE; }