From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 3 ++ dlls/opengl32/unix_private.h | 3 ++ dlls/opengl32/unix_thunks.c | 8 ++--- dlls/opengl32/unix_wgl.c | 38 +++++++++++++++++++++ dlls/win32u/opengl.c | 62 +++++++---------------------------- dlls/wineandroid.drv/opengl.c | 2 +- dlls/winemac.drv/opengl.c | 2 +- dlls/winewayland.drv/opengl.c | 2 +- dlls/winex11.drv/opengl.c | 7 ++-- include/wine/opengl_driver.h | 3 +- 10 files changed, 66 insertions(+), 64 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 0001ffe28f3..bc8eb05aaa5 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -200,10 +200,13 @@ my %manual_unix_thunks = "glDebugMessageCallback" => 1, "glDebugMessageCallbackAMD" => 1, "glDebugMessageCallbackARB" => 1, + "glFinish" => 1, + "glFlush" => 1, "glGetIntegerv" => 1, "glGetString" => 1, "glGetStringi" => 1, "wglGetProcAddress" => 1, + "wglSwapBuffers" => 1, ); my %manual_wow64_thunks = ( diff --git a/dlls/opengl32/unix_private.h b/dlls/opengl32/unix_private.h index 62e96dfbe81..30b90545105 100644 --- a/dlls/opengl32/unix_private.h +++ b/dlls/opengl32/unix_private.h @@ -80,6 +80,9 @@ extern HGLRC wrap_wglCreateContext( TEB *teb, HDC hDc ); extern BOOL wrap_wglDeleteContext( TEB *teb, HGLRC oldContext ); extern PROC wrap_wglGetProcAddress( TEB *teb, LPCSTR lpszProc ); extern BOOL wrap_wglMakeCurrent( TEB *teb, HDC hDc, HGLRC newContext ); +extern void wrap_glFinish( TEB *teb ); +extern void wrap_glFlush( TEB *teb ); +extern BOOL wrap_wglSwapBuffers( TEB *teb, HDC hdc ); extern BOOL wrap_wglShareLists( TEB *teb, HGLRC hrcSrvShare, HGLRC hrcSrvSource ); extern void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data ); extern const GLubyte * wrap_glGetString( TEB *teb, GLenum name ); diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 4342e809481..ae97dfbec47 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -100,7 +100,7 @@ static NTSTATUS wgl_wglSwapBuffers( void *args ) struct wglSwapBuffers_params *params = args; const struct opengl_funcs *funcs = get_dc_funcs( params->hdc ); if (!funcs || !funcs->p_wglSwapBuffers) return STATUS_NOT_IMPLEMENTED; - params->ret = funcs->p_wglSwapBuffers( params->hdc ); + params->ret = wrap_wglSwapBuffers( params->teb, params->hdc ); return STATUS_SUCCESS; }
@@ -907,8 +907,7 @@ static NTSTATUS gl_glFeedbackBuffer( void *args ) static NTSTATUS gl_glFinish( void *args ) { struct glFinish_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glFinish(); + wrap_glFinish( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } @@ -916,8 +915,7 @@ static NTSTATUS gl_glFinish( void *args ) static NTSTATUS gl_glFlush( void *args ) { struct glFlush_params *params = args; - const struct opengl_funcs *funcs = params->teb->glTable; - funcs->p_glFlush(); + wrap_glFlush( params->teb ); set_context_attribute( params->teb, -1 /* unsupported */, NULL, 0 ); return STATUS_SUCCESS; } diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 94220daf4fd..f009c74e209 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -986,6 +986,44 @@ BOOL wrap_wglDeleteContext( TEB *teb, HGLRC hglrc ) return TRUE; }
+static void flush_context( TEB *teb, void (*flush)(void) ) +{ + struct opengl_context *ctx = get_current_context( teb ); + const struct opengl_funcs *funcs = teb->glTable; + + if (!ctx || !funcs->p_wgl_context_flush( ctx->drv_ctx, flush )) + { + /* default implementation: call the functions directly */ + if (flush) flush(); + } +} + +void wrap_glFinish( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + flush_context( teb, funcs->p_glFinish ); +} + +void wrap_glFlush( TEB *teb ) +{ + const struct opengl_funcs *funcs = teb->glTable; + flush_context( teb, funcs->p_glFlush ); +} + +BOOL wrap_wglSwapBuffers( TEB *teb, HDC hdc ) +{ + const struct opengl_funcs *funcs = get_dc_funcs( hdc ); + BOOL ret; + + if (!(ret = funcs->p_wglSwapBuffers( hdc ))) + { + /* default implementation: implicitly flush the context */ + flush_context( teb, funcs->p_glFlush ); + } + + return ret; +} + BOOL wrap_wglShareLists( TEB *teb, HGLRC hglrcSrc, HGLRC hglrcDst ) { const struct opengl_funcs *src_funcs, *dst_funcs; diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index e060b04f15f..561d09f96f2 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -45,10 +45,6 @@ struct wgl_context const struct opengl_funcs *funcs; void *driver_private; int pixel_format; - - /* hooked host function pointers */ - PFN_glFinish p_glFinish; - PFN_glFlush p_glFlush; };
struct wgl_pbuffer @@ -74,9 +70,6 @@ static struct egl_platform display_egl; static struct opengl_funcs display_funcs; static struct opengl_funcs memory_funcs;
-static PFN_glFinish p_memory_glFinish, p_display_glFinish; -static PFN_glFlush p_memory_glFlush, p_display_glFlush; - static const struct opengl_funcs *get_dc_funcs( HDC hdc, const struct opengl_funcs *null_funcs );
static const struct @@ -424,7 +417,7 @@ static BOOL egldrv_context_destroy( void *private ) return FALSE; }
-static BOOL egldrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL egldrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { FIXME( "stub!\n" ); return FALSE; @@ -767,7 +760,7 @@ static BOOL osmesa_context_make_current( HDC draw_hdc, HDC read_hdc, void *priva return ret; }
-static BOOL osmesa_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL osmesa_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { return FALSE; } @@ -859,7 +852,7 @@ static BOOL nulldrv_context_destroy( void *private ) return FALSE; }
-static BOOL nulldrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL nulldrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { return FALSE; } @@ -1044,8 +1037,6 @@ static struct wgl_context *context_create( HDC hdc, struct wgl_context *shared, context->driver_funcs = driver_funcs; context->funcs = funcs; context->pixel_format = format; - context->p_glFinish = funcs == &display_funcs ? p_display_glFinish : p_memory_glFinish; - context->p_glFlush = funcs == &display_funcs ? p_display_glFlush : p_memory_glFlush;
if (!driver_funcs->p_context_create( hdc, format, shared_private, attribs, &context->driver_private )) { @@ -1552,23 +1543,17 @@ static int get_window_swap_interval( HWND hwnd ) return interval; }
-static void wgl_context_flush( struct wgl_context *context, BOOL finish ) +static BOOL win32u_wgl_context_flush( struct wgl_context *context, void (*flush)(void) ) { - HDC hdc = NtCurrentTeb()->glReserved1[0]; + HDC draw_hdc = NtCurrentTeb()->glReserved1[0]; int interval; HWND hwnd;
- if (!(hwnd = NtUserWindowFromDC( hdc ))) interval = 0; + if (!(hwnd = NtUserWindowFromDC( draw_hdc ))) interval = 0; else interval = get_window_swap_interval( hwnd );
- TRACE( "context %p, hwnd %p, hdc %p, interval %d, finish %u\n", context, hwnd, hdc, interval, finish ); - - if (!context->driver_funcs->p_context_flush( context->driver_private, hwnd, hdc, interval, finish )) - { - /* default implementation: call the hooked functions */ - if (finish) context->p_glFinish(); - else context->p_glFlush(); - } + TRACE( "context %p, hwnd %p, draw_hdc %p, interval %d, flush %p\n", context, hwnd, draw_hdc, interval, flush ); + return context->driver_funcs->p_context_flush( context->driver_private, hwnd, draw_hdc, interval, flush ); }
static BOOL win32u_wglSwapBuffers( HDC hdc ) @@ -1589,14 +1574,7 @@ static BOOL win32u_wglSwapBuffers( HDC hdc ) if (!(hwnd = NtUserWindowFromDC( hdc ))) interval = 0; else interval = get_window_swap_interval( hwnd );
- if (!driver_funcs->p_swap_buffers( context ? context->driver_private : NULL, hwnd, hdc, interval )) - { - /* default implementation: implicitly flush the context */ - if (context) wgl_context_flush( context, FALSE ); - return FALSE; - } - - return TRUE; + return driver_funcs->p_swap_buffers( context ? context->driver_private : NULL, hwnd, hdc, interval ); }
static BOOL win32u_wglSwapIntervalEXT( int interval ) @@ -1645,18 +1623,6 @@ static int win32u_wglGetSwapIntervalEXT(void) return interval; }
-static void win32u_glFlush(void) -{ - struct wgl_context *context = NtCurrentTeb()->glContext; - if (context) wgl_context_flush( context, FALSE ); -} - -static void win32u_glFinish(void) -{ - struct wgl_context *context = NtCurrentTeb()->glContext; - if (context) wgl_context_flush( context, TRUE ); -} - static void init_opengl_funcs( struct opengl_funcs *funcs, const struct opengl_driver_funcs *driver_funcs ) { #define USE_GL_FUNC(func) \ @@ -1689,10 +1655,7 @@ static void memory_funcs_init(void) memory_funcs.p_wglMakeCurrent = win32u_wglMakeCurrent;
memory_funcs.p_wglSwapBuffers = win32u_wglSwapBuffers; - p_memory_glFinish = memory_funcs.p_glFinish; - memory_funcs.p_glFinish = win32u_glFinish; - p_memory_glFlush = memory_funcs.p_glFlush; - memory_funcs.p_glFlush = win32u_glFlush; + memory_funcs.p_wgl_context_flush = win32u_wgl_context_flush; }
static void display_funcs_init(void) @@ -1722,10 +1685,7 @@ static void display_funcs_init(void) display_funcs.p_wglMakeCurrent = win32u_wglMakeCurrent;
display_funcs.p_wglSwapBuffers = win32u_wglSwapBuffers; - p_display_glFinish = display_funcs.p_glFinish; - display_funcs.p_glFinish = win32u_glFinish; - p_display_glFlush = display_funcs.p_glFlush; - display_funcs.p_glFlush = win32u_glFlush; + display_funcs.p_wgl_context_flush = win32u_wgl_context_flush;
if (display_egl.has_EGL_EXT_pixel_format_float) { diff --git a/dlls/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index 0e8da03ab0c..60cdd419f62 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -355,7 +355,7 @@ static BOOL android_swap_buffers( void *private, HWND hwnd, HDC hdc, int interva return TRUE; }
-static BOOL android_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL android_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { struct android_context *ctx = private; struct gl_drawable *gl; diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index 474d8f9d4e8..f1d3ef3a265 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -2068,7 +2068,7 @@ static void macdrv_glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, }
-static BOOL macdrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL macdrv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { struct macdrv_context *context = private;
diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index d9b93f44c73..5b995f6b6ab 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -479,7 +479,7 @@ static void *wayland_get_proc_address(const char *name) return funcs->p_eglGetProcAddress(name); }
-static BOOL wayland_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL wayland_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { return FALSE; } diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 3d583a170e7..3c40d864338 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1612,7 +1612,7 @@ static void present_gl_drawable( HWND hwnd, HDC hdc, struct gl_drawable *gl, BOO if (region) NtGdiDeleteObjectApp( region ); }
-static BOOL x11drv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, BOOL finish ) +static BOOL x11drv_context_flush( void *private, HWND hwnd, HDC hdc, int interval, void (*flush)(void) ) { struct gl_drawable *gl; struct x11drv_context *ctx = private; @@ -1624,10 +1624,9 @@ static BOOL x11drv_context_flush( void *private, HWND hwnd, HDC hdc, int interva set_swap_interval( gl, interval ); pthread_mutex_unlock( &context_mutex );
- if (finish) pglFinish(); - else pglFlush(); + if (flush) flush();
- present_gl_drawable( hwnd, ctx->hdc, gl, TRUE, !finish ); + present_gl_drawable( hwnd, ctx->hdc, gl, TRUE, flush != pglFinish ); release_gl_drawable( gl ); return TRUE; } diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 71e799660b8..ed441fdb932 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -69,6 +69,7 @@ struct wgl_pbuffer; /* interface between opengl32 and win32u */ struct opengl_funcs { + BOOL (*p_wgl_context_flush)( struct wgl_context *context, void (*flush)(void) ); BOOL (*p_wglCopyContext)( struct wgl_context * hglrcSrc, struct wgl_context * hglrcDst, UINT mask ); struct wgl_context * (*p_wglCreateContext)( HDC hDc ); BOOL (*p_wglDeleteContext)( struct wgl_context * oldContext ); @@ -134,7 +135,7 @@ struct opengl_driver_funcs BOOL (*p_swap_buffers)(void*,HWND,HDC,int); BOOL (*p_context_create)(HDC,int,void*,const int*,void**); BOOL (*p_context_destroy)(void*); - BOOL (*p_context_flush)(void*,HWND,HDC,int,BOOL); + BOOL (*p_context_flush)(void*,HWND,HDC,int,void(*)(void)); BOOL (*p_context_make_current)(HDC,HDC,void*); BOOL (*p_pbuffer_create)(HDC,int,BOOL,GLenum,GLenum,GLint,GLsizei*,GLsizei*,void **); BOOL (*p_pbuffer_destroy)(HDC,void*);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 3c40d864338..07e90ef2caa 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -346,10 +346,12 @@ static INT64 (*pglXSwapBuffersMscOML)( Display *dpy, GLXDrawable drawable, INT64 target_msc, INT64 divisor, INT64 remainder );
/* Standard OpenGL */ -static void (*pglFinish)(void); -static void (*pglFlush)(void); static const GLubyte *(*pglGetString)(GLenum name);
+static void *opengl_handle; +static const struct opengl_funcs *funcs; +static const struct opengl_driver_funcs x11drv_driver_funcs; + /* check if the extension is present in the list */ static BOOL has_extension( const char *list, const char *ext ) { @@ -490,9 +492,6 @@ done: return ret; }
-static void *opengl_handle; -static const struct opengl_driver_funcs x11drv_driver_funcs; - /********************************************************************** * X11DRV_OpenglInit */ @@ -505,6 +504,7 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c ERR( "version mismatch, opengl32 wants %u but driver has %u\n", version, WINE_OPENGL_DRIVER_VERSION ); return STATUS_INVALID_PARAMETER; } + funcs = opengl_funcs;
/* No need to load any other libraries as according to the ABI, libGL should be self-sufficient and include all dependencies */ @@ -523,8 +523,6 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c ERR( "%s not found in libGL, disabling OpenGL.\n", #func ); \ goto failed; \ } - LOAD_FUNCPTR( glFinish ); - LOAD_FUNCPTR( glFlush ); LOAD_FUNCPTR( glGetString ); #undef LOAD_FUNCPTR
@@ -1589,7 +1587,7 @@ static void present_gl_drawable( HWND hwnd, HDC hdc, struct gl_drawable *gl, BOO window = get_dc_drawable( hdc, &rect ); region = get_dc_monitor_region( hwnd, hdc );
- if (gl_finish) pglFinish(); + if (gl_finish) funcs->p_glFinish(); if (flush) XFlush( gdi_display );
NtUserGetClientRect( hwnd, &rect_dst, NtUserGetWinMonitorDpi( hwnd, MDT_RAW_DPI ) ); @@ -1626,7 +1624,7 @@ static BOOL x11drv_context_flush( void *private, HWND hwnd, HDC hdc, int interva
if (flush) flush();
- present_gl_drawable( hwnd, ctx->hdc, gl, TRUE, flush != pglFinish ); + present_gl_drawable( hwnd, ctx->hdc, gl, TRUE, flush != funcs->p_glFinish ); release_gl_drawable( gl ); return TRUE; } @@ -1942,14 +1940,14 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval /* (glX)SwapBuffers has an implicit glFlush effect, however * GLX_MESA_copy_sub_buffer doesn't. Make sure GL is flushed before * copying */ - pglFlush(); + funcs->p_glFlush(); pglXCopySubBufferMESA( gdi_display, gl->drawable, 0, 0, gl->rect.right, gl->rect.bottom ); break; } if (ctx && pglXSwapBuffersMscOML) { - pglFlush(); + funcs->p_glFlush(); target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; } @@ -1963,7 +1961,7 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval default: if (ctx && drawable && pglXSwapBuffersMscOML) { - pglFlush(); + funcs->p_glFlush(); target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/opengl.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index f1d3ef3a265..c55ecc0976a 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -86,12 +86,13 @@ static pthread_mutex_t context_mutex = PTHREAD_MUTEX_INITIALIZER; static CFMutableDictionaryRef dc_pbuffers; static pthread_mutex_t dc_pbuffers_mutex = PTHREAD_MUTEX_INITIALIZER;
+static void *opengl_handle; +static const struct opengl_funcs *funcs; static const struct opengl_driver_funcs macdrv_driver_funcs;
static void (*pglCopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); static void (*pglCopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -static void (*pglFlush)(void); static void (*pglFlushRenderAPPLE)(void); static const GLubyte *(*pglGetString)(GLenum name); static PFN_glGetIntegerv pglGetIntegerv; @@ -232,9 +233,6 @@ static pixel_format *pixel_formats; static int nb_formats, nb_displayable_formats;
-static void *opengl_handle; - - static const char* debugstr_attrib(int attrib, int value) { static const struct { @@ -2174,7 +2172,7 @@ static UINT macdrv_pbuffer_bind(HDC hdc, void *private, GLenum source) TRACE("hdc %p pbuffer %p source 0x%x\n", hdc, pbuffer, source);
if (!context->draw_view && context->draw_pbuffer == pbuffer && source != GL_NONE) - pglFlush(); + funcs->p_glFlush();
err = CGLTexImagePBuffer(context->cglcontext, pbuffer, source); if (err != kCGLNoError) @@ -2782,6 +2780,7 @@ UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, co ERR("version mismatch, opengl32 wants %u but macdrv has %u\n", version, WINE_OPENGL_DRIVER_VERSION); return STATUS_INVALID_PARAMETER; } + funcs = opengl_funcs;
dc_pbuffers = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); if (!dc_pbuffers) @@ -2810,7 +2809,6 @@ UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, co LOAD_FUNCPTR(glReadPixels); LOAD_FUNCPTR(glViewport); LOAD_FUNCPTR(glCopyColorTable); - LOAD_FUNCPTR(glFlush);
if (!init_gl_info()) goto failed;
From: Rémi Bernon rbernon@codeweavers.com
GLX_RENDERER_ID_MESA has been removed from GLX_MESA_query_renderer v9. --- dlls/opengl32/winegl.xml | 2 -- dlls/winemac.drv/opengl.c | 45 --------------------------------------- dlls/winex11.drv/opengl.c | 5 ----- include/wine/wgl.h | 1 - 4 files changed, 53 deletions(-)
diff --git a/dlls/opengl32/winegl.xml b/dlls/opengl32/winegl.xml index 7918c3ff894..37152805ace 100644 --- a/dlls/opengl32/winegl.xml +++ b/dlls/opengl32/winegl.xml @@ -354,7 +354,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA <enum value="0x818B" name="WGL_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_WINE"/> <enum value="0x818C" name="WGL_RENDERER_OPENGL_ES_PROFILE_VERSION_WINE"/> <enum value="0x818D" name="WGL_RENDERER_OPENGL_ES2_PROFILE_VERSION_WINE"/> - <enum value="0x818E" name="WGL_RENDERER_ID_WINE"/> </enums>
<extensions> @@ -422,7 +421,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA <require> <enum name="WGL_RENDERER_ACCELERATED_WINE"/> <enum name="WGL_RENDERER_DEVICE_ID_WINE"/> - <enum name="WGL_RENDERER_ID_WINE"/> <enum name="WGL_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_WINE"/> <enum name="WGL_RENDERER_OPENGL_CORE_PROFILE_VERSION_WINE"/> <enum name="WGL_RENDERER_OPENGL_ES2_PROFILE_VERSION_WINE"/> diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index c55ecc0976a..bf41fd3fe99 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -272,7 +272,6 @@ static const char* debugstr_attrib(int attrib, int value) ATTRIB(WGL_PIXEL_TYPE_ARB), ATTRIB(WGL_RED_BITS_ARB), ATTRIB(WGL_RED_SHIFT_ARB), - ATTRIB(WGL_RENDERER_ID_WINE), ATTRIB(WGL_SAMPLE_BUFFERS_ARB), ATTRIB(WGL_SAMPLES_ARB), ATTRIB(WGL_SHARE_ACCUM_ARB), @@ -2240,50 +2239,6 @@ static BOOL macdrv_context_create(HDC hdc, int format, void *shared, const int * profile = value; break;
- case WGL_RENDERER_ID_WINE: - { - CGLError err; - CGLRendererInfoObj renderer_info; - GLint renderer_count, temp; - - err = CGLQueryRendererInfo(active_displays_mask(), &renderer_info, &renderer_count); - if (err != kCGLNoError) - { - WARN("CGLQueryRendererInfo failed: %d %s\n", err, CGLErrorString(err)); - RtlSetLastWin32Error(ERROR_GEN_FAILURE); - return FALSE; - } - - value = map_renderer_index(renderer_info, renderer_count, value); - - if (value >= renderer_count) - { - WARN("WGL_RENDERER_ID_WINE renderer %d exceeds count (%d)\n", value, renderer_count); - CGLDestroyRendererInfo(renderer_info); - RtlSetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (!get_renderer_property(renderer_info, value, kCGLRPRendererID, &temp)) - { - WARN("WGL_RENDERER_ID_WINE failed to get ID of renderer %d\n", value); - CGLDestroyRendererInfo(renderer_info); - RtlSetLastWin32Error(ERROR_GEN_FAILURE); - return FALSE; - } - - CGLDestroyRendererInfo(renderer_info); - - if (renderer_id && temp != renderer_id) - { - WARN("WGL_RENDERER_ID_WINE requested two different renderers (0x%08x vs. 0x%08x)\n", renderer_id, temp); - RtlSetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - renderer_id = temp; - break; - } - default: WARN("Unknown attribute %s.\n", debugstr_attrib(attr, value)); RtlSetLastWin32Error(ERROR_INVALID_PARAMETER); diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 07e90ef2caa..b3c032db8f0 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1680,11 +1680,6 @@ static BOOL x11drv_context_create( HDC hdc, int format, void *share_private, con pContextAttribList[1] = attribList[1]; pContextAttribList += 2; break; - case WGL_RENDERER_ID_WINE: - pContextAttribList[0] = GLX_RENDERER_ID_MESA; - pContextAttribList[1] = attribList[1]; - pContextAttribList += 2; - break; default: ERR("Unhandled attribList pair: %#x %#x\n", attribList[0], attribList[1]); } diff --git a/include/wine/wgl.h b/include/wine/wgl.h index 6ba341d11a4..fa901988663 100644 --- a/include/wine/wgl.h +++ b/include/wine/wgl.h @@ -5431,7 +5431,6 @@ typedef unsigned int GLhandleARB; #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_RENDERER_ACCELERATED_WINE 0x8186 #define WGL_RENDERER_DEVICE_ID_WINE 0x8184 -#define WGL_RENDERER_ID_WINE 0x818E #define WGL_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_WINE 0x818B #define WGL_RENDERER_OPENGL_CORE_PROFILE_VERSION_WINE 0x818A #define WGL_RENDERER_OPENGL_ES2_PROFILE_VERSION_WINE 0x818D
From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 2 +- dlls/win32u/opengl.c | 19 ++++++++++++++++ dlls/wineandroid.drv/opengl.c | 10 ++------- dlls/winemac.drv/opengl.c | 26 ++++++++-------------- dlls/winex11.drv/opengl.c | 42 +++++++++++++++-------------------- include/wine/opengl_driver.h | 1 + 6 files changed, 50 insertions(+), 50 deletions(-)
diff --git a/configure.ac b/configure.ac index 056d18b378b..3898fbba8fe 100644 --- a/configure.ac +++ b/configure.ac @@ -988,7 +988,7 @@ case $host_os in WINE_TRY_CFLAGS([-fPIC -Wl,--export-dynamic],[WINELOADER_LDFLAGS="-Wl,--export-dynamic"]) WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000"
- WINE_CHECK_SONAME(GLESv2,glFlush) + WINE_CHECK_SONAME(GLESv2,glFlush,[AC_DEFINE_UNQUOTED(SONAME_LIBGL,["$ac_cv_lib_soname_GLESv2"])])
if test "x$exec_prefix" = xNONE then diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 561d09f96f2..ecd95c8c553 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -1623,6 +1623,24 @@ static int win32u_wglGetSwapIntervalEXT(void) return interval; }
+static BOOL opengl_init( struct opengl_funcs *funcs ) +{ +#if defined(__APPLE__) + funcs->opengl_handle = dlopen( "/System/Library/Frameworks/OpenGL.framework/OpenGL", + RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD ); + if (!funcs->opengl_handle) WARN( "Failed to load OpenGL: %s\n", dlerror() ); +#endif +#if defined(SONAME_LIBGL) + if (!funcs->opengl_handle) + { + funcs->opengl_handle = dlopen( SONAME_LIBGL, RTLD_NOW | RTLD_GLOBAL ); + if (!funcs->opengl_handle) WARN( "Failed to load %s: %s\n", SONAME_LIBGL, dlerror() ); + } +#endif + + return !!funcs->opengl_handle; +} + static void init_opengl_funcs( struct opengl_funcs *funcs, const struct opengl_driver_funcs *driver_funcs ) { #define USE_GL_FUNC(func) \ @@ -1662,6 +1680,7 @@ static void display_funcs_init(void) { UINT status;
+ if (opengl_init( &display_funcs )) TRACE( "Initialized OpenGL library\n" ); if (egl_init( &display_driver_funcs )) TRACE( "Initialized EGL library\n" );
if ((status = user_driver->pOpenGLInit( WINE_OPENGL_DRIVER_VERSION, &display_funcs, &display_driver_funcs ))) diff --git a/dlls/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index 60cdd419f62..d861c158208 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -77,7 +77,6 @@ struct gl_drawable int swap_interval; };
-static void *opengl_handle; static struct list gl_contexts = LIST_INIT( gl_contexts ); static struct list gl_drawables = LIST_INIT( gl_drawables );
@@ -322,7 +321,7 @@ static EGLenum android_init_egl_platform( const struct egl_platform *platform, E static void *android_get_proc_address( const char *name ) { void *ptr; - if ((ptr = dlsym( opengl_handle, name ))) return ptr; + if ((ptr = dlsym( funcs->opengl_handle, name ))) return ptr; return funcs->p_eglGetProcAddress( name ); }
@@ -399,12 +398,7 @@ UINT ANDROID_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, ERR( "version mismatch, opengl32 wants %u but driver has %u\n", version, WINE_OPENGL_DRIVER_VERSION ); return STATUS_INVALID_PARAMETER; } - if (!opengl_funcs->egl_handle) return STATUS_NOT_SUPPORTED; - if (!(opengl_handle = dlopen( SONAME_LIBGLESV2, RTLD_NOW|RTLD_GLOBAL ))) - { - ERR( "failed to load %s: %s\n", SONAME_LIBGLESV2, dlerror() ); - return STATUS_NOT_SUPPORTED; - } + if (!opengl_funcs->egl_handle || !opengl_funcs->opengl_handle) return STATUS_NOT_SUPPORTED; funcs = opengl_funcs;
android_driver_funcs.p_init_pixel_formats = (*driver_funcs)->p_init_pixel_formats; diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index bf41fd3fe99..1909cee8c27 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -86,7 +86,6 @@ static pthread_mutex_t context_mutex = PTHREAD_MUTEX_INITIALIZER; static CFMutableDictionaryRef dc_pbuffers; static pthread_mutex_t dc_pbuffers_mutex = PTHREAD_MUTEX_INITIALIZER;
-static void *opengl_handle; static const struct opengl_funcs *funcs; static const struct opengl_driver_funcs macdrv_driver_funcs;
@@ -2744,20 +2743,19 @@ UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, co return STATUS_NOT_SUPPORTED; }
- opengl_handle = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY|RTLD_LOCAL|RTLD_NOLOAD); - if (!opengl_handle) + if (!funcs->opengl_handle) { ERR("Failed to load OpenGL: %s\n", dlerror()); ERR("OpenGL support is disabled.\n"); return STATUS_NOT_SUPPORTED; }
-#define LOAD_FUNCPTR(func) \ - if (!(p##func = dlsym(opengl_handle, #func))) \ - { \ - ERR( "%s not found in libGL, disabling OpenGL.\n", #func ); \ - goto failed; \ - } +#define LOAD_FUNCPTR(func) \ + if (!(p##func = dlsym(funcs->opengl_handle, #func))) \ + { \ + ERR("%s not found in libGL, disabling OpenGL.\n", #func); \ + return STATUS_NOT_SUPPORTED; \ + } LOAD_FUNCPTR(glCopyPixels); LOAD_FUNCPTR(glGetIntegerv); LOAD_FUNCPTR(glGetString); @@ -2765,8 +2763,7 @@ UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, co LOAD_FUNCPTR(glViewport); LOAD_FUNCPTR(glCopyColorTable);
- if (!init_gl_info()) - goto failed; + if (!init_gl_info()) return STATUS_NOT_SUPPORTED;
if (gluCheckExtension((GLubyte*)"GL_APPLE_flush_render", (GLubyte*)gl_info.glExtensions)) LOAD_FUNCPTR(glFlushRenderAPPLE); @@ -2774,11 +2771,6 @@ UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, co
*driver_funcs = &macdrv_driver_funcs; return STATUS_SUCCESS; - -failed: - dlclose(opengl_handle); - opengl_handle = NULL; - return STATUS_NOT_SUPPORTED; }
@@ -2920,7 +2912,7 @@ static void *macdrv_get_proc_address(const char *name)
/* redirect some OpenGL extension functions */ if (!strcmp(name, "glCopyColorTable")) return macdrv_glCopyColorTable; - return dlsym(opengl_handle, name); + return dlsym(funcs->opengl_handle, name); }
static BOOL macdrv_swap_buffers(void *private, HWND hwnd, HDC hdc, int interval) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index b3c032db8f0..369b34824c4 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -348,7 +348,6 @@ static INT64 (*pglXSwapBuffersMscOML)( Display *dpy, GLXDrawable drawable, /* Standard OpenGL */ static const GLubyte *(*pglGetString)(GLenum name);
-static void *opengl_handle; static const struct opengl_funcs *funcs; static const struct opengl_driver_funcs x11drv_driver_funcs;
@@ -508,8 +507,7 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c
/* No need to load any other libraries as according to the ABI, libGL should be self-sufficient and include all dependencies */ - opengl_handle = dlopen( SONAME_LIBGL, RTLD_NOW | RTLD_GLOBAL ); - if (opengl_handle == NULL) + if (!funcs->opengl_handle) { ERR( "Failed to load libGL: %s\n", dlerror() ); ERR( "OpenGL support is disabled.\n"); @@ -517,26 +515,27 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c }
/* redirect some standard OpenGL functions */ -#define LOAD_FUNCPTR(func) \ - if (!(p##func = dlsym( opengl_handle, #func ))) \ - { \ - ERR( "%s not found in libGL, disabling OpenGL.\n", #func ); \ - goto failed; \ - } +#define LOAD_FUNCPTR( func ) \ + if (!(p##func = dlsym( funcs->opengl_handle, #func ))) \ + { \ + ERR( "%s not found in libGL, disabling OpenGL.\n", #func ); \ + return STATUS_NOT_SUPPORTED; \ + } LOAD_FUNCPTR( glGetString ); #undef LOAD_FUNCPTR
- pglXGetProcAddressARB = dlsym(opengl_handle, "glXGetProcAddressARB"); + pglXGetProcAddressARB = dlsym( funcs->opengl_handle, "glXGetProcAddressARB" ); if (pglXGetProcAddressARB == NULL) { ERR("Could not find glXGetProcAddressARB in libGL, disabling OpenGL.\n"); - goto failed; + return STATUS_NOT_SUPPORTED; }
-#define LOAD_FUNCPTR(f) do if((p##f = (void*)pglXGetProcAddressARB((const unsigned char*)#f)) == NULL) \ - { \ - ERR( "%s not found in libGL, disabling OpenGL.\n", #f ); \ - goto failed; \ - } while(0) +#define LOAD_FUNCPTR( f ) \ + if (!(p##f = (void *)pglXGetProcAddressARB( (const GLubyte *)#f ))) \ + { \ + ERR( "%s not found in libGL, disabling OpenGL.\n", #f ); \ + return STATUS_NOT_SUPPORTED; \ + }
/* GLX 1.0 */ LOAD_FUNCPTR(glXChooseVisual); @@ -584,14 +583,14 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c LOAD_FUNCPTR(glXFreeMemoryNV); #undef LOAD_FUNCPTR
- if(!X11DRV_WineGL_InitOpenglInfo()) goto failed; + if (!X11DRV_WineGL_InitOpenglInfo()) return STATUS_NOT_SUPPORTED;
if (XQueryExtension( gdi_display, "GLX", &glx_opcode, &event_base, &error_base )) { TRACE("GLX is up and running error_base = %d\n", error_base); } else { ERR( "GLX extension is missing, disabling OpenGL.\n" ); - goto failed; + return STATUS_NOT_SUPPORTED; } gl_hwnd_context = XUniqueContext(); gl_pbuffer_context = XUniqueContext(); @@ -674,11 +673,6 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c
*driver_funcs = &x11drv_driver_funcs; return STATUS_SUCCESS; - -failed: - dlclose(opengl_handle); - opengl_handle = NULL; - return STATUS_NOT_SUPPORTED; }
static const char *debugstr_fbconfig( GLXFBConfig fbconfig ) @@ -1508,7 +1502,7 @@ static BOOL x11drv_context_destroy(void *private) static void *x11drv_get_proc_address( const char *name ) { void *ptr; - if ((ptr = dlsym( opengl_handle, name ))) return ptr; + if ((ptr = dlsym( funcs->opengl_handle, name ))) return ptr; return pglXGetProcAddressARB( (const GLubyte *)name ); }
diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index ed441fdb932..29e1085c30c 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -112,6 +112,7 @@ struct opengl_funcs #undef USE_GL_FUNC
void *egl_handle; + void *opengl_handle; };
struct egl_platform
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/make_opengl | 103 ++++++++++-- dlls/opengl32/winegl.xml | 26 +++ dlls/winex11.drv/opengl.c | 133 +-------------- include/wine/wgl.h | 336 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 454 insertions(+), 144 deletions(-)
diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index bc8eb05aaa5..f50a0f6c1ee 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -11,6 +11,7 @@ use File::Basename; # # https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/gl.xml # https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/wgl.xml +# https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/glx.xml # https://raw.github.com/KhronosGroup/EGL-Registry/refs/heads/main/api/egl.xml # # If they are not found in the current directory the script will @@ -689,6 +690,7 @@ my $cache = ($ENV{XDG_CACHE_HOME} || "$ENV{HOME}/.cache") . "/wine"; system "mkdir", "-p", $cache; -f "$cache/gl-$ogl_commit.xml" || system "wget", "-q", "-O", "$cache/gl-$ogl_commit.xml", "$ogl_url/$ogl_commit/xml/gl.xml" || die "cannot download gl.xml"; -f "$cache/wgl-$ogl_commit.xml" || system "wget", "-q", "-O", "$cache/wgl-$ogl_commit.xml", "$ogl_url/$ogl_commit/xml/wgl.xml" || die "cannot download wgl.xml"; +-f "$cache/glx-$ogl_commit.xml" || system "wget", "-q", "-O", "$cache/glx-$ogl_commit.xml", "$ogl_url/$ogl_commit/xml/glx.xml" || die "cannot download glx.xml"; -f "$cache/egl-$egl_commit.xml" || system "wget", "-q", "-O", "$cache/egl-$egl_commit.xml", "$egl_url/$egl_commit/api/egl.xml" || die "cannot download egl.xml"; chdir(dirname($0));
@@ -710,6 +712,7 @@ my %norm_functions; my %ext_functions; my %wgl_functions; my %egl_functions; +my %glx_functions; my %all_enums;
my %gl_types = @@ -762,6 +765,26 @@ my %supported_wgl_extensions = "WGL_WINE_pixel_format_passthrough" => 1, "WGL_WINE_query_renderer" => 1, ); +my %supported_glx_extensions = + ( + "GLX_ARB_create_context" => 1, + "GLX_ARB_create_context_no_error" => 1, + "GLX_ARB_create_context_profile" => 1, + "GLX_ARB_fbconfig_float" => 1, + "GLX_ARB_multisample" => 1, + "GLX_ATI_pixel_format_float" => 1, + "GLX_EXT_fbconfig_packed_float" => 1, + "GLX_EXT_framebuffer_sRGB" => 1, + "GLX_EXT_swap_control" => 1, + "GLX_MESA_copy_sub_buffer" => 1, + "GLX_MESA_query_renderer" => 1, + "GLX_MESA_swap_control" => 1, + "GLX_NV_float_buffer" => 1, + "GLX_NV_vertex_array_range" => 1, + "GLX_OML_swap_method" => 1, + "GLX_OML_sync_control" => 1, + "GLX_SGI_swap_control" => 1, + ); my %supported_egl_extensions = ( "EGL_EXT_pixel_format_float" => 1, @@ -861,6 +884,18 @@ sub parse_file($) $wgl_functions{$name} = $functions{$name} if defined $functions{$name}; } } + elsif ($feature->{api} eq "glx") + { + foreach my $cmd ($feature->findnodes("./require/command")) + { + my $name = $cmd->{name}; + $glx_functions{$name} = $functions{$cmd->{name}}; + } + foreach my $enum ($feature->findnodes("./require/enum")) + { + $all_enums{$enum->{name}} = $enums{$enum->{name}}; + } + } elsif ($feature->{api} eq "egl") { foreach my $cmd ($feature->findnodes("./require/command")) @@ -918,6 +953,20 @@ sub parse_file($) } next; } + if ($ext->{supported} eq "glx") + { + next unless defined $supported_glx_extensions{$ext->{name}}; + foreach my $cmd ($ext->findnodes("./require/command")) + { + my $name = $cmd->{name}; + $ext_functions{$name} = [ $functions{$name}[0], $functions{$name}[1], [ $ext->{name} ] ]; + } + foreach my $enum ($ext->findnodes("./require/enum")) + { + $all_enums{$enum->{name}} = $enums{$enum->{name}}; + } + next; + } if ($ext->{supported} eq "egl") { next unless defined $supported_egl_extensions{$ext->{name}}; @@ -959,6 +1008,7 @@ sub parse_file($)
parse_file( "$cache/gl-$ogl_commit.xml" ); parse_file( "$cache/wgl-$ogl_commit.xml" ); +parse_file( "$cache/glx-$ogl_commit.xml" ); parse_file( "$cache/egl-$egl_commit.xml" ); parse_file( "winegl.xml" );
@@ -993,6 +1043,16 @@ print HEADER "#ifndef EGL_CAST\n"; print HEADER "#define EGL_CAST(t,x) ((t)(x))\n"; print HEADER "#endif\n\n";
+print HEADER "#ifndef Bool\n"; +print HEADER "#define Bool int\n"; +print HEADER "typedef unsigned long XID;\n"; +print HEADER "typedef struct _XDisplay Display;\n"; +print HEADER "typedef struct _XVisualInfo XVisualInfo;\n"; +print HEADER "typedef XID Pixmap;\n"; +print HEADER "typedef XID Window;\n"; +print HEADER "typedef XID Font;\n"; +print HEADER "#endif\n\n"; + foreach (@gl_types) { my $type = $gl_types{$_}; @@ -1025,6 +1085,13 @@ foreach (sort keys %wgl_functions) printf HEADER "typedef %-10s (GLAPIENTRY *PFN_$_)($decl_args);\n", $func_ret; }
+foreach (sort keys %glx_functions) +{ + my $decl_args = get_func_args( $glx_functions{$_}, 1, 0, "" ); + my $func_ret = get_func_ret( $glx_functions{$_}, 0 ); + printf HEADER "typedef %-10s (GLAPIENTRY *PFN_$_)($decl_args);\n", $func_ret; +} + foreach (sort keys %egl_functions) { my $decl_args = get_func_args( $egl_functions{$_}, 1, 0, "" ); @@ -1060,6 +1127,20 @@ foreach (sort keys %ext_functions) printf HEADER " \\n USE_GL_FUNC(%s)", $_; } print HEADER "\n\n"; +print HEADER "#define ALL_GLX_FUNCS"; +foreach (sort keys %glx_functions) +{ + next unless $_ =~ /^glX/; + printf HEADER " \\n USE_GL_FUNC(%s)", $_; +} +print HEADER "\n\n"; +print HEADER "#define ALL_GLX_EXT_FUNCS"; +foreach (sort keys %ext_functions) +{ + next unless $_ =~ /^glX/; + printf HEADER " \\n USE_GL_FUNC(%s)", $_; +} +print HEADER "\n\n"; print HEADER "#define ALL_EGL_FUNCS"; foreach (sort keys %egl_functions) { @@ -1084,7 +1165,7 @@ print HEADER "\n\n"; print HEADER "#define ALL_GL_EXT_FUNCS"; foreach (sort keys %ext_functions) { - next unless $_ =~ /^gl/; + next unless $_ =~ /^gl[^X]/; printf HEADER " \\n USE_GL_FUNC(%s)", $_; } print HEADER "\n\n"; @@ -1092,6 +1173,13 @@ print HEADER "\n\n"; print HEADER "#endif /* __WINE_WGL_H */\n"; close HEADER;
+# +# Remove unix-side only APIs from the extension list, they shouldn't +# be on the PE side, and most importantly they shouldn't be counted in +# the extension table. +# +delete $ext_functions{$_} for grep { $_ =~ /^glX|^egl/ } keys(%ext_functions); + # # Now, generate the output files. First, the spec file. # @@ -1146,7 +1234,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; print OUT generate_func_params($_, $ext_functions{$_}); } @@ -1179,7 +1266,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; printf OUT " unix_%s,\n", $_; } @@ -1238,7 +1324,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; next if defined $manual_win_thunks{$_}; print OUT "\nstatic " . generate_win_thunk($_, $ext_functions{$_}); @@ -1247,7 +1332,6 @@ print OUT "\n";
foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next unless defined $manual_win_functions{$_} || $manual_win_thunks{$_}; my $decl_args = get_func_args( $ext_functions{$_}, 1, 0, "" ); my $func_ret = get_func_ret( $ext_functions{$_}, 0 ); @@ -1258,7 +1342,6 @@ print OUT "const void *extension_procs[] =\n"; print OUT "{\n"; foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API printf OUT " %s,\n", $_; } print OUT "};\n"; @@ -1307,7 +1390,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; print OUT "static " unless defined $manual_wow64_thunks{$_}; print OUT generate_unix_thunk($_, $ext_functions{$_}, "ext"); @@ -1331,7 +1413,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; printf OUT " ext_%s,\n", $_; } @@ -1358,7 +1439,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; next if defined $manual_wow64_thunks{$_}; print OUT generate_wow64_thunk($_, $ext_functions{$_}, "ext"); @@ -1378,7 +1458,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; next unless defined $manual_wow64_thunks{$_}; print OUT "extern NTSTATUS wow64_ext_$_( void *args );\n"; @@ -1402,7 +1481,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; printf OUT " wow64_ext_%s,\n", $_; } @@ -1429,7 +1507,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; print OUT generate_null_func($_, $ext_functions{$_}); } @@ -1450,7 +1527,6 @@ foreach (sort keys %norm_functions) } foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API next if defined $manual_win_functions{$_}; print OUT " .p_$_ = null_$_,\n"; } @@ -1463,7 +1539,6 @@ print OUT "const struct registry_entry extension_registry[$count] =\n"; print OUT "{\n"; foreach (sort keys %ext_functions) { - next if $_ =~ /^egl/; # unix-side only API my $func = $ext_functions{$_}; printf OUT " { "%s", "%s", offsetof(struct opengl_funcs, p_$_) },\n", $_, join(" ", sort @{$func->[2]}); } diff --git a/dlls/opengl32/winegl.xml b/dlls/opengl32/winegl.xml index 37152805ace..8950bf21338 100644 --- a/dlls/opengl32/winegl.xml +++ b/dlls/opengl32/winegl.xml @@ -328,6 +328,17 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA <param><ptype>GLint</ptype> <name>renderer</name></param> <param><ptype>GLenum</ptype> <name>attribute</name></param> </command> + <command> + <proto>void *<name>glXAllocateMemoryNV</name></proto> + <param><ptype>GLsizei</ptype> <name>size</name></param> + <param><ptype>GLfloat</ptype> <name>readfreq</name></param> + <param><ptype>GLfloat</ptype> <name>writefreq</name></param> + <param><ptype>GLfloat</ptype> <name>priority</name></param> + </command> + <command> + <proto>void <name>glXFreeMemoryNV</name></proto> + <param>void *<name>pointer</name></param> + </command> </commands>
<feature api="gl" name="GL_VERSION_1_0" number="1.0"> @@ -356,6 +367,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA <enum value="0x818D" name="WGL_RENDERER_OPENGL_ES2_PROFILE_VERSION_WINE"/> </enums>
+ <enums namespace="GLX" group="ATI_pixel_format_float"> + <enum value="0x100" name="GLX_RGBA_FLOAT_ATI_BIT"/> + </enums> + <extensions> <extension name="GL_KTX_buffer_region" supported="gl"> <require> @@ -436,5 +451,16 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA <command name="wglQueryRendererStringWINE"/> </require> </extension> + <extension name="GLX_ATI_pixel_format_float" supported="glx"> + <require> + <enum name="GLX_RGBA_FLOAT_ATI_BIT"/> + </require> + </extension> + <extension name="GLX_NV_vertex_array_range" supported="glx"> + <require> + <command name="glXAllocateMemoryNV"/> + <command name="glXFreeMemoryNV"/> + </require> + </extension> </extensions> </registry> diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 369b34824c4..dce066f608d 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -52,133 +52,6 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
#include "wine/opengl_driver.h"
-typedef struct __GLXcontextRec *GLXContext; -typedef struct __GLXFBConfigRec *GLXFBConfig; -typedef XID GLXPixmap; -typedef XID GLXDrawable; -typedef XID GLXFBConfigID; -typedef XID GLXContextID; -typedef XID GLXWindow; -typedef XID GLXPbuffer; - -#define GLX_USE_GL 1 -#define GLX_BUFFER_SIZE 2 -#define GLX_LEVEL 3 -#define GLX_RGBA 4 -#define GLX_DOUBLEBUFFER 5 -#define GLX_STEREO 6 -#define GLX_AUX_BUFFERS 7 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 -#define GLX_STENCIL_SIZE 13 -#define GLX_ACCUM_RED_SIZE 14 -#define GLX_ACCUM_GREEN_SIZE 15 -#define GLX_ACCUM_BLUE_SIZE 16 -#define GLX_ACCUM_ALPHA_SIZE 17 - -#define GLX_BAD_SCREEN 1 -#define GLX_BAD_ATTRIBUTE 2 -#define GLX_NO_EXTENSION 3 -#define GLX_BAD_VISUAL 4 -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - -#define GLX_VENDOR 1 -#define GLX_VERSION 2 -#define GLX_EXTENSIONS 3 - -#define GLX_CONFIG_CAVEAT 0x20 -#define GLX_DONT_CARE 0xFFFFFFFF -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 -#define GLX_VISUAL_ID 0x800B -#define GLX_SCREEN 0x800C -#define GLX_NON_CONFORMANT_CONFIG 0x800D -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_PBUFFER_HEIGHT 0x8040 -#define GLX_PBUFFER_WIDTH 0x8041 -#define GLX_SWAP_METHOD_OML 0x8060 -#define GLX_SWAP_EXCHANGE_OML 0x8061 -#define GLX_SWAP_COPY_OML 0x8062 -#define GLX_SWAP_UNDEFINED_OML 0x8063 -#define GLX_RGBA_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 - -/** GLX_ARB_multisample */ -#define GLX_SAMPLE_BUFFERS_ARB 100000 -#define GLX_SAMPLES_ARB 100001 -/** GLX_ARB_framebuffer_sRGB */ -#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 -/** GLX_EXT_fbconfig_packed_float */ -#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 -#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 -/** GLX_ARB_create_context */ -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 -/** GLX_ARB_create_context_no_error */ -#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 -/** GLX_ARB_create_context_profile */ -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 -/** GLX_ATI_pixel_format_float */ -#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 -/** GLX_ARB_pixel_format_float */ -#define GLX_RGBA_FLOAT_BIT 0x00000004 -#define GLX_RGBA_FLOAT_TYPE 0x20B9 -/** GLX_MESA_query_renderer */ -#define GLX_RENDERER_ID_MESA 0x818E -/** GLX_NV_float_buffer */ -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - - static const char *glExtensions; static const char *glxExtensions; static char wglExtensions[4096]; @@ -698,8 +571,8 @@ static int get_render_type_from_fbconfig(Display *display, GLXFBConfig fbconfig) case GLX_COLOR_INDEX_BIT: render_type = GLX_COLOR_INDEX_TYPE; break; - case GLX_RGBA_FLOAT_BIT: - render_type = GLX_RGBA_FLOAT_TYPE; + case GLX_RGBA_FLOAT_BIT_ARB: + render_type = GLX_RGBA_FLOAT_TYPE_ARB; break; case GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT: render_type = GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT; @@ -1419,7 +1292,7 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for
if (render_type & GLX_RGBA_BIT) pf->pixel_type = WGL_TYPE_RGBA_ARB; else if (render_type & GLX_COLOR_INDEX_BIT) pf->pixel_type = WGL_TYPE_COLORINDEX_ARB; - else if (render_type & GLX_RGBA_FLOAT_BIT) pf->pixel_type = WGL_TYPE_RGBA_FLOAT_ATI; + else if (render_type & GLX_RGBA_FLOAT_BIT_ARB) pf->pixel_type = WGL_TYPE_RGBA_FLOAT_ATI; else if (render_type & GLX_RGBA_FLOAT_ATI_BIT) pf->pixel_type = WGL_TYPE_RGBA_FLOAT_ATI; else if (render_type & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) pf->pixel_type = WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT; else { ERR( "unexpected RenderType(%x)\n", render_type ); pf->pixel_type = -1; } diff --git a/include/wine/wgl.h b/include/wine/wgl.h index fa901988663..4afb40eba0b 100644 --- a/include/wine/wgl.h +++ b/include/wine/wgl.h @@ -24,6 +24,16 @@ #define EGL_CAST(t,x) ((t)(x)) #endif
+#ifndef Bool +#define Bool int +typedef unsigned long XID; +typedef struct _XDisplay Display; +typedef struct _XVisualInfo XVisualInfo; +typedef XID Pixmap; +typedef XID Window; +typedef XID Font; +#endif + typedef void *EGLNativeDisplayType; typedef void *EGLNativePixmapType; typedef void *EGLNativeWindowType; @@ -85,6 +95,92 @@ DECLARE_HANDLE(HGPUNV); DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef struct _GPU_DEVICE GPU_DEVICE; typedef struct _GPU_DEVICE *PGPU_DEVICE; +typedef XID GLXFBConfigID; +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef XID GLXContextID; +typedef struct __GLXcontextRec *GLXContext; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +typedef XID GLXWindow; +typedef XID GLXPbuffer; +typedef void ( *__GLXextFuncPtr)(void); +typedef XID GLXVideoCaptureDeviceNV; +typedef unsigned int GLXVideoDeviceNV; +typedef XID GLXVideoSourceSGIX; +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; +typedef XID GLXPbufferSGIX; +typedef struct { + int event_type; /* GLX_DAMAGED or GLX_SAVED */ + int draw_type; /* GLX_WINDOW or GLX_PBUFFER */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* XID of Drawable */ + unsigned int buffer_mask; /* mask indicating which buffers are affected */ + unsigned int aux_buffer; /* which aux buffer was affected */ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXPbufferClobberEvent; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + GLXDrawable drawable; /* drawable on which event was requested in event mask */ + int event_type; + int64_t ust; + int64_t msc; + int64_t sbc; +} GLXBufferSwapComplete; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + GLXBufferSwapComplete glxbufferswapcomplete; + long pad[24]; +} GLXEvent; +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + int extension; + int evtype; + GLXDrawable window; + Bool stereo_tree; +} GLXStereoNotifyEventEXT; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* i.d. of Drawable */ + int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ + int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ + unsigned int mask; /* mask indicating which buffers are affected*/ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXBufferClobberEventSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int srcXOrigin, srcYOrigin, srcWidth, srcHeight; + int destXOrigin, destYOrigin, destWidth, destHeight; +} GLXPipeRect; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int XOrigin, YOrigin, maxHeight, maxWidth; +} GLXPipeRectLimits; struct AHardwareBuffer; struct wl_buffer; struct wl_display; @@ -323,6 +419,129 @@ typedef unsigned int GLhandleARB; #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INVALID_PROFILE_ARB 0x2096 #define ERROR_INVALID_VERSION_ARB 0x2095 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ALPHA_SIZE 11 +#define GLX_AUX_BUFFERS 7 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_ENUM 7 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_VISUAL 4 +#define GLX_BLUE_SIZE 10 +#define GLX_BUFFER_SIZE 2 +#define GLX_BufferSwapComplete 1 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 +#define GLX_DAMAGED 0x8020 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_DEPTH_SIZE 12 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_DOUBLEBUFFER 5 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_EVENT_MASK 0x801F +#define GLX_EXTENSIONS 0x3 +#define GLX_EXTENSION_NAME "GLX" +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_GREEN_SIZE 9 +#define GLX_HEIGHT 0x801E +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_LEVEL 3 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 +#define GLX_NONE 0x8000 +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_NO_EXTENSION 3 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_PbufferClobber 0 +#define GLX_RED_SIZE 8 +#define GLX_RENDERER_ACCELERATED_MESA 0x8186 +#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 +#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B +#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A +#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D +#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C +#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 +#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 +#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 +#define GLX_RENDERER_VERSION_MESA 0x8185 +#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_RGBA 4 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_RGBA_FLOAT_ATI_BIT 0x100 +#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 +#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 +#define GLX_SAMPLES 100001 +#define GLX_SAMPLES_ARB 100001 +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAVED 0x8021 +#define GLX_SCREEN 0x800C +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_STENCIL_SIZE 13 +#define GLX_STEREO 6 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_INTERVAL_EXT 0x20F1 +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_UNDEFINED_OML 0x8063 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_USE_GL 1 +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_VISUAL_ID 0x800B +#define GLX_WIDTH 0x801D +#define GLX_WINDOW 0x8022 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_X_VISUAL_TYPE 0x22 #define GL_1PASS_EXT 0x80A1 #define GL_1PASS_SGIS 0x80A1 #define GL_2D 0x0600 @@ -5484,6 +5703,7 @@ typedef unsigned int GLhandleARB; #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 +#define __GLX_NUMBER_EVENTS 17
#ifndef GL_NO_PROTOTYPES void GLAPIENTRY glAccum( GLenum op, GLfloat value ); @@ -5849,6 +6069,45 @@ typedef BOOL (GLAPIENTRY *PFN_wglUseFontBitmapsA)( HDC hDC, DWORD first, D typedef BOOL (GLAPIENTRY *PFN_wglUseFontBitmapsW)( HDC hDC, DWORD first, DWORD count, DWORD listBase ); typedef BOOL (GLAPIENTRY *PFN_wglUseFontOutlinesA)( HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf ); typedef BOOL (GLAPIENTRY *PFN_wglUseFontOutlinesW)( HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf ); +typedef GLXFBConfig * (GLAPIENTRY *PFN_glXChooseFBConfig)( Display *dpy, int screen, const int *attrib_list, int *nelements ); +typedef XVisualInfo * (GLAPIENTRY *PFN_glXChooseVisual)( Display *dpy, int screen, int *attribList ); +typedef void (GLAPIENTRY *PFN_glXCopyContext)( Display *dpy, GLXContext src, GLXContext dst, unsigned long mask ); +typedef GLXContext (GLAPIENTRY *PFN_glXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); +typedef GLXPixmap (GLAPIENTRY *PFN_glXCreateGLXPixmap)( Display *dpy, XVisualInfo *visual, Pixmap pixmap ); +typedef GLXContext (GLAPIENTRY *PFN_glXCreateNewContext)( Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct ); +typedef GLXPbuffer (GLAPIENTRY *PFN_glXCreatePbuffer)( Display *dpy, GLXFBConfig config, const int *attrib_list ); +typedef GLXPixmap (GLAPIENTRY *PFN_glXCreatePixmap)( Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list ); +typedef GLXWindow (GLAPIENTRY *PFN_glXCreateWindow)( Display *dpy, GLXFBConfig config, Window win, const int *attrib_list ); +typedef void (GLAPIENTRY *PFN_glXDestroyContext)( Display *dpy, GLXContext ctx ); +typedef void (GLAPIENTRY *PFN_glXDestroyGLXPixmap)( Display *dpy, GLXPixmap pixmap ); +typedef void (GLAPIENTRY *PFN_glXDestroyPbuffer)( Display *dpy, GLXPbuffer pbuf ); +typedef void (GLAPIENTRY *PFN_glXDestroyPixmap)( Display *dpy, GLXPixmap pixmap ); +typedef void (GLAPIENTRY *PFN_glXDestroyWindow)( Display *dpy, GLXWindow win ); +typedef const char * (GLAPIENTRY *PFN_glXGetClientString)( Display *dpy, int name ); +typedef int (GLAPIENTRY *PFN_glXGetConfig)( Display *dpy, XVisualInfo *visual, int attrib, int *value ); +typedef GLXContext (GLAPIENTRY *PFN_glXGetCurrentContext)(void); +typedef Display * (GLAPIENTRY *PFN_glXGetCurrentDisplay)(void); +typedef GLXDrawable (GLAPIENTRY *PFN_glXGetCurrentDrawable)(void); +typedef GLXDrawable (GLAPIENTRY *PFN_glXGetCurrentReadDrawable)(void); +typedef int (GLAPIENTRY *PFN_glXGetFBConfigAttrib)( Display *dpy, GLXFBConfig config, int attribute, int *value ); +typedef GLXFBConfig * (GLAPIENTRY *PFN_glXGetFBConfigs)( Display *dpy, int screen, int *nelements ); +typedef __GLXextFuncPtr (GLAPIENTRY *PFN_glXGetProcAddress)( const GLubyte *procName ); +typedef void (GLAPIENTRY *PFN_glXGetSelectedEvent)( Display *dpy, GLXDrawable draw, unsigned long *event_mask ); +typedef XVisualInfo * (GLAPIENTRY *PFN_glXGetVisualFromFBConfig)( Display *dpy, GLXFBConfig config ); +typedef Bool (GLAPIENTRY *PFN_glXIsDirect)( Display *dpy, GLXContext ctx ); +typedef Bool (GLAPIENTRY *PFN_glXMakeContextCurrent)( Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx ); +typedef Bool (GLAPIENTRY *PFN_glXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx ); +typedef int (GLAPIENTRY *PFN_glXQueryContext)( Display *dpy, GLXContext ctx, int attribute, int *value ); +typedef void (GLAPIENTRY *PFN_glXQueryDrawable)( Display *dpy, GLXDrawable draw, int attribute, unsigned int *value ); +typedef Bool (GLAPIENTRY *PFN_glXQueryExtension)( Display *dpy, int *errorb, int *event ); +typedef const char * (GLAPIENTRY *PFN_glXQueryExtensionsString)( Display *dpy, int screen ); +typedef const char * (GLAPIENTRY *PFN_glXQueryServerString)( Display *dpy, int screen, int name ); +typedef Bool (GLAPIENTRY *PFN_glXQueryVersion)( Display *dpy, int *maj, int *min ); +typedef void (GLAPIENTRY *PFN_glXSelectEvent)( Display *dpy, GLXDrawable draw, unsigned long event_mask ); +typedef void (GLAPIENTRY *PFN_glXSwapBuffers)( Display *dpy, GLXDrawable drawable ); +typedef void (GLAPIENTRY *PFN_glXUseXFont)( Font font, int first, int count, int list ); +typedef void (GLAPIENTRY *PFN_glXWaitGL)(void); +typedef void (GLAPIENTRY *PFN_glXWaitX)(void); typedef EGLBoolean (GLAPIENTRY *PFN_eglBindAPI)( EGLenum api ); typedef EGLBoolean (GLAPIENTRY *PFN_eglBindTexImage)( EGLDisplay dpy, EGLSurface surface, EGLint buffer ); typedef EGLBoolean (GLAPIENTRY *PFN_eglChooseConfig)( EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config ); @@ -8899,6 +9158,23 @@ typedef void (GLAPIENTRY *PFN_glWindowPos4sMESA)( GLshort x, GLshort y, GL typedef void (GLAPIENTRY *PFN_glWindowPos4svMESA)( const GLshort *v ); typedef void (GLAPIENTRY *PFN_glWindowRectanglesEXT)( GLenum mode, GLsizei count, const GLint *box ); typedef void (GLAPIENTRY *PFN_glWriteMaskEXT)( GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW ); +typedef void * (GLAPIENTRY *PFN_glXAllocateMemoryNV)( GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority ); +typedef void (GLAPIENTRY *PFN_glXCopySubBufferMESA)( Display *dpy, GLXDrawable drawable, int x, int y, int width, int height ); +typedef GLXContext (GLAPIENTRY *PFN_glXCreateContextAttribsARB)( Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list ); +typedef void (GLAPIENTRY *PFN_glXFreeMemoryNV)( void *pointer ); +typedef Bool (GLAPIENTRY *PFN_glXGetMscRateOML)( Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator ); +typedef int (GLAPIENTRY *PFN_glXGetSwapIntervalMESA)(void); +typedef Bool (GLAPIENTRY *PFN_glXGetSyncValuesOML)( Display *dpy, GLXDrawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc ); +typedef Bool (GLAPIENTRY *PFN_glXQueryCurrentRendererIntegerMESA)( int attribute, unsigned int *value ); +typedef const char * (GLAPIENTRY *PFN_glXQueryCurrentRendererStringMESA)( int attribute ); +typedef Bool (GLAPIENTRY *PFN_glXQueryRendererIntegerMESA)( Display *dpy, int screen, int renderer, int attribute, unsigned int *value ); +typedef const char * (GLAPIENTRY *PFN_glXQueryRendererStringMESA)( Display *dpy, int screen, int renderer, int attribute ); +typedef int64_t (GLAPIENTRY *PFN_glXSwapBuffersMscOML)( Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder ); +typedef void (GLAPIENTRY *PFN_glXSwapIntervalEXT)( Display *dpy, GLXDrawable drawable, int interval ); +typedef int (GLAPIENTRY *PFN_glXSwapIntervalMESA)( unsigned int interval ); +typedef int (GLAPIENTRY *PFN_glXSwapIntervalSGI)( int interval ); +typedef Bool (GLAPIENTRY *PFN_glXWaitForMscOML)( Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc ); +typedef Bool (GLAPIENTRY *PFN_glXWaitForSbcOML)( Display *dpy, GLXDrawable drawable, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc ); typedef void * (GLAPIENTRY *PFN_wglAllocateMemoryNV)( GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority ); typedef BOOL (GLAPIENTRY *PFN_wglBindTexImageARB)( HPBUFFERARB hPbuffer, int iBuffer ); typedef BOOL (GLAPIENTRY *PFN_wglChoosePixelFormatARB)( HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats ); @@ -8978,6 +9254,66 @@ typedef BOOL (GLAPIENTRY *PFN_wglSwapIntervalEXT)( int interval ); USE_GL_FUNC(wglSetPixelFormatWINE) \ USE_GL_FUNC(wglSwapIntervalEXT)
+#define ALL_GLX_FUNCS \ + USE_GL_FUNC(glXChooseFBConfig) \ + USE_GL_FUNC(glXChooseVisual) \ + USE_GL_FUNC(glXCopyContext) \ + USE_GL_FUNC(glXCreateContext) \ + USE_GL_FUNC(glXCreateGLXPixmap) \ + USE_GL_FUNC(glXCreateNewContext) \ + USE_GL_FUNC(glXCreatePbuffer) \ + USE_GL_FUNC(glXCreatePixmap) \ + USE_GL_FUNC(glXCreateWindow) \ + USE_GL_FUNC(glXDestroyContext) \ + USE_GL_FUNC(glXDestroyGLXPixmap) \ + USE_GL_FUNC(glXDestroyPbuffer) \ + USE_GL_FUNC(glXDestroyPixmap) \ + USE_GL_FUNC(glXDestroyWindow) \ + USE_GL_FUNC(glXGetClientString) \ + USE_GL_FUNC(glXGetConfig) \ + USE_GL_FUNC(glXGetCurrentContext) \ + USE_GL_FUNC(glXGetCurrentDisplay) \ + USE_GL_FUNC(glXGetCurrentDrawable) \ + USE_GL_FUNC(glXGetCurrentReadDrawable) \ + USE_GL_FUNC(glXGetFBConfigAttrib) \ + USE_GL_FUNC(glXGetFBConfigs) \ + USE_GL_FUNC(glXGetProcAddress) \ + USE_GL_FUNC(glXGetSelectedEvent) \ + USE_GL_FUNC(glXGetVisualFromFBConfig) \ + USE_GL_FUNC(glXIsDirect) \ + USE_GL_FUNC(glXMakeContextCurrent) \ + USE_GL_FUNC(glXMakeCurrent) \ + USE_GL_FUNC(glXQueryContext) \ + USE_GL_FUNC(glXQueryDrawable) \ + USE_GL_FUNC(glXQueryExtension) \ + USE_GL_FUNC(glXQueryExtensionsString) \ + USE_GL_FUNC(glXQueryServerString) \ + USE_GL_FUNC(glXQueryVersion) \ + USE_GL_FUNC(glXSelectEvent) \ + USE_GL_FUNC(glXSwapBuffers) \ + USE_GL_FUNC(glXUseXFont) \ + USE_GL_FUNC(glXWaitGL) \ + USE_GL_FUNC(glXWaitX) + +#define ALL_GLX_EXT_FUNCS \ + USE_GL_FUNC(glXAllocateMemoryNV) \ + USE_GL_FUNC(glXCopySubBufferMESA) \ + USE_GL_FUNC(glXCreateContextAttribsARB) \ + USE_GL_FUNC(glXFreeMemoryNV) \ + USE_GL_FUNC(glXGetMscRateOML) \ + USE_GL_FUNC(glXGetSwapIntervalMESA) \ + USE_GL_FUNC(glXGetSyncValuesOML) \ + USE_GL_FUNC(glXQueryCurrentRendererIntegerMESA) \ + USE_GL_FUNC(glXQueryCurrentRendererStringMESA) \ + USE_GL_FUNC(glXQueryRendererIntegerMESA) \ + USE_GL_FUNC(glXQueryRendererStringMESA) \ + USE_GL_FUNC(glXSwapBuffersMscOML) \ + USE_GL_FUNC(glXSwapIntervalEXT) \ + USE_GL_FUNC(glXSwapIntervalMESA) \ + USE_GL_FUNC(glXSwapIntervalSGI) \ + USE_GL_FUNC(glXWaitForMscOML) \ + USE_GL_FUNC(glXWaitForSbcOML) + #define ALL_EGL_FUNCS \ USE_GL_FUNC(eglBindAPI) \ USE_GL_FUNC(eglBindTexImage) \
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/opengl.c | 16 ++++++++++++++++ include/wine/opengl_driver.h | 1 + 2 files changed, 17 insertions(+)
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index ecd95c8c553..4192a8c406c 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -1635,10 +1635,26 @@ static BOOL opengl_init( struct opengl_funcs *funcs ) { funcs->opengl_handle = dlopen( SONAME_LIBGL, RTLD_NOW | RTLD_GLOBAL ); if (!funcs->opengl_handle) WARN( "Failed to load %s: %s\n", SONAME_LIBGL, dlerror() ); + else funcs->p_glXGetProcAddress = dlsym( funcs->opengl_handle, "glXGetProcAddress" ); } #endif + if (!funcs->p_glXGetProcAddress) return !!funcs->opengl_handle; + +#define USE_GL_FUNC( func ) \ + if (!(funcs->p_##func = (void *)funcs->p_glXGetProcAddress( (GLubyte *)#func ))) \ + { \ + ERR( "Failed to load symbol %s\n", #func ); \ + goto failed; \ + } + ALL_GLX_FUNCS +#undef USE_GL_FUNC
return !!funcs->opengl_handle; + +failed: + dlclose( funcs->opengl_handle ); + funcs->opengl_handle = NULL; + return FALSE; }
static void init_opengl_funcs( struct opengl_funcs *funcs, const struct opengl_driver_funcs *driver_funcs ) diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 29e1085c30c..5d2daf39dc1 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -106,6 +106,7 @@ struct opengl_funcs BOOL (*p_wglSetPixelFormatWINE)( HDC hdc, int format ); BOOL (*p_wglSwapIntervalEXT)( int interval ); #define USE_GL_FUNC(x) PFN_##x p_##x; + ALL_GLX_FUNCS ALL_EGL_FUNCS ALL_GL_FUNCS ALL_GL_EXT_FUNCS
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 109 +++++++------------------------------- 1 file changed, 19 insertions(+), 90 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index dce066f608d..829045c2353 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -55,7 +55,7 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag); static const char *glExtensions; static const char *glxExtensions; static char wglExtensions[4096]; -static int glxVersion[2]; +static int glx_version[2]; static int glx_opcode;
struct glx_pixel_format @@ -130,8 +130,6 @@ static pthread_mutex_t context_mutex = PTHREAD_MUTEX_INITIALIZER;
static const BOOL is_win64 = sizeof(void *) > sizeof(int);
-static BOOL glxRequireVersion(int requiredVersion); - static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { TRACE( "size %u version %u flags %u type %u color %u %u,%u,%u,%u " "accum %u depth %u stencil %u aux %u ", @@ -304,14 +302,14 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) glExtensions = (const char *) pglGetString(GL_EXTENSIONS);
/* Get the common GLX version supported by GLX client and server ( major/minor) */ - pglXQueryVersion(gdi_display, &glxVersion[0], &glxVersion[1]); + pglXQueryVersion( gdi_display, &glx_version[0], &glx_version[1] );
glxExtensions = pglXQueryExtensionsString(gdi_display, screen); glx_direct = pglXIsDirect(gdi_display, ctx);
TRACE("GL version : %s.\n", gl_version); TRACE("GL renderer : %s.\n", gl_renderer); - TRACE("GLX version : %d.%d.\n", glxVersion[0], glxVersion[1]); + TRACE( "GLX version : %d.%d.\n", glx_version[0], glx_version[1] ); TRACE("Server GLX version : %s.\n", pglXQueryServerString(gdi_display, screen, GLX_VERSION)); TRACE("Server GLX vendor: : %s.\n", pglXQueryServerString(gdi_display, screen, GLX_VENDOR)); TRACE("Client GLX version : %s.\n", pglXGetClientString(gdi_display, GLX_VERSION)); @@ -458,71 +456,20 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c
if (!X11DRV_WineGL_InitOpenglInfo()) return STATUS_NOT_SUPPORTED;
- if (XQueryExtension( gdi_display, "GLX", &glx_opcode, &event_base, &error_base )) + if (!XQueryExtension( gdi_display, "GLX", &glx_opcode, &event_base, &error_base ) || + glx_version[0] < 1 || (glx_version[0] == 1 && glx_version[1] < 3)) { - TRACE("GLX is up and running error_base = %d\n", error_base); - } else { - ERR( "GLX extension is missing, disabling OpenGL.\n" ); + ERR( "GLX 1.3 extension is missing, disabling OpenGL.\n" ); return STATUS_NOT_SUPPORTED; } gl_hwnd_context = XUniqueContext(); gl_pbuffer_context = XUniqueContext();
- /* In case of GLX you have direct and indirect rendering. Most of the time direct rendering is used - * as in general only that is hardware accelerated. In some cases like in case of remote X indirect - * rendering is used. - * - * The main problem for our OpenGL code is that we need certain GLX calls but their presence - * depends on the reported GLX client / server version and on the client / server extension list. - * Those don't have to be the same. - * - * In general the server GLX information lists the capabilities in case of indirect rendering. - * When direct rendering is used, the OpenGL client library is responsible for which GLX calls are - * available and in that case the client GLX informat can be used. - * OpenGL programs should use the 'intersection' of both sets of information which is advertised - * in the GLX version/extension list. When a program does this it works for certain for both - * direct and indirect rendering. - * - * The problem we are having in this area is that ATI's Linux drivers are broken. For some reason - * they haven't added some very important GLX extensions like GLX_SGIX_fbconfig to their client - * extension list which causes this extension not to be listed. (Wine requires this extension). - * ATI advertises a GLX client version of 1.3 which implies that this fbconfig extension among - * pbuffers is around. - * - * In order to provide users of Ati's proprietary drivers with OpenGL support, we need to detect - * the ATI drivers and from then on use GLX client information for them. - */ - - if(glxRequireVersion(3)) { - pglXChooseFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXChooseFBConfig"); - pglXGetFBConfigAttrib = pglXGetProcAddressARB((const GLubyte *) "glXGetFBConfigAttrib"); - pglXGetVisualFromFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXGetVisualFromFBConfig"); - pglXQueryDrawable = pglXGetProcAddressARB((const GLubyte *) "glXQueryDrawable"); - } else if (has_extension( glxExtensions, "GLX_SGIX_fbconfig")) { - pglXChooseFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXChooseFBConfigSGIX"); - pglXGetFBConfigAttrib = pglXGetProcAddressARB((const GLubyte *) "glXGetFBConfigAttribSGIX"); - pglXGetVisualFromFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXGetVisualFromFBConfigSGIX"); - - /* The mesa libGL client library seems to forward glXQueryDrawable to the Xserver, so only - * enable this function when the Xserver understand GLX 1.3 or newer - */ - pglXQueryDrawable = NULL; - } else if(strcmp("ATI", pglXGetClientString(gdi_display, GLX_VENDOR)) == 0) { - TRACE("Overriding ATI GLX capabilities!\n"); - pglXChooseFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXChooseFBConfig"); - pglXGetFBConfigAttrib = pglXGetProcAddressARB((const GLubyte *) "glXGetFBConfigAttrib"); - pglXGetVisualFromFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXGetVisualFromFBConfig"); - pglXQueryDrawable = pglXGetProcAddressARB((const GLubyte *) "glXQueryDrawable"); - - /* Use client GLX information in case of the ATI drivers. We override the - * capabilities over here and not somewhere else as ATI might better their - * life in the future. In case they release proper drivers this block of - * code won't be called. */ - glxExtensions = pglXGetClientString(gdi_display, GLX_EXTENSIONS); - } else { - ERR(" glx_version is %s and GLX_SGIX_fbconfig extension is unsupported. Expect problems.\n", - pglXQueryServerString(gdi_display, DefaultScreen(gdi_display), GLX_VERSION)); - } + pglXChooseFBConfig = pglXGetProcAddressARB( (const GLubyte *)"glXChooseFBConfig" ); + pglXGetFBConfigAttrib = pglXGetProcAddressARB( (const GLubyte *)"glXGetFBConfigAttrib" ); + pglXGetVisualFromFBConfig = pglXGetProcAddressARB( (const GLubyte + *)"glXGetVisualFromFBConfig" ); + pglXQueryDrawable = pglXGetProcAddressARB( (const GLubyte *)"glXQueryDrawable" );
if (has_extension( glxExtensions, "GLX_MESA_copy_sub_buffer")) { pglXCopySubBufferMESA = pglXGetProcAddressARB((const GLubyte *) "glXCopySubBufferMESA"); @@ -820,11 +767,8 @@ static inline void sync_context(struct x11drv_context *context) } if (refresh) { - if (glxRequireVersion(3)) - pglXMakeContextCurrent(gdi_display, context->drawables[0]->drawable, - context->drawables[1]->drawable, context->ctx); - else - pglXMakeCurrent(gdi_display, context->drawables[0]->drawable, context->ctx); + pglXMakeContextCurrent( gdi_display, context->drawables[0]->drawable, + context->drawables[1]->drawable, context->ctx ); release_gl_drawable( old[0] ); release_gl_drawable( old[1] ); } @@ -1676,17 +1620,6 @@ static const char *X11DRV_wglQueryRendererStringWINE( HDC dc, GLint renderer, GL return pglXQueryRendererStringMESA( gdi_display, DefaultScreen(gdi_display), renderer, attribute ); }
-/** - * glxRequireVersion (internal) - * - * Check if the supported GLX version matches requiredVersion. - */ -static BOOL glxRequireVersion(int requiredVersion) -{ - /* Both requiredVersion and glXVersion[1] contains the minor GLX version */ - return (requiredVersion <= glxVersion[1]); -} - static void register_extension(const char *ext) { if (wglExtensions[0]) @@ -1710,17 +1643,13 @@ static const char *x11drv_init_wgl_extensions( struct opengl_funcs *funcs ) register_extension("WGL_ATI_pixel_format_float"); }
- /* Support WGL_ARB_render_texture when there's support or pbuffer based emulation */ - if (has_extension( glxExtensions, "GLX_ARB_render_texture" ) || glxRequireVersion( 3 )) - { - /* The WGL version of GLX_NV_float_buffer requires render_texture */ - if (has_extension( glxExtensions, "GLX_NV_float_buffer")) - register_extension("WGL_NV_float_buffer"); + /* The WGL version of GLX_NV_float_buffer requires render_texture */ + if (has_extension( glxExtensions, "GLX_NV_float_buffer" )) + register_extension( "WGL_NV_float_buffer" );
- /* Again there's no GLX equivalent for this extension, so depend on the required GL extension */ - if (has_extension(glExtensions, "GL_NV_texture_rectangle")) - register_extension("WGL_NV_render_texture_rectangle"); - } + /* Again there's no GLX equivalent for this extension, so depend on the required GL extension */ + if (has_extension( glExtensions, "GL_NV_texture_rectangle" )) + register_extension( "WGL_NV_render_texture_rectangle" );
/* EXT Extensions */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/opengl.c | 291 ++++++++++++-------------------------- 1 file changed, 92 insertions(+), 199 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 829045c2353..01b7e5e0638 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -45,8 +45,6 @@ #include "winternl.h" #include "wine/debug.h"
-#ifdef SONAME_LIBGL - WINE_DEFAULT_DEBUG_CHANNEL(wgl); WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -160,41 +158,8 @@ static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { TRACE("\n"); }
-/* GLX 1.0 */ -static XVisualInfo* (*pglXChooseVisual)( Display *dpy, int screen, int *attribList ); -static GLXContext (*pglXCreateContext)( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ); -static void (*pglXDestroyContext)( Display *dpy, GLXContext ctx ); -static Bool (*pglXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx); -static void (*pglXCopyContext)( Display *dpy, GLXContext src, GLXContext dst, unsigned long mask ); -static void (*pglXSwapBuffers)( Display *dpy, GLXDrawable drawable ); -static Bool (*pglXQueryVersion)( Display *dpy, int *maj, int *min ); -static Bool (*pglXIsDirect)( Display *dpy, GLXContext ctx ); -static GLXContext (*pglXGetCurrentContext)( void ); -static GLXDrawable (*pglXGetCurrentDrawable)( void ); - -/* GLX 1.1 */ -static const char *(*pglXQueryExtensionsString)( Display *dpy, int screen ); -static const char *(*pglXQueryServerString)( Display *dpy, int screen, int name ); -static const char *(*pglXGetClientString)( Display *dpy, int name ); - -/* GLX 1.3 */ -static GLXFBConfig *(*pglXChooseFBConfig)( Display *dpy, int screen, const int *attribList, int *nitems ); -static int (*pglXGetFBConfigAttrib)( Display *dpy, GLXFBConfig config, int attribute, int *value ); -static GLXFBConfig *(*pglXGetFBConfigs)( Display *dpy, int screen, int *nelements ); -static XVisualInfo *(*pglXGetVisualFromFBConfig)( Display *dpy, GLXFBConfig config ); -static GLXPbuffer (*pglXCreatePbuffer)( Display *dpy, GLXFBConfig config, const int *attribList ); -static void (*pglXDestroyPbuffer)( Display *dpy, GLXPbuffer pbuf ); -static void (*pglXQueryDrawable)( Display *dpy, GLXDrawable draw, int attribute, unsigned int *value ); -static GLXContext (*pglXCreateNewContext)( Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct ); -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); -static void* (*pglXGetProcAddressARB)(const GLubyte *); static void (*pglXSwapIntervalEXT)(Display *dpy, GLXDrawable drawable, int interval); static int (*pglXSwapIntervalSGI)(int);
@@ -261,13 +226,13 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) attr.colormap = None; attr.border_pixel = 0;
- vis = pglXChooseVisual(gdi_display, screen, attribList); - if (vis) { + if ((vis = funcs->p_glXChooseVisual( gdi_display, screen, attribList ))) + { #ifdef __i386__ WORD old_fs, new_fs; __asm__( "mov %%fs,%0" : "=r" (old_fs) ); /* Create a GLX Context. Without one we can't query GL information */ - ctx = pglXCreateContext(gdi_display, vis, None, GL_TRUE); + ctx = funcs->p_glXCreateContext( gdi_display, vis, None, GL_TRUE ); __asm__( "mov %%fs,%0" : "=r" (new_fs) ); __asm__( "mov %0,%%fs" :: "r" (old_fs) ); if (old_fs != new_fs) @@ -277,7 +242,7 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) goto done; } #else - ctx = pglXCreateContext(gdi_display, vis, None, GL_TRUE); + ctx = funcs->p_glXCreateContext( gdi_display, vis, None, GL_TRUE ); #endif } if (!ctx) goto done; @@ -291,7 +256,7 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) else win = root;
- if(pglXMakeCurrent(gdi_display, win, ctx) == 0) + if (funcs->p_glXMakeCurrent( gdi_display, win, ctx ) == 0) { ERR_(winediag)( "Unable to activate OpenGL context, most likely your %s OpenGL drivers haven't been " "installed correctly\n", is_win64 ? "64-bit" : "32-bit" ); @@ -302,18 +267,18 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) glExtensions = (const char *) pglGetString(GL_EXTENSIONS);
/* Get the common GLX version supported by GLX client and server ( major/minor) */ - pglXQueryVersion( gdi_display, &glx_version[0], &glx_version[1] ); + funcs->p_glXQueryVersion( gdi_display, &glx_version[0], &glx_version[1] );
- glxExtensions = pglXQueryExtensionsString(gdi_display, screen); - glx_direct = pglXIsDirect(gdi_display, ctx); + glxExtensions = funcs->p_glXQueryExtensionsString( gdi_display, screen ); + glx_direct = funcs->p_glXIsDirect( gdi_display, ctx );
TRACE("GL version : %s.\n", gl_version); TRACE("GL renderer : %s.\n", gl_renderer); TRACE( "GLX version : %d.%d.\n", glx_version[0], glx_version[1] ); - TRACE("Server GLX version : %s.\n", pglXQueryServerString(gdi_display, screen, GLX_VERSION)); - TRACE("Server GLX vendor: : %s.\n", pglXQueryServerString(gdi_display, screen, GLX_VENDOR)); - TRACE("Client GLX version : %s.\n", pglXGetClientString(gdi_display, GLX_VERSION)); - TRACE("Client GLX vendor: : %s.\n", pglXGetClientString(gdi_display, GLX_VENDOR)); + TRACE( "Server GLX version : %s.\n", funcs->p_glXQueryServerString( gdi_display, screen, GLX_VERSION ) ); + TRACE( "Server GLX vendor: : %s.\n", funcs->p_glXQueryServerString( gdi_display, screen, GLX_VENDOR ) ); + TRACE( "Client GLX version : %s.\n", funcs->p_glXGetClientString( gdi_display, GLX_VERSION ) ); + TRACE( "Client GLX vendor: : %s.\n", funcs->p_glXGetClientString( gdi_display, GLX_VENDOR ) ); TRACE("Direct rendering enabled: %s\n", glx_direct ? "True" : "False");
if(!glx_direct) @@ -352,9 +317,10 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void)
done: if(vis) XFree(vis); - if(ctx) { - pglXMakeCurrent(gdi_display, None, NULL); - pglXDestroyContext(gdi_display, ctx); + if (ctx) + { + funcs->p_glXMakeCurrent( gdi_display, None, NULL ); + funcs->p_glXDestroyContext( gdi_display, ctx ); } if (win != root) XDestroyWindow( gdi_display, win ); if (attr.colormap) XFreeColormap( gdi_display, attr.colormap ); @@ -395,52 +361,10 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c LOAD_FUNCPTR( glGetString ); #undef LOAD_FUNCPTR
- pglXGetProcAddressARB = dlsym( funcs->opengl_handle, "glXGetProcAddressARB" ); - if (pglXGetProcAddressARB == NULL) { - ERR("Could not find glXGetProcAddressARB in libGL, disabling OpenGL.\n"); - return STATUS_NOT_SUPPORTED; - } - -#define LOAD_FUNCPTR( f ) \ - if (!(p##f = (void *)pglXGetProcAddressARB( (const GLubyte *)#f ))) \ - { \ - ERR( "%s not found in libGL, disabling OpenGL.\n", #f ); \ - return STATUS_NOT_SUPPORTED; \ - } - - /* GLX 1.0 */ - LOAD_FUNCPTR(glXChooseVisual); - LOAD_FUNCPTR(glXCopyContext); - LOAD_FUNCPTR(glXCreateContext); - LOAD_FUNCPTR(glXGetCurrentContext); - LOAD_FUNCPTR(glXGetCurrentDrawable); - LOAD_FUNCPTR(glXDestroyContext); - LOAD_FUNCPTR(glXIsDirect); - LOAD_FUNCPTR(glXMakeCurrent); - LOAD_FUNCPTR(glXSwapBuffers); - LOAD_FUNCPTR(glXQueryVersion); - - /* GLX 1.1 */ - LOAD_FUNCPTR(glXGetClientString); - LOAD_FUNCPTR(glXQueryExtensionsString); - LOAD_FUNCPTR(glXQueryServerString); - - /* GLX 1.3 */ - LOAD_FUNCPTR(glXCreatePbuffer); - LOAD_FUNCPTR(glXCreateNewContext); - LOAD_FUNCPTR(glXDestroyPbuffer); - LOAD_FUNCPTR(glXMakeContextCurrent); - 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 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 = pglXGetProcAddressARB((const GLubyte *)#f) +#define LOAD_FUNCPTR( f ) p##f = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)#f ) /* ARB GLX Extension */ LOAD_FUNCPTR(glXCreateContextAttribsARB); /* EXT GLX Extension */ @@ -465,30 +389,23 @@ UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, c gl_hwnd_context = XUniqueContext(); gl_pbuffer_context = XUniqueContext();
- pglXChooseFBConfig = pglXGetProcAddressARB( (const GLubyte *)"glXChooseFBConfig" ); - pglXGetFBConfigAttrib = pglXGetProcAddressARB( (const GLubyte *)"glXGetFBConfigAttrib" ); - pglXGetVisualFromFBConfig = pglXGetProcAddressARB( (const GLubyte - *)"glXGetVisualFromFBConfig" ); - pglXQueryDrawable = pglXGetProcAddressARB( (const GLubyte *)"glXQueryDrawable" ); - - if (has_extension( glxExtensions, "GLX_MESA_copy_sub_buffer")) { - pglXCopySubBufferMESA = pglXGetProcAddressARB((const GLubyte *) "glXCopySubBufferMESA"); + 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 = pglXGetProcAddressARB( - (const GLubyte *)"glXQueryCurrentRendererIntegerMESA" ); - pglXQueryCurrentRendererStringMESA = pglXGetProcAddressARB( - (const GLubyte *)"glXQueryCurrentRendererStringMESA" ); - pglXQueryRendererIntegerMESA = pglXGetProcAddressARB( (const GLubyte *)"glXQueryRendererIntegerMESA" ); - pglXQueryRendererStringMESA = pglXGetProcAddressARB( (const GLubyte *)"glXQueryRendererStringMESA" ); + 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 = pglXGetProcAddressARB( (const GLubyte *)"glXWaitForSbcOML" ); - pglXSwapBuffersMscOML = pglXGetProcAddressARB( (const GLubyte *)"glXSwapBuffersMscOML" ); + pglXWaitForSbcOML = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXWaitForSbcOML" ); + pglXSwapBuffersMscOML = (void *)funcs->p_glXGetProcAddress( (const GLubyte *)"glXSwapBuffersMscOML" ); }
*driver_funcs = &x11drv_driver_funcs; @@ -499,17 +416,16 @@ static const char *debugstr_fbconfig( GLXFBConfig fbconfig ) { int id, visual, drawable;
- if (pglXGetFBConfigAttrib( gdi_display, fbconfig, GLX_FBCONFIG_ID, &id )) - return "*** invalid fbconfig"; - pglXGetFBConfigAttrib( gdi_display, fbconfig, GLX_VISUAL_ID, &visual ); - pglXGetFBConfigAttrib( gdi_display, fbconfig, GLX_DRAWABLE_TYPE, &drawable ); + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fbconfig, GLX_FBCONFIG_ID, &id )) return "*** invalid fbconfig"; + funcs->p_glXGetFBConfigAttrib( gdi_display, fbconfig, GLX_VISUAL_ID, &visual ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fbconfig, GLX_DRAWABLE_TYPE, &drawable ); return wine_dbg_sprintf( "fbconfig %#x visual id %#x drawable type %#x", id, visual, drawable ); }
static int get_render_type_from_fbconfig(Display *display, GLXFBConfig fbconfig) { int render_type, render_type_bit; - pglXGetFBConfigAttrib(display, fbconfig, GLX_RENDER_TYPE, &render_type_bit); + funcs->p_glXGetFBConfigAttrib( display, fbconfig, GLX_RENDER_TYPE, &render_type_bit ); switch(render_type_bit) { case GLX_RGBA_BIT: @@ -535,8 +451,8 @@ static int get_render_type_from_fbconfig(Display *display, GLXFBConfig fbconfig) static BOOL check_fbconfig_bitmap_capability(Display *display, GLXFBConfig fbconfig) { int dbuf, value; - pglXGetFBConfigAttrib(display, fbconfig, GLX_DOUBLEBUFFER, &dbuf); - pglXGetFBConfigAttrib(gdi_display, fbconfig, GLX_DRAWABLE_TYPE, &value); + funcs->p_glXGetFBConfigAttrib( display, fbconfig, GLX_DOUBLEBUFFER, &dbuf ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fbconfig, GLX_DRAWABLE_TYPE, &value );
/* Windows only supports bitmap rendering on single buffered formats, further the fbconfig needs to have * the GLX_PIXMAP_BIT set. */ @@ -551,7 +467,7 @@ static UINT x11drv_init_pixel_formats( UINT *onscreen_count ) GLXFBConfig* cfgs; XVisualInfo *visinfo;
- cfgs = pglXGetFBConfigs(gdi_display, DefaultScreen(gdi_display), &nCfgs); + cfgs = funcs->p_glXGetFBConfigs( gdi_display, DefaultScreen( gdi_display ), &nCfgs ); if (NULL == cfgs || 0 == nCfgs) { if(cfgs != NULL) XFree(cfgs); ERR("glXChooseFBConfig returns NULL\n"); @@ -579,8 +495,8 @@ static UINT x11drv_init_pixel_formats( UINT *onscreen_count ) for(run=0; run < 2; run++) { for(i=0; i<nCfgs; i++) { - pglXGetFBConfigAttrib(gdi_display, cfgs[i], GLX_FBCONFIG_ID, &fmt_id); - visinfo = pglXGetVisualFromFBConfig(gdi_display, cfgs[i]); + funcs->p_glXGetFBConfigAttrib( gdi_display, cfgs[i], GLX_FBCONFIG_ID, &fmt_id ); + visinfo = funcs->p_glXGetVisualFromFBConfig( gdi_display, cfgs[i] );
/* The first run we only add onscreen formats (ones which have an associated X Visual). * The second run we only set offscreen formats. */ @@ -622,7 +538,7 @@ static UINT x11drv_init_pixel_formats( UINT *onscreen_count ) } } else if(run && !visinfo) { int window_drawable=0; - pglXGetFBConfigAttrib(gdi_display, cfgs[i], GLX_DRAWABLE_TYPE, &window_drawable); + funcs->p_glXGetFBConfigAttrib( gdi_display, cfgs[i], GLX_DRAWABLE_TYPE, &window_drawable );
/* Recent Nvidia drivers and DRI drivers offer window drawable formats without a visual. * This are formats like 16-bit rgb on a 24-bit desktop. In order to support these formats @@ -701,18 +617,18 @@ static void release_gl_drawable( struct gl_drawable *gl ) case DC_GL_WINDOW: case DC_GL_CHILD_WIN: TRACE( "destroying %lx drawable %lx\n", gl->window, gl->drawable ); - pglXDestroyWindow( gdi_display, gl->drawable ); + funcs->p_glXDestroyWindow( gdi_display, gl->drawable ); destroy_client_window( gl->hwnd, gl->window ); XFreeColormap( gdi_display, gl->colormap ); break; case DC_GL_PIXMAP_WIN: TRACE( "destroying pixmap %lx drawable %lx\n", gl->pixmap, gl->drawable ); - pglXDestroyPixmap( gdi_display, gl->drawable ); + funcs->p_glXDestroyPixmap( gdi_display, gl->drawable ); XFreePixmap( gdi_display, gl->pixmap ); break; case DC_GL_PBUFFER: TRACE( "destroying pbuffer drawable %lx\n", gl->drawable ); - pglXDestroyPbuffer( gdi_display, gl->drawable ); + funcs->p_glXDestroyPbuffer( gdi_display, gl->drawable ); break; default: break; @@ -767,8 +683,8 @@ static inline void sync_context(struct x11drv_context *context) } if (refresh) { - pglXMakeContextCurrent( gdi_display, context->drawables[0]->drawable, - context->drawables[1]->drawable, context->ctx ); + funcs->p_glXMakeContextCurrent( gdi_display, context->drawables[0]->drawable, + context->drawables[1]->drawable, context->ctx ); release_gl_drawable( old[0] ); release_gl_drawable( old[1] ); } @@ -834,12 +750,13 @@ 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); - else if(context->fmt->visual) - ctx = pglXCreateContext(gdi_display, context->fmt->visual, shareList, GL_TRUE); + if (context->gl3_context) + ctx = pglXCreateContextAttribsARB( 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 */ - ctx = pglXCreateNewContext(gdi_display, context->fmt->fbconfig, context->fmt->render_type, shareList, TRUE); + ctx = funcs->p_glXCreateNewContext( gdi_display, context->fmt->fbconfig, + context->fmt->render_type, shareList, TRUE );
return ctx; } @@ -876,8 +793,7 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct glx_pixel (visual->class == PseudoColor || visual->class == GrayScale || visual->class == DirectColor) ? AllocAll : AllocNone ); gl->window = create_client_window( hwnd, visual, gl->colormap ); - if (gl->window) - gl->drawable = pglXCreateWindow( gdi_display, gl->format->fbconfig, gl->window, NULL ); + if (gl->window) gl->drawable = funcs->p_glXCreateWindow( gdi_display, gl->format->fbconfig, gl->window, NULL ); TRACE( "%p created client %lx drawable %lx\n", hwnd, gl->window, gl->drawable ); } #ifdef SONAME_LIBXCOMPOSITE @@ -892,7 +808,7 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct glx_pixel { struct x11drv_win_data *data;
- gl->drawable = pglXCreateWindow( gdi_display, gl->format->fbconfig, gl->window, NULL ); + gl->drawable = funcs->p_glXCreateWindow( gdi_display, gl->format->fbconfig, gl->window, NULL ); pXCompositeRedirectWindow( gdi_display, gl->window, CompositeRedirectManual );
if ((data = get_win_data( hwnd ))) @@ -921,7 +837,7 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct glx_pixel gl->pixmap = XCreatePixmap( gdi_display, root_window, width, height, visual->depth ); if (gl->pixmap) { - gl->drawable = pglXCreatePixmap( gdi_display, gl->format->fbconfig, gl->pixmap, NULL ); + gl->drawable = funcs->p_glXCreatePixmap( gdi_display, gl->format->fbconfig, gl->pixmap, NULL ); if (!gl->drawable) XFreePixmap( gdi_display, gl->pixmap );
gl->hdc_dst = NtGdiOpenDCW( &device_str, NULL, NULL, 0, TRUE, NULL, NULL, NULL ); @@ -1114,8 +1030,8 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for }
/* If we can't get basic information, there is no point continuing */ - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &drawable_type )) return 0; - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_RENDER_TYPE, &render_type )) return 0; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &drawable_type )) return 0; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_RENDER_TYPE, &render_type )) return 0;
memset( pf, 0, sizeof(*pf) ); pf->pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); @@ -1146,13 +1062,13 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for
if (!(pf->pfd.dwFlags & PFD_GENERIC_FORMAT)) pf->pfd.dwFlags |= PFD_SUPPORT_COMPOSITION;
- pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DOUBLEBUFFER, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DOUBLEBUFFER, &value ); if (value) { pf->pfd.dwFlags |= PFD_DOUBLEBUFFER; pf->pfd.dwFlags &= ~PFD_SUPPORT_GDI; } - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_STEREO, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_STEREO, &value ); if (value) pf->pfd.dwFlags |= PFD_STEREO;
/* Pixel type */ @@ -1160,16 +1076,16 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for else pf->pfd.iPixelType = PFD_TYPE_COLORINDEX;
/* Color bits */ - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_BUFFER_SIZE, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_BUFFER_SIZE, &value ); pf->pfd.cColorBits = value;
/* Red, green, blue and alpha bits / shifts */ if (pf->pfd.iPixelType == PFD_TYPE_RGBA) { - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_RED_SIZE, &rb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_GREEN_SIZE, &gb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_BLUE_SIZE, &bb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ALPHA_SIZE, &ab ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_RED_SIZE, &rb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_GREEN_SIZE, &gb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_BLUE_SIZE, &bb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ALPHA_SIZE, &ab );
pf->pfd.cBlueBits = bb; pf->pfd.cBlueShift = 0; @@ -1194,10 +1110,10 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for }
/* Accum RGBA bits */ - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_RED_SIZE, &rb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_GREEN_SIZE, &gb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_BLUE_SIZE, &bb ); - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_ALPHA_SIZE, &ab ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_RED_SIZE, &rb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_GREEN_SIZE, &gb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_BLUE_SIZE, &bb ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_ACCUM_ALPHA_SIZE, &ab );
pf->pfd.cAccumBits = rb + gb + bb + ab; pf->pfd.cAccumRedBits = rb; @@ -1206,23 +1122,24 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for pf->pfd.cAccumAlphaBits = ab;
/* Aux bits */ - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_AUX_BUFFERS, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_AUX_BUFFERS, &value ); pf->pfd.cAuxBuffers = value;
/* Depth bits */ - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DEPTH_SIZE, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_DEPTH_SIZE, &value ); pf->pfd.cDepthBits = value;
/* stencil bits */ - pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_STENCIL_SIZE, &value ); + funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_STENCIL_SIZE, &value ); pf->pfd.cStencilBits = value;
pf->pfd.iLayerType = PFD_MAIN_PLANE;
if (!has_swap_method) pf->swap_method = WGL_SWAP_EXCHANGE_ARB; - else if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SWAP_METHOD_OML, &value )) + else if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SWAP_METHOD_OML, &value )) { - switch (value) { + switch (value) + { case GLX_SWAP_EXCHANGE_OML: pf->swap_method = WGL_SWAP_EXCHANGE_ARB; break; case GLX_SWAP_COPY_OML: pf->swap_method = WGL_SWAP_COPY_ARB; break; case GLX_SWAP_UNDEFINED_OML: pf->swap_method = WGL_SWAP_UNDEFINED_ARB; break; @@ -1231,7 +1148,7 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for } else pf->swap_method = -1;
- if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_TYPE, &value) ) pf->transparent = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_TYPE, &value )) pf->transparent = -1; else pf->transparent = value != GLX_NONE;
if (render_type & GLX_RGBA_BIT) pf->pixel_type = WGL_TYPE_RGBA_ARB; @@ -1242,51 +1159,51 @@ static BOOL x11drv_describe_pixel_format( int iPixelFormat, struct wgl_pixel_for else { ERR( "unexpected RenderType(%x)\n", render_type ); pf->pixel_type = -1; }
pf->draw_to_pbuffer = (drawable_type & GLX_PBUFFER_BIT) ? GL_TRUE : GL_FALSE; - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_PIXELS, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_PIXELS, &value )) value = -1; pf->max_pbuffer_pixels = value; - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_WIDTH, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_WIDTH, &value )) value = -1; pf->max_pbuffer_width = value; - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_HEIGHT, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_MAX_PBUFFER_HEIGHT, &value )) value = -1; pf->max_pbuffer_height = value;
- if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_RED_VALUE, &value )) + if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_RED_VALUE, &value )) { pf->transparent_red_value_valid = GL_TRUE; pf->transparent_red_value = value; } - if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_GREEN_VALUE, &value )) + if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_GREEN_VALUE, &value )) { pf->transparent_green_value_valid = GL_TRUE; pf->transparent_green_value = value; } - if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_BLUE_VALUE, &value )) + if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_BLUE_VALUE, &value )) { pf->transparent_blue_value_valid = GL_TRUE; pf->transparent_blue_value = value; } - if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_ALPHA_VALUE, &value )) + if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_ALPHA_VALUE, &value )) { pf->transparent_alpha_value_valid = GL_TRUE; pf->transparent_alpha_value = value; } - if (!pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_INDEX_VALUE, &value )) + if (!funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_TRANSPARENT_INDEX_VALUE, &value )) { pf->transparent_index_value_valid = GL_TRUE; pf->transparent_index_value = value; }
- if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SAMPLE_BUFFERS_ARB, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SAMPLE_BUFFERS_ARB, &value )) value = -1; pf->sample_buffers = value; - if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SAMPLES_ARB, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_SAMPLES_ARB, &value )) value = -1; pf->samples = value;
- if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &value )) value = -1; pf->framebuffer_srgb_capable = value;
pf->bind_to_texture_rgb = pf->bind_to_texture_rgba = render_type != GLX_COLOR_INDEX_BIT && (drawable_type & GLX_PBUFFER_BIT); pf->bind_to_texture_rectangle_rgb = pf->bind_to_texture_rectangle_rgba = GL_FALSE;
- if (pglXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FLOAT_COMPONENTS_NV, &value )) value = -1; + if (funcs->p_glXGetFBConfigAttrib( gdi_display, fmt->fbconfig, GLX_FLOAT_COMPONENTS_NV, &value )) value = -1; pf->float_components = value;
if (TRACE_ON(wgl)) dump_PIXELFORMATDESCRIPTOR( &pf->pfd ); @@ -1307,7 +1224,7 @@ static BOOL x11drv_context_destroy(void *private) list_remove( &ctx->entry ); pthread_mutex_unlock( &context_mutex );
- if (ctx->ctx) pglXDestroyContext( gdi_display, ctx->ctx ); + if (ctx->ctx) funcs->p_glXDestroyContext( gdi_display, ctx->ctx ); release_gl_drawable( ctx->drawables[0] ); release_gl_drawable( ctx->drawables[1] ); release_gl_drawable( ctx->new_drawables[0] ); @@ -1320,7 +1237,7 @@ static void *x11drv_get_proc_address( const char *name ) { void *ptr; if ((ptr = dlsym( funcs->opengl_handle, name ))) return ptr; - return pglXGetProcAddressARB( (const GLubyte *)name ); + return funcs->p_glXGetProcAddress( (const GLubyte *)name ); }
static void set_context_drawables( struct x11drv_context *ctx, struct gl_drawable *draw, @@ -1349,7 +1266,7 @@ static BOOL x11drv_context_make_current( HDC draw_hdc, HDC read_hdc, void *priva
if (!private) { - pglXMakeCurrent( gdi_display, None, NULL ); + funcs->p_glXMakeCurrent( gdi_display, None, NULL ); NtCurrentTeb()->glReserved2 = NULL; return TRUE; } @@ -1359,8 +1276,8 @@ static BOOL x11drv_context_make_current( HDC draw_hdc, HDC read_hdc, void *priva read_gl = get_gl_drawable( NtUserWindowFromDC( read_hdc ), read_hdc );
pthread_mutex_lock( &context_mutex ); - if (!pglXMakeContextCurrent) ret = pglXMakeCurrent( gdi_display, draw_gl->drawable, ctx->ctx ); - else ret = pglXMakeContextCurrent( gdi_display, draw_gl->drawable, read_gl ? read_gl->drawable : 0, ctx->ctx ); + if (!funcs->p_glXMakeContextCurrent) ret = funcs->p_glXMakeCurrent( gdi_display, draw_gl->drawable, ctx->ctx ); + else ret = funcs->p_glXMakeContextCurrent( gdi_display, draw_gl->drawable, read_gl ? read_gl->drawable : 0, ctx->ctx ); if (ret) { ctx->hdc = draw_hdc; @@ -1554,15 +1471,15 @@ static BOOL x11drv_pbuffer_create( HDC hdc, int format, BOOL largest, GLenum tex surface->format = fmt; surface->ref = 1;
- surface->drawable = pglXCreatePbuffer( gdi_display, fmt->fbconfig, glx_attribs ); + surface->drawable = funcs->p_glXCreatePbuffer( gdi_display, fmt->fbconfig, glx_attribs ); TRACE( "new Pbuffer drawable as %p (%lx)\n", surface, surface->drawable ); if (!surface->drawable) { free( surface ); return FALSE; } - pglXQueryDrawable( gdi_display, surface->drawable, GLX_WIDTH, (unsigned int *)width ); - pglXQueryDrawable( gdi_display, surface->drawable, GLX_HEIGHT, (unsigned int *)height ); + funcs->p_glXQueryDrawable( gdi_display, surface->drawable, GLX_WIDTH, (unsigned int *)width ); + funcs->p_glXQueryDrawable( gdi_display, surface->drawable, GLX_HEIGHT, (unsigned int *)height ); SetRect( &rect, 0, 0, *width, *height ); set_dc_drawable( hdc, surface->drawable, &rect, IncludeInferiors );
@@ -1742,7 +1659,7 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; } - pglXSwapBuffers(gdi_display, gl->drawable); + funcs->p_glXSwapBuffers( gdi_display, gl->drawable ); break; case DC_GL_WINDOW: case DC_GL_CHILD_WIN: @@ -1756,7 +1673,7 @@ static BOOL x11drv_swap_buffers( void *private, HWND hwnd, HDC hdc, int interval target_sbc = pglXSwapBuffersMscOML( gdi_display, gl->drawable, 0, 0, 0 ); break; } - pglXSwapBuffers(gdi_display, gl->drawable); + funcs->p_glXSwapBuffers( gdi_display, gl->drawable ); break; }
@@ -1786,27 +1703,3 @@ static const struct opengl_driver_funcs x11drv_driver_funcs = .p_pbuffer_updated = x11drv_pbuffer_updated, .p_pbuffer_bind = x11drv_pbuffer_bind, }; - -#else /* no OpenGL includes */ - -/********************************************************************** - * X11DRV_OpenglInit - */ -UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -void sync_gl_drawable( HWND hwnd, BOOL known_child ) -{ -} - -void set_gl_drawable_parent( HWND hwnd, HWND parent ) -{ -} - -void destroy_gl_drawable( HWND hwnd ) -{ -} - -#endif /* defined(SONAME_LIBGL) */
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
This merge request was closed by Rémi Bernon.
This doesn't seem to be loved, so I've opened !8210 instead.