From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 130 ++++++++++++++--------------------- include/wine/opengl_driver.h | 1 + 2 files changed, 52 insertions(+), 79 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 01b7e5e0638..092ee78802b 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -158,29 +158,6 @@ static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { TRACE("\n"); }
-/* GLX Extensions */ -static GLXContext (*pglXCreateContextAttribsARB)(Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); -static void (*pglXSwapIntervalEXT)(Display *dpy, GLXDrawable drawable, int interval); -static int (*pglXSwapIntervalSGI)(int); - -/* NV GLX Extension */ -static void* (*pglXAllocateMemoryNV)(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); -static void (*pglXFreeMemoryNV)(GLvoid *pointer); - -/* MESA GLX Extensions */ -static void (*pglXCopySubBufferMESA)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); -static int (*pglXSwapIntervalMESA)(unsigned int interval); -static Bool (*pglXQueryCurrentRendererIntegerMESA)(int attribute, unsigned int *value); -static const char *(*pglXQueryCurrentRendererStringMESA)(int attribute); -static Bool (*pglXQueryRendererIntegerMESA)(Display *dpy, int screen, int renderer, int attribute, unsigned int *value); -static const char *(*pglXQueryRendererStringMESA)(Display *dpy, int screen, int renderer, int attribute); - -/* OpenML GLX Extensions */ -static Bool (*pglXWaitForSbcOML)( Display *dpy, GLXDrawable drawable, - INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc ); -static INT64 (*pglXSwapBuffersMscOML)( Display *dpy, GLXDrawable drawable, - INT64 target_msc, INT64 divisor, INT64 remainder ); - /* Standard OpenGL */ static const GLubyte *(*pglGetString)(GLenum name);
@@ -361,23 +338,6 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c LOAD_FUNCPTR( glGetString ); #undef LOAD_FUNCPTR
-/* It doesn't matter if these fail. They'll only be used if the driver reports - the associated extension is available (and if a driver reports the extension - is available but fails to provide the functions, it's quite broken) */ -#define LOAD_FUNCPTR( f ) p##f = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)#f ) - /* ARB GLX Extension */ - LOAD_FUNCPTR(glXCreateContextAttribsARB); - /* EXT GLX Extension */ - LOAD_FUNCPTR(glXSwapIntervalEXT); - /* MESA GLX Extension */ - LOAD_FUNCPTR(glXSwapIntervalMESA); - /* SGI GLX Extension */ - LOAD_FUNCPTR(glXSwapIntervalSGI); - /* NV GLX Extension */ - LOAD_FUNCPTR(glXAllocateMemoryNV); - LOAD_FUNCPTR(glXFreeMemoryNV); -#undef LOAD_FUNCPTR - if (!X11DRV_WineGL_InitOpenglInfo()) return STATUS_NOT_SUPPORTED;
if (!XQueryExtension( gdi_display, "GLX", &glx_opcode, &event_base, &error_base ) || @@ -389,25 +349,6 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c gl_hwnd_context = XUniqueContext(); gl_pbuffer_context = XUniqueContext();
- if (has_extension( glxExtensions, "GLX_MESA_copy_sub_buffer" )) - { - pglXCopySubBufferMESA = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXCopySubBufferMESA" ); - } - - if (has_extension( glxExtensions, "GLX_MESA_query_renderer" )) - { - pglXQueryCurrentRendererIntegerMESA = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXQueryCurrentRendererIntegerMESA" ); - pglXQueryCurrentRendererStringMESA = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXQueryCurrentRendererStringMESA" ); - pglXQueryRendererIntegerMESA = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXQueryRendererIntegerMESA" ); - pglXQueryRendererStringMESA = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXQueryRendererStringMESA" ); - } - - if (has_extension( glxExtensions, "GLX_OML_sync_control" )) - { - pglXWaitForSbcOML = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXWaitForSbcOML" ); - pglXSwapBuffersMscOML = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXSwapBuffersMscOML" ); - } - *driver_funcs = &x11drv_driver_funcs; return STATUS_SUCCESS; } @@ -702,13 +643,13 @@ static BOOL set_swap_interval( struct gl_drawable *gl, int interval ) { case GLX_SWAP_CONTROL_EXT: X11DRV_expect_error(gdi_display, GLXErrorHandler, NULL); - pglXSwapIntervalEXT( gdi_display, gl->drawable, interval ); + funcs->p_glXSwapIntervalEXT( gdi_display, gl->drawable, interval ); XSync(gdi_display, False); ret = !X11DRV_check_error(); break;
case GLX_SWAP_CONTROL_MESA: - ret = !pglXSwapIntervalMESA(interval); + ret = !funcs->p_glXSwapIntervalMESA( interval ); break;
case GLX_SWAP_CONTROL_SGI: @@ -719,7 +660,7 @@ static BOOL set_swap_interval( struct gl_drawable *gl, int interval ) if (!interval) WARN("Request to disable vertical sync is not handled\n"); else - ret = !pglXSwapIntervalSGI(interval); + ret = !funcs->p_glXSwapIntervalSGI( interval ); break;
case GLX_SWAP_CONTROL_NONE: @@ -751,7 +692,7 @@ static GLXContext create_glxcontext(Display *display, struct x11drv_context *con GLXContext ctx;
if (context->gl3_context) - ctx = pglXCreateContextAttribsARB( gdi_display, context->fmt->fbconfig, shareList, GL_TRUE, attribs ); + ctx = funcs->p_glXCreateContextAttribsARB( gdi_display, context->fmt->fbconfig, shareList, GL_TRUE, attribs ); else if (context->fmt->visual) ctx = funcs->p_glXCreateContext( gdi_display, context->fmt->visual, shareList, GL_TRUE ); else /* Create a GLX Context for a pbuffer */ @@ -1519,22 +1460,22 @@ static UINT x11drv_pbuffer_bind( HDC hdc, void *private, GLenum buffer )
static BOOL X11DRV_wglQueryCurrentRendererIntegerWINE( GLenum attribute, GLuint *value ) { - return pglXQueryCurrentRendererIntegerMESA( attribute, value ); + return funcs->p_glXQueryCurrentRendererIntegerMESA( attribute, value ); }
static const char *X11DRV_wglQueryCurrentRendererStringWINE( GLenum attribute ) { - return pglXQueryCurrentRendererStringMESA( attribute ); + return funcs->p_glXQueryCurrentRendererStringMESA( attribute ); }
static BOOL X11DRV_wglQueryRendererIntegerWINE( HDC dc, GLint renderer, GLenum attribute, GLuint *value ) { - return pglXQueryRendererIntegerMESA( gdi_display, DefaultScreen(gdi_display), renderer, attribute, value ); + return funcs->p_glXQueryRendererIntegerMESA( gdi_display, DefaultScreen( gdi_display ), renderer, attribute, value ); }
static const char *X11DRV_wglQueryRendererStringWINE( HDC dc, GLint renderer, GLenum attribute ) { - return pglXQueryRendererStringMESA( gdi_display, DefaultScreen(gdi_display), renderer, attribute ); + return funcs->p_glXQueryRendererStringMESA( gdi_display, DefaultScreen( gdi_display ), renderer, attribute ); }
static void register_extension(const char *ext) @@ -1550,6 +1491,37 @@ static const char *x11drv_init_wgl_extensions( struct opengl_funcs *funcs ) { wglExtensions[0] = 0;
+#define LOAD_FUNCPTR( f ) funcs->p_##f = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)#f ) + /* ARB GLX Extension */ + LOAD_FUNCPTR( glXCreateContextAttribsARB ); + /* EXT GLX Extension */ + LOAD_FUNCPTR( glXSwapIntervalEXT ); + /* MESA GLX Extension */ + LOAD_FUNCPTR( glXSwapIntervalMESA ); + /* SGI GLX Extension */ + LOAD_FUNCPTR( glXSwapIntervalSGI ); + /* NV GLX Extension */ + LOAD_FUNCPTR( glXAllocateMemoryNV ); + LOAD_FUNCPTR( glXFreeMemoryNV ); + + if (has_extension( glxExtensions, "GLX_MESA_copy_sub_buffer" )) + { + LOAD_FUNCPTR( glXCopySubBufferMESA ); + } + if (has_extension( glxExtensions, "GLX_MESA_query_renderer" )) + { + LOAD_FUNCPTR( glXQueryCurrentRendererIntegerMESA ); + LOAD_FUNCPTR( glXQueryCurrentRendererStringMESA ); + LOAD_FUNCPTR( glXQueryRendererIntegerMESA ); + LOAD_FUNCPTR( glXQueryRendererStringMESA ); + } + if (has_extension( glxExtensions, "GLX_OML_sync_control" )) + { + LOAD_FUNCPTR( glXWaitForSbcOML ); + LOAD_FUNCPTR( glXSwapBuffersMscOML ); + } +#undef LOAD_FUNCPTR + /* ARB Extensions */
if (has_extension( glxExtensions, "GLX_ARB_multisample")) register_extension( "WGL_ARB_multisample" ); @@ -1594,8 +1566,8 @@ static const char *x11drv_init_wgl_extensions( struct opengl_funcs *funcs ) if (has_extension(glExtensions, "GL_NV_vertex_array_range")) { register_extension( "WGL_NV_vertex_array_range" ); - funcs->p_wglAllocateMemoryNV = pglXAllocateMemoryNV; - funcs->p_wglFreeMemoryNV = pglXFreeMemoryNV; + funcs->p_wglAllocateMemoryNV = funcs->p_glXAllocateMemoryNV; + funcs->p_wglFreeMemoryNV = funcs->p_glXFreeMemoryNV; }
if (has_extension(glxExtensions, "GLX_OML_swap_method")) @@ -1644,19 +1616,19 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval case DC_GL_PIXMAP_WIN: if (ctx) sync_context( ctx ); drawable = gl->pixmap; - if (ctx && pglXCopySubBufferMESA) { + if (ctx && funcs->p_glXCopySubBufferMESA) + { /* (glX)SwapBuffers has an implicit glFlush effect, however * GLX_MESA_copy_sub_buffer doesn't. Make sure GL is flushed before * copying */ funcs->p_glFlush(); - pglXCopySubBufferMESA( gdi_display, gl->drawable, 0, 0, - gl->rect.right, gl->rect.bottom ); + funcs->p_glXCopySubBufferMESA( gdi_display, gl->drawable, 0, 0, gl->rect.right, gl->rect.bottom ); break; } - if (ctx && pglXSwapBuffersMscOML) + if (ctx && funcs->p_glXSwapBuffersMscOML) { funcs->p_glFlush(); - target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); + target_sbc = funcs->p_glXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; } funcs->p_glXSwapBuffers( gdi_display, gl->drawable ); @@ -1667,20 +1639,20 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval if (gl->type == DC_GL_CHILD_WIN) drawable = gl->window; /* fall through */ default: - if (ctx && drawable && pglXSwapBuffersMscOML) + if (ctx && drawable && funcs->p_glXSwapBuffersMscOML) { funcs->p_glFlush(); - target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); + target_sbc = funcs->p_glXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; } funcs->p_glXSwapBuffers( gdi_display, gl->drawable ); break; }
- if (ctx && drawable && pglXWaitForSbcOML) - pglXWaitForSbcOML( gdi_display, gl->drawable, target_sbc, &ust, &msc, &sbc ); + if (ctx && drawable && funcs->p_glXWaitForSbcOML) + funcs->p_glXWaitForSbcOML( gdi_display, gl->drawable, target_sbc, &ust, &msc, &sbc );
- present_gl_drawable( hwnd, ctx ? ctx->hdc : hdc, gl, !pglXWaitForSbcOML, FALSE ); + present_gl_drawable( hwnd, ctx ? ctx->hdc : hdc, gl, !funcs->p_glXWaitForSbcOML, FALSE ); update_gl_drawable_size( gl ); release_gl_drawable( gl ); return TRUE; diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 5d2daf39dc1..8648c824a68 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -107,6 +107,7 @@ struct opengl_funcs BOOL (*p_wglSwapIntervalEXT)( int interval ); #define USE_GL_FUNC(x) PFN_##x p_##x; ALL_GLX_FUNCS + ALL_GLX_EXT_FUNCS ALL_EGL_FUNCS ALL_GL_FUNCS ALL_GL_EXT_FUNCS