-- v3: wineandroid: Use the EGL functions loaded from win32u. winewayland: Use the EGL functions loaded from win32u. win32u: Load EGL and expose functions in opengl_funcs. include: Generate EGL prototypes and ALL_EGL_FUNCS macro. win32u: Move the opengl_funcs tables out of the drivers. win32u: Initialize opengl_funcs tables even on failure. win32u: Pass opengl_funcs pointer to init_wgl_extensions.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/opengl.c | 6 +++--- dlls/wineandroid.drv/opengl.c | 2 +- dlls/winemac.drv/opengl.c | 10 +++++----- dlls/winewayland.drv/opengl.c | 2 +- dlls/winex11.drv/opengl.c | 14 +++++++------- include/wine/opengl_driver.h | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 5bde88ae3c6..651448b62f2 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -231,7 +231,7 @@ failed: return NULL; }
-static const char *osmesa_init_wgl_extensions(void) +static const char *osmesa_init_wgl_extensions( struct opengl_funcs *funcs ) { return ""; } @@ -426,7 +426,7 @@ static BOOL nulldrv_describe_pixel_format( int format, struct wgl_pixel_format * return TRUE; }
-static const char *nulldrv_init_wgl_extensions(void) +static const char *nulldrv_init_wgl_extensions( struct opengl_funcs *funcs ) { return ""; } @@ -1366,7 +1366,7 @@ static void display_funcs_init(void) display_funcs->p_wglGetProcAddress = win32u_display_wglGetProcAddress; display_funcs->p_get_pixel_formats = win32u_display_get_pixel_formats;
- strcpy( wgl_extensions, display_driver_funcs->p_init_wgl_extensions() ); + strcpy( wgl_extensions, display_driver_funcs->p_init_wgl_extensions( display_funcs ) ); display_funcs->p_wglGetPixelFormat = win32u_wglGetPixelFormat; display_funcs->p_wglSetPixelFormat = win32u_wglSetPixelFormat;
diff --git a/dlls/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index ba71c717f4a..d65d4f2d565 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -440,7 +440,7 @@ static void register_extension( const char *ext ) TRACE( "%s\n", ext ); }
-static const char *android_init_wgl_extensions(void) +static const char *android_init_wgl_extensions( struct opengl_funcs *funcs ) { register_extension("WGL_EXT_framebuffer_sRGB"); return wgl_extensions; diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index 0fc78f247c7..c5ad5e18a09 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -2729,7 +2729,7 @@ static void register_extension(const char *ext) TRACE("'%s'\n", ext); }
-static const char *macdrv_init_wgl_extensions(void) +static const char *macdrv_init_wgl_extensions(struct opengl_funcs *funcs) { /* * ARB Extensions @@ -2767,10 +2767,10 @@ static const char *macdrv_init_wgl_extensions(void) */
register_extension("WGL_WINE_query_renderer"); - opengl_funcs.p_wglQueryCurrentRendererIntegerWINE = macdrv_wglQueryCurrentRendererIntegerWINE; - opengl_funcs.p_wglQueryCurrentRendererStringWINE = macdrv_wglQueryCurrentRendererStringWINE; - opengl_funcs.p_wglQueryRendererIntegerWINE = macdrv_wglQueryRendererIntegerWINE; - opengl_funcs.p_wglQueryRendererStringWINE = macdrv_wglQueryRendererStringWINE; + funcs->p_wglQueryCurrentRendererIntegerWINE = macdrv_wglQueryCurrentRendererIntegerWINE; + funcs->p_wglQueryCurrentRendererStringWINE = macdrv_wglQueryCurrentRendererStringWINE; + funcs->p_wglQueryRendererIntegerWINE = macdrv_wglQueryRendererIntegerWINE; + funcs->p_wglQueryRendererStringWINE = macdrv_wglQueryRendererStringWINE;
return gl_info.wglExtensions; } diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index ef7c348a584..3285af9a505 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -811,7 +811,7 @@ static BOOL init_opengl_funcs(void) return TRUE; }
-static const char *wayland_init_wgl_extensions(void) +static const char *wayland_init_wgl_extensions(struct opengl_funcs *funcs) { if (has_egl_ext_pixel_format_float) { diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index de0917062b7..d6f18867f7a 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1930,7 +1930,7 @@ static void register_extension(const char *ext) TRACE("'%s'\n", ext); }
-static const char *x11drv_init_wgl_extensions(void) +static const char *x11drv_init_wgl_extensions( struct opengl_funcs *funcs ) { wglExtensions[0] = 0;
@@ -1982,8 +1982,8 @@ static const char *x11drv_init_wgl_extensions(void) if (has_extension(glExtensions, "GL_NV_vertex_array_range")) { register_extension( "WGL_NV_vertex_array_range" ); - opengl_funcs.p_wglAllocateMemoryNV = pglXAllocateMemoryNV; - opengl_funcs.p_wglFreeMemoryNV = pglXFreeMemoryNV; + funcs->p_wglAllocateMemoryNV = pglXAllocateMemoryNV; + funcs->p_wglFreeMemoryNV = pglXFreeMemoryNV; }
if (has_extension(glxExtensions, "GLX_OML_swap_method")) @@ -1994,10 +1994,10 @@ static const char *x11drv_init_wgl_extensions(void) if (has_extension( glxExtensions, "GLX_MESA_query_renderer" )) { register_extension( "WGL_WINE_query_renderer" ); - opengl_funcs.p_wglQueryCurrentRendererIntegerWINE = X11DRV_wglQueryCurrentRendererIntegerWINE; - opengl_funcs.p_wglQueryCurrentRendererStringWINE = X11DRV_wglQueryCurrentRendererStringWINE; - opengl_funcs.p_wglQueryRendererIntegerWINE = X11DRV_wglQueryRendererIntegerWINE; - opengl_funcs.p_wglQueryRendererStringWINE = X11DRV_wglQueryRendererStringWINE; + funcs->p_wglQueryCurrentRendererIntegerWINE = X11DRV_wglQueryCurrentRendererIntegerWINE; + funcs->p_wglQueryCurrentRendererStringWINE = X11DRV_wglQueryCurrentRendererStringWINE; + funcs->p_wglQueryRendererIntegerWINE = X11DRV_wglQueryRendererIntegerWINE; + funcs->p_wglQueryRendererStringWINE = X11DRV_wglQueryRendererStringWINE; }
return wglExtensions; diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index decdaec270d..7d8bed72d60 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -61,7 +61,7 @@ struct wgl_pixel_format #ifdef WINE_UNIX_LIB
/* Wine internal opengl driver version, needs to be bumped upon opengl_funcs changes. */ -#define WINE_OPENGL_DRIVER_VERSION 31 +#define WINE_OPENGL_DRIVER_VERSION 32
struct wgl_context; struct wgl_pbuffer; @@ -116,7 +116,7 @@ struct opengl_driver_funcs void *(*p_get_proc_address)(const char *); UINT (*p_init_pixel_formats)(UINT*); BOOL (*p_describe_pixel_format)(int,struct wgl_pixel_format*); - const char *(*p_init_wgl_extensions)(void); + const char *(*p_init_wgl_extensions)(struct opengl_funcs *funcs); BOOL (*p_set_pixel_format)(HWND,int,int,BOOL); BOOL (*p_swap_buffers)(void*,HWND,HDC,int); BOOL (*p_context_create)(HDC,int,void*,const int*,void**);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/opengl.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 651448b62f2..4aa6d8ad162 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -69,6 +69,14 @@ struct wgl_pbuffer struct wgl_context *prev_context; };
+static const struct opengl_funcs *default_funcs; /* default GL function table from opengl32 */ +static struct opengl_funcs null_memory_funcs, null_display_funcs; +static struct opengl_funcs *display_funcs = &null_display_funcs; +static struct opengl_funcs *memory_funcs = &null_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 @@ -531,13 +539,6 @@ static const char *win32u_wglGetExtensionsStringEXT(void) return wgl_extensions; }
-static const struct opengl_funcs *default_funcs; /* default GL function table from opengl32 */ -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 int get_dc_pixel_format( HDC hdc, BOOL internal ) { int ret = 0; @@ -808,7 +809,7 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int return NULL; } NtGdiSetPixelFormat( pbuffer->hdc, format ); - pbuffer->driver_funcs = funcs == memory_funcs ? memory_driver_funcs : display_driver_funcs; + pbuffer->driver_funcs = funcs == display_funcs ? display_driver_funcs : memory_driver_funcs; pbuffer->funcs = funcs; pbuffer->width = width; pbuffer->height = height; @@ -1323,10 +1324,9 @@ static void init_opengl_funcs( struct opengl_funcs *funcs, const struct opengl_d
static void memory_funcs_init(void) { - memory_funcs = osmesa_get_wgl_driver( &memory_driver_funcs ); - if (memory_funcs && !(memory_formats_count = memory_driver_funcs->p_init_pixel_formats( &memory_onscreen_count ))) memory_funcs = NULL; - if (!memory_funcs) return; + if (!osmesa_get_wgl_driver( &memory_driver_funcs )) WARN( "Failed to initialize OSMesa functions\n" );
+ memory_formats_count = memory_driver_funcs->p_init_pixel_formats( &memory_onscreen_count ); init_opengl_funcs( memory_funcs, memory_driver_funcs );
memory_funcs->p_wglGetProcAddress = win32u_memory_wglGetProcAddress; @@ -1352,15 +1352,10 @@ static void display_funcs_init(void) { UINT status;
- if ((status = user_driver->pOpenGLInit( WINE_OPENGL_DRIVER_VERSION, &display_funcs, &display_driver_funcs )) && - status != STATUS_NOT_IMPLEMENTED) - { - ERR( "Failed to initialize the driver opengl functions, status %#x\n", status ); - return; - } - if (display_funcs && !(display_formats_count = display_driver_funcs->p_init_pixel_formats( &display_onscreen_count ))) display_funcs = NULL; - if (!display_funcs) return; + if ((status = user_driver->pOpenGLInit( WINE_OPENGL_DRIVER_VERSION, &display_funcs, &display_driver_funcs ))) + WARN( "Failed to initialize the driver OpenGL functions, status %#x\n", status );
+ display_formats_count = display_driver_funcs->p_init_pixel_formats( &display_onscreen_count ); init_opengl_funcs( display_funcs, display_driver_funcs );
display_funcs->p_wglGetProcAddress = win32u_display_wglGetProcAddress; @@ -1442,13 +1437,13 @@ static const struct opengl_funcs *get_dc_funcs( HDC hdc, const struct opengl_fun { static pthread_once_t display_init_once = PTHREAD_ONCE_INIT; pthread_once( &display_init_once, display_funcs_init ); - return display_funcs ? display_funcs : null_funcs; + return display_funcs; } if (is_memdc) { static pthread_once_t memory_init_once = PTHREAD_ONCE_INIT; pthread_once( &memory_init_once, memory_funcs_init ); - return memory_funcs ? memory_funcs : null_funcs; + return memory_funcs; } return NULL; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/driver.c | 2 +- dlls/win32u/opengl.c | 132 +++++++++++++++--------------- dlls/wineandroid.drv/android.h | 2 +- dlls/wineandroid.drv/opengl.c | 6 +- dlls/winemac.drv/macdrv.h | 2 +- dlls/winemac.drv/opengl.c | 5 +- dlls/winewayland.drv/opengl.c | 6 +- dlls/winewayland.drv/waylanddrv.h | 2 +- dlls/winex11.drv/opengl.c | 7 +- dlls/winex11.drv/x11drv.h | 2 +- include/wine/gdi_driver.h | 4 +- 11 files changed, 78 insertions(+), 92 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 5e32e714b24..cf3be4be949 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -911,7 +911,7 @@ static UINT nulldrv_VulkanInit( UINT version, void *vulkan_handle, const struct return STATUS_NOT_IMPLEMENTED; }
-static UINT nulldrv_OpenGLInit( UINT version, struct opengl_funcs **opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) +static UINT nulldrv_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) { return STATUS_NOT_IMPLEMENTED; } diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 4aa6d8ad162..7b3910c5ab4 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -70,9 +70,8 @@ struct wgl_pbuffer };
static const struct opengl_funcs *default_funcs; /* default GL function table from opengl32 */ -static struct opengl_funcs null_memory_funcs, null_display_funcs; -static struct opengl_funcs *display_funcs = &null_display_funcs; -static struct opengl_funcs *memory_funcs = &null_memory_funcs; +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; @@ -194,7 +193,6 @@ struct osmesa_context UINT format; };
-static struct opengl_funcs osmesa_opengl_funcs; static const struct opengl_driver_funcs osmesa_driver_funcs;
static OSMesaContext (*pOSMesaCreateContextExt)( GLenum format, GLint depthBits, GLint stencilBits, @@ -206,7 +204,7 @@ static GLboolean (*pOSMesaMakeCurrent)( OSMesaContext ctx, void *buffer, GLenum static void (*pOSMesaPixelStore)( GLint pname, GLint value ); static void describe_pixel_format( int fmt, PIXELFORMATDESCRIPTOR *descr );
-static struct opengl_funcs *osmesa_get_wgl_driver( const struct opengl_driver_funcs **driver_funcs ) +static BOOL osmesa_get_wgl_driver( const struct opengl_driver_funcs **driver_funcs ) { static void *osmesa_handle;
@@ -214,7 +212,7 @@ static struct opengl_funcs *osmesa_get_wgl_driver( const struct opengl_driver_fu if (osmesa_handle == NULL) { ERR( "Failed to load OSMesa: %s\n", dlerror() ); - return NULL; + return FALSE; }
#define LOAD_FUNCPTR(f) do if (!(p##f = dlsym( osmesa_handle, #f ))) \ @@ -231,12 +229,12 @@ static struct opengl_funcs *osmesa_get_wgl_driver( const struct opengl_driver_fu #undef LOAD_FUNCPTR
*driver_funcs = &osmesa_driver_funcs; - return &osmesa_opengl_funcs; + return TRUE;
failed: dlclose( osmesa_handle ); osmesa_handle = NULL; - return NULL; + return FALSE; }
static const char *osmesa_init_wgl_extensions( struct opengl_funcs *funcs ) @@ -409,9 +407,9 @@ static const struct opengl_driver_funcs osmesa_driver_funcs =
#else /* SONAME_LIBOSMESA */
-static struct opengl_funcs *osmesa_get_wgl_driver( const struct opengl_driver_funcs **driver_funcs ) +static BOOL osmesa_get_wgl_driver( const struct opengl_driver_funcs **driver_funcs ) { - return NULL; + return FALSE; }
#endif /* SONAME_LIBOSMESA */ @@ -671,14 +669,14 @@ static struct wgl_context *context_create( HDC hdc, struct wgl_context *shared, }
if (!(funcs = get_dc_funcs( hdc, NULL ))) return NULL; - driver_funcs = funcs == display_funcs ? display_driver_funcs : memory_driver_funcs; + driver_funcs = funcs == &display_funcs ? display_driver_funcs : memory_driver_funcs;
if (!(context = calloc( 1, sizeof(*context) ))) return NULL; 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; + 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 )) { @@ -809,7 +807,7 @@ static struct wgl_pbuffer *win32u_wglCreatePbufferARB( HDC hdc, int format, int return NULL; } NtGdiSetPixelFormat( pbuffer->hdc, format ); - pbuffer->driver_funcs = funcs == display_funcs ? display_driver_funcs : memory_driver_funcs; + pbuffer->driver_funcs = funcs == &display_funcs ? display_driver_funcs : memory_driver_funcs; pbuffer->funcs = funcs; pbuffer->width = width; pbuffer->height = height; @@ -1237,7 +1235,7 @@ static BOOL win32u_wglSwapBuffers( HDC hdc ) RtlSetLastWin32Error( ERROR_DC_NOT_FOUND ); return FALSE; } - driver_funcs = funcs == display_funcs ? display_driver_funcs : memory_driver_funcs; + driver_funcs = funcs == &display_funcs ? display_driver_funcs : memory_driver_funcs;
if (!(hwnd = NtUserWindowFromDC( hdc ))) interval = 0; else interval = get_window_swap_interval( hwnd ); @@ -1327,25 +1325,25 @@ static void memory_funcs_init(void) if (!osmesa_get_wgl_driver( &memory_driver_funcs )) WARN( "Failed to initialize OSMesa functions\n" );
memory_formats_count = memory_driver_funcs->p_init_pixel_formats( &memory_onscreen_count ); - init_opengl_funcs( memory_funcs, memory_driver_funcs ); + init_opengl_funcs( &memory_funcs, memory_driver_funcs );
- memory_funcs->p_wglGetProcAddress = win32u_memory_wglGetProcAddress; - memory_funcs->p_get_pixel_formats = win32u_memory_get_pixel_formats; + memory_funcs.p_wglGetProcAddress = win32u_memory_wglGetProcAddress; + memory_funcs.p_get_pixel_formats = win32u_memory_get_pixel_formats;
- memory_funcs->p_wglGetPixelFormat = win32u_wglGetPixelFormat; - memory_funcs->p_wglSetPixelFormat = win32u_wglSetPixelFormat; + memory_funcs.p_wglGetPixelFormat = win32u_wglGetPixelFormat; + memory_funcs.p_wglSetPixelFormat = win32u_wglSetPixelFormat;
- memory_funcs->p_wglCreateContext = win32u_wglCreateContext; - memory_funcs->p_wglDeleteContext = win32u_wglDeleteContext; - memory_funcs->p_wglCopyContext = win32u_wglCopyContext; - memory_funcs->p_wglShareLists = win32u_wglShareLists; - memory_funcs->p_wglMakeCurrent = win32u_wglMakeCurrent; + memory_funcs.p_wglCreateContext = win32u_wglCreateContext; + memory_funcs.p_wglDeleteContext = win32u_wglDeleteContext; + memory_funcs.p_wglCopyContext = win32u_wglCopyContext; + memory_funcs.p_wglShareLists = win32u_wglShareLists; + 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_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; }
static void display_funcs_init(void) @@ -1356,69 +1354,69 @@ static void display_funcs_init(void) WARN( "Failed to initialize the driver OpenGL functions, status %#x\n", status );
display_formats_count = display_driver_funcs->p_init_pixel_formats( &display_onscreen_count ); - init_opengl_funcs( display_funcs, display_driver_funcs ); + init_opengl_funcs( &display_funcs, display_driver_funcs );
- display_funcs->p_wglGetProcAddress = win32u_display_wglGetProcAddress; - display_funcs->p_get_pixel_formats = win32u_display_get_pixel_formats; + display_funcs.p_wglGetProcAddress = win32u_display_wglGetProcAddress; + display_funcs.p_get_pixel_formats = win32u_display_get_pixel_formats;
- strcpy( wgl_extensions, display_driver_funcs->p_init_wgl_extensions( display_funcs ) ); - display_funcs->p_wglGetPixelFormat = win32u_wglGetPixelFormat; - display_funcs->p_wglSetPixelFormat = win32u_wglSetPixelFormat; + strcpy( wgl_extensions, display_driver_funcs->p_init_wgl_extensions( &display_funcs ) ); + display_funcs.p_wglGetPixelFormat = win32u_wglGetPixelFormat; + display_funcs.p_wglSetPixelFormat = win32u_wglSetPixelFormat;
- display_funcs->p_wglCreateContext = win32u_wglCreateContext; - display_funcs->p_wglDeleteContext = win32u_wglDeleteContext; - display_funcs->p_wglCopyContext = win32u_wglCopyContext; - display_funcs->p_wglShareLists = win32u_wglShareLists; - display_funcs->p_wglMakeCurrent = win32u_wglMakeCurrent; + display_funcs.p_wglCreateContext = win32u_wglCreateContext; + display_funcs.p_wglDeleteContext = win32u_wglDeleteContext; + display_funcs.p_wglCopyContext = win32u_wglCopyContext; + display_funcs.p_wglShareLists = win32u_wglShareLists; + 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_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;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_extensions_string" ); - display_funcs->p_wglGetExtensionsStringARB = win32u_wglGetExtensionsStringARB; + display_funcs.p_wglGetExtensionsStringARB = win32u_wglGetExtensionsStringARB;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_EXT_extensions_string" ); - display_funcs->p_wglGetExtensionsStringEXT = win32u_wglGetExtensionsStringEXT; + display_funcs.p_wglGetExtensionsStringEXT = win32u_wglGetExtensionsStringEXT;
/* In WineD3D we need the ability to set the pixel format more than once (e.g. after a device reset). * The default wglSetPixelFormat doesn't allow this, so add our own which allows it. */ register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_WINE_pixel_format_passthrough" ); - display_funcs->p_wglSetPixelFormatWINE = win32u_wglSetPixelFormatWINE; + display_funcs.p_wglSetPixelFormatWINE = win32u_wglSetPixelFormatWINE;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_pixel_format" ); - display_funcs->p_wglChoosePixelFormatARB = (void *)1; /* never called */ - display_funcs->p_wglGetPixelFormatAttribfvARB = (void *)1; /* never called */ - display_funcs->p_wglGetPixelFormatAttribivARB = (void *)1; /* never called */ + display_funcs.p_wglChoosePixelFormatARB = (void *)1; /* never called */ + display_funcs.p_wglGetPixelFormatAttribfvARB = (void *)1; /* never called */ + display_funcs.p_wglGetPixelFormatAttribivARB = (void *)1; /* never called */
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_create_context" ); register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_create_context_no_error" ); register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_create_context_profile" ); - display_funcs->p_wglCreateContextAttribsARB = win32u_wglCreateContextAttribsARB; + display_funcs.p_wglCreateContextAttribsARB = win32u_wglCreateContextAttribsARB;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_make_current_read" ); - display_funcs->p_wglGetCurrentReadDCARB = (void *)1; /* never called */ - display_funcs->p_wglMakeContextCurrentARB = win32u_wglMakeContextCurrentARB; + display_funcs.p_wglGetCurrentReadDCARB = (void *)1; /* never called */ + display_funcs.p_wglMakeContextCurrentARB = win32u_wglMakeContextCurrentARB;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_pbuffer" ); - display_funcs->p_wglCreatePbufferARB = win32u_wglCreatePbufferARB; - display_funcs->p_wglDestroyPbufferARB = win32u_wglDestroyPbufferARB; - display_funcs->p_wglGetPbufferDCARB = win32u_wglGetPbufferDCARB; - display_funcs->p_wglReleasePbufferDCARB = win32u_wglReleasePbufferDCARB; - display_funcs->p_wglQueryPbufferARB = win32u_wglQueryPbufferARB; + display_funcs.p_wglCreatePbufferARB = win32u_wglCreatePbufferARB; + display_funcs.p_wglDestroyPbufferARB = win32u_wglDestroyPbufferARB; + display_funcs.p_wglGetPbufferDCARB = win32u_wglGetPbufferDCARB; + display_funcs.p_wglReleasePbufferDCARB = win32u_wglReleasePbufferDCARB; + display_funcs.p_wglQueryPbufferARB = win32u_wglQueryPbufferARB;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_ARB_render_texture" ); - display_funcs->p_wglBindTexImageARB = win32u_wglBindTexImageARB; - display_funcs->p_wglReleaseTexImageARB = win32u_wglReleaseTexImageARB; - display_funcs->p_wglSetPbufferAttribARB = win32u_wglSetPbufferAttribARB; + display_funcs.p_wglBindTexImageARB = win32u_wglBindTexImageARB; + display_funcs.p_wglReleaseTexImageARB = win32u_wglReleaseTexImageARB; + display_funcs.p_wglSetPbufferAttribARB = win32u_wglSetPbufferAttribARB;
register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_EXT_swap_control" ); register_extension( wgl_extensions, ARRAY_SIZE(wgl_extensions), "WGL_EXT_swap_control_tear" ); - display_funcs->p_wglSwapIntervalEXT = win32u_wglSwapIntervalEXT; - display_funcs->p_wglGetSwapIntervalEXT = win32u_wglGetSwapIntervalEXT; + display_funcs.p_wglSwapIntervalEXT = win32u_wglSwapIntervalEXT; + display_funcs.p_wglGetSwapIntervalEXT = win32u_wglGetSwapIntervalEXT; }
static const struct opengl_funcs *get_dc_funcs( HDC hdc, const struct opengl_funcs *null_funcs ) @@ -1437,13 +1435,13 @@ static const struct opengl_funcs *get_dc_funcs( HDC hdc, const struct opengl_fun { static pthread_once_t display_init_once = PTHREAD_ONCE_INIT; pthread_once( &display_init_once, display_funcs_init ); - return display_funcs; + return &display_funcs; } if (is_memdc) { static pthread_once_t memory_init_once = PTHREAD_ONCE_INIT; pthread_once( &memory_init_once, memory_funcs_init ); - return memory_funcs; + return &memory_funcs; } return NULL; } diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index d744202e6c9..291d2f0d299 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -56,7 +56,7 @@ DECL_FUNCPTR( ANativeWindow_release ); extern pthread_mutex_t drawable_mutex; extern void update_gl_drawable( HWND hwnd ); extern void destroy_gl_drawable( HWND hwnd ); -extern UINT ANDROID_OpenGLInit( UINT version, struct opengl_funcs **opengl_funcs, const struct opengl_driver_funcs **driver_funcs ); +extern UINT ANDROID_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs );
/************************************************************************** diff --git a/dlls/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index d65d4f2d565..aacb0c6a1fc 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -100,7 +100,6 @@ static struct egl_pixel_format *pixel_formats; static int nb_pixel_formats, nb_onscreen_formats; static EGLDisplay display; static char wgl_extensions[4096]; -static struct opengl_funcs egl_funcs;
static struct list gl_contexts = LIST_INIT( gl_contexts ); static struct list gl_drawables = LIST_INIT( gl_drawables ); @@ -514,7 +513,7 @@ static const struct opengl_driver_funcs android_driver_funcs = /********************************************************************** * ANDROID_OpenGLInit */ -UINT ANDROID_OpenGLInit( UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs ) +UINT ANDROID_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) { EGLint major, minor;
@@ -557,9 +556,6 @@ UINT ANDROID_OpenGLInit( UINT version, struct opengl_funcs **funcs, const struct if (!p_eglInitialize( display, &major, &minor )) return 0; TRACE( "display %p version %u.%u\n", display, major, minor );
- *funcs = &egl_funcs; *driver_funcs = &android_driver_funcs; return STATUS_SUCCESS; } - -static struct opengl_funcs egl_funcs; diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 2e2de456ddf..715997eb482 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -240,7 +240,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p extern BOOL query_pasteboard_data(HWND hwnd, CFStringRef type); extern void macdrv_lost_pasteboard_ownership(HWND hwnd);
-extern UINT macdrv_OpenGLInit(UINT version, struct opengl_funcs **opengl_funcs, const struct opengl_driver_funcs **driver_funcs); +extern UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs); extern UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs); extern void sync_gl_view(struct macdrv_win_data* data, const struct window_rects *old_rects);
diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index c5ad5e18a09..2715a0708d4 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -88,8 +88,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 struct opengl_funcs opengl_funcs; static const struct opengl_driver_funcs macdrv_driver_funcs;
static void (*pglCopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, @@ -2778,7 +2776,7 @@ static const char *macdrv_init_wgl_extensions(struct opengl_funcs *funcs) /********************************************************************** * macdrv_OpenGLInit */ -UINT macdrv_OpenGLInit(UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs) +UINT macdrv_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs) { TRACE("()\n");
@@ -2823,7 +2821,6 @@ UINT macdrv_OpenGLInit(UINT version, struct opengl_funcs **funcs, const struct o LOAD_FUNCPTR(glFlushRenderAPPLE); #undef LOAD_FUNCPTR
- *funcs = &opengl_funcs; *driver_funcs = &macdrv_driver_funcs; return STATUS_SUCCESS;
diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index 3285af9a505..ef1fb49368b 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -51,7 +51,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv); #endif
static void *egl_handle; -static struct opengl_funcs opengl_funcs; static EGLDisplay egl_display; static char wgl_extensions[4096]; static EGLConfig *egl_configs; @@ -900,7 +899,7 @@ static const struct opengl_driver_funcs wayland_driver_funcs = /********************************************************************** * WAYLAND_OpenGLInit */ -UINT WAYLAND_OpenGLInit(UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs) +UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs) { EGLint egl_version[2]; const char *egl_client_exts, *egl_exts; @@ -990,7 +989,6 @@ UINT WAYLAND_OpenGLInit(UINT version, struct opengl_funcs **funcs, const struct has_egl_ext_pixel_format_float = has_extension(egl_exts, "EGL_EXT_pixel_format_float");
if (!init_opengl_funcs()) goto err; - *funcs = &opengl_funcs; *driver_funcs = &wayland_driver_funcs; return STATUS_SUCCESS;
@@ -1024,7 +1022,7 @@ void wayland_resize_gl_drawable(HWND hwnd)
#else /* No GL */
-UINT WAYLAND_OpenGLInit(UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs) +UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs) { return STATUS_NOT_IMPLEMENTED; } diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 7ed3f75e3f3..251a23a4032 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -456,6 +456,6 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UIN BOOL WAYLAND_WindowPosChanging(HWND hwnd, UINT swp_flags, BOOL shaped, const struct window_rects *rects); BOOL WAYLAND_CreateWindowSurface(HWND hwnd, BOOL layered, const RECT *surface_rect, struct window_surface **surface); UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs); -UINT WAYLAND_OpenGLInit(UINT version, struct opengl_funcs **opengl_funcs, const struct opengl_driver_funcs **driver_funcs); +UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs);
#endif /* __WINE_WAYLANDDRV_H */ diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index d6f18867f7a..6e1b914b55f 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -261,8 +261,6 @@ static pthread_mutex_t context_mutex = PTHREAD_MUTEX_INITIALIZER;
static const BOOL is_win64 = sizeof(void *) > sizeof(int);
-static struct opengl_funcs opengl_funcs; - static BOOL glxRequireVersion(int requiredVersion);
static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { @@ -502,7 +500,7 @@ static const struct opengl_driver_funcs x11drv_driver_funcs; /********************************************************************** * X11DRV_OpenglInit */ -UINT X11DRV_OpenGLInit( UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs ) +UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) { int error_base, event_base;
@@ -680,7 +678,6 @@ UINT X11DRV_OpenGLInit( UINT version, struct opengl_funcs **funcs, const struct pglXSwapBuffersMscOML = pglXGetProcAddressARB( (const GLubyte *)"glXSwapBuffersMscOML" ); }
- *funcs = &opengl_funcs; *driver_funcs = &x11drv_driver_funcs; return STATUS_SUCCESS;
@@ -2099,7 +2096,7 @@ static const struct opengl_driver_funcs x11drv_driver_funcs = /********************************************************************** * X11DRV_OpenglInit */ -UINT X11DRV_OpenGLInit( UINT version, struct opengl_funcs **funcs, const struct opengl_driver_funcs **driver_funcs ) +UINT X11DRV_OpenGLInit( UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs ) { return STATUS_NOT_IMPLEMENTED; } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index eed34cf1cae..4cd2c7fa48f 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -282,7 +282,7 @@ extern BOOL client_side_with_render; extern BOOL shape_layered_windows; extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void);
-extern UINT X11DRV_OpenGLInit( UINT, struct opengl_funcs **, const struct opengl_driver_funcs ** ); +extern UINT X11DRV_OpenGLInit( UINT, const struct opengl_funcs *, const struct opengl_driver_funcs ** ); extern UINT X11DRV_VulkanInit( UINT, void *, const struct vulkan_driver_funcs ** );
extern struct format_entry *import_xdnd_selection( Display *display, Window win, Atom selection, diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 560e75ca591..51e9efd20d9 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -219,7 +219,7 @@ struct gdi_dc_funcs };
/* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 104 +#define WINE_GDI_DRIVER_VERSION 105
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ @@ -395,7 +395,7 @@ struct user_driver_funcs /* vulkan support */ UINT (*pVulkanInit)(UINT,void *,const struct vulkan_driver_funcs **); /* opengl support */ - UINT (*pOpenGLInit)(UINT,struct opengl_funcs **,const struct opengl_driver_funcs **); + UINT (*pOpenGLInit)(UINT,const struct opengl_funcs *,const struct opengl_driver_funcs **); /* thread management */ void (*pThreadDetach)(void); };
From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 4 +- dlls/opengl32/make_opengl | 130 +++++++++++-- dlls/wineandroid.drv/opengl.c | 5 +- dlls/winewayland.drv/opengl.c | 10 +- include/wine/opengl_driver.h | 1 + include/wine/wgl.h | 334 ++++++++++++++++++++++++++++++++++ 6 files changed, 451 insertions(+), 33 deletions(-)
diff --git a/configure.ac b/configure.ac index fd6e78a204b..0a9d37f94d7 100644 --- a/configure.ac +++ b/configure.ac @@ -647,7 +647,6 @@ m4_ifdef([AC_SYS_YEAR2038],
AC_CHECK_HEADERS(\ CL/cl.h \ - EGL/egl.h \ OpenCL/opencl.h \ arpa/inet.h \ arpa/nameser.h \ @@ -1403,8 +1402,7 @@ then if test "x$with_opengl" != "xno" then WINE_PACKAGE_FLAGS(EGL,[egl],[-lEGL],,, - [AC_CHECK_HEADER([EGL/egl.h], - [WINE_CHECK_SONAME(EGL,eglGetProcAddress,,,[$EGL_LIBS])])]) + [WINE_CHECK_SONAME(EGL,eglGetProcAddress,,,[$EGL_LIBS])]) WINE_PACKAGE_FLAGS(WAYLAND_EGL,[wayland-egl],,,, [AC_CHECK_HEADER([wayland-egl.h], [AC_CHECK_LIB(wayland-egl,wl_egl_window_create, diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index df877b1c07c..fa4983384a5 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/EGL-Registry/refs/heads/main/api/egl.xml # # If they are not found in the current directory the script will # attempt to download them from there. @@ -140,7 +141,12 @@ my %khronos_types = "khronos_uint16_t" => "unsigned short", "khronos_int32_t" => "int", "khronos_uint32_t" => "unsigned int", + "khronos_int64_t" => "__int64", + "khronos_uint64_t" => "unsigned __int64", + "khronos_ssize_t" => "ssize_t", "khronos_float_t" => "float", + "khronos_utime_nanoseconds_t" => "unsigned __int64", + "khronos_stime_nanoseconds_t" => "__int64", );
my %manual_win_functions = @@ -623,13 +629,16 @@ if ($version eq "1.0") { # # Fetch the registry files # -my $url="https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry"; -my $commit="03e1bfb87c4664d34dc7822fb591841eec747094"; +my $ogl_url="https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry"; +my $ogl_commit="03e1bfb87c4664d34dc7822fb591841eec747094"; +my $egl_url="https://raw.githubusercontent.com/KhronosGroup/EGL-Registry"; +my $egl_commit="bd4838f57cd7e0cb6e4a4154919af426b038695d"; my $cache = ($ENV{XDG_CACHE_HOME} || "$ENV{HOME}/.cache") . "/wine";
system "mkdir", "-p", $cache; --f "$cache/gl-$commit.xml" || system "wget", "-q", "-O", "$cache/gl-$commit.xml", "$url/$commit/xml/gl.xml" || die "cannot download gl.xml"; --f "$cache/wgl-$commit.xml" || system "wget", "-q", "-O", "$cache/wgl-$commit.xml", "$url/$commit/xml/wgl.xml" || die "cannot download wgl.xml"; +-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/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));
# @@ -649,8 +658,17 @@ chdir(dirname($0)); my %norm_functions; my %ext_functions; my %wgl_functions; -my %gl_enums; -my (%gl_types, @gl_types); # also use an array to preserve declaration order +my %egl_functions; +my %all_enums; + +my %gl_types = + ( + "EGLint" => "typedef khronos_int32_t EGLint;", + "EGLNativeDisplayType" => "typedef void *EGLNativeDisplayType;", + "EGLNativePixmapType" => "typedef void *EGLNativePixmapType;", + "EGLNativeWindowType" => "typedef void *EGLNativeWindowType;", + ); +my @gl_types = ( sort keys %gl_types ); # also use an array to preserve declaration order
my %remapped_wgl_functions = ( @@ -693,6 +711,16 @@ my %supported_wgl_extensions = "WGL_WINE_pixel_format_passthrough" => 1, "WGL_WINE_query_renderer" => 1, ); +my %supported_egl_extensions = + ( + "EGL_EXT_pixel_format_float" => 1, + "EGL_EXT_present_opaque" => 1, + "EGL_KHR_create_context" => 1, + "EGL_KHR_create_context_no_error" => 1, + "EGL_KHR_no_config_context" => 1, + "EGL_KHR_platform_android" => 1, + "EGL_KHR_platform_wayland" => 1, + );
my %supported_apis = ( @@ -759,7 +787,7 @@ sub parse_file($) next unless $name; $name = $name->textContent; push @gl_types, $name unless $gl_types{$name}; - $gl_types{$name} = $type; + $gl_types{$name} = $type->textContent; }
# generate norm functions @@ -782,6 +810,18 @@ sub parse_file($) $wgl_functions{$name} = $functions{$name} if defined $functions{$name}; } } + elsif ($feature->{api} eq "egl") + { + foreach my $cmd ($feature->findnodes("./require/command")) + { + my $name = $cmd->{name}; + $egl_functions{$name} = $functions{$cmd->{name}}; + } + foreach my $enum ($feature->findnodes("./require/enum")) + { + $all_enums{$enum->{name}} = $enums{$enum->{name}}; + } + } next unless defined $norm_categories{$feature->{name}}; foreach my $cmd ($feature->findnodes("./require/command")) { @@ -789,7 +829,7 @@ sub parse_file($) } foreach my $enum ($feature->findnodes("./require/enum")) { - $gl_enums{$enum->{name}} = $enums{$enum->{name}}; + $all_enums{$enum->{name}} = $enums{$enum->{name}}; } }
@@ -806,7 +846,7 @@ sub parse_file($) } foreach my $enum ($feature->findnodes("./require/enum")) { - $gl_enums{$enum->{name}} = $enums{$enum->{name}}; + $all_enums{$enum->{name}} = $enums{$enum->{name}}; } }
@@ -823,7 +863,21 @@ sub parse_file($) } foreach my $enum ($ext->findnodes("./require/enum")) { - $gl_enums{$enum->{name}} = $enums{$enum->{name}}; + $all_enums{$enum->{name}} = $enums{$enum->{name}}; + } + next; + } + if ($ext->{supported} eq "egl") + { + next unless defined $supported_egl_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; } @@ -847,13 +901,14 @@ sub parse_file($) } foreach my $enum ($ext->findnodes("./require/enum")) { - $gl_enums{$enum->{name}} = $enums{$enum->{name}}; + $all_enums{$enum->{name}} = $enums{$enum->{name}}; } } }
-parse_file( "$cache/gl-$commit.xml" ); -parse_file( "$cache/wgl-$commit.xml" ); +parse_file( "$cache/gl-$ogl_commit.xml" ); +parse_file( "$cache/wgl-$ogl_commit.xml" ); +parse_file( "$cache/egl-$egl_commit.xml" ); parse_file( "winegl.xml" );
# @@ -866,9 +921,11 @@ print HEADER "#define __WINE_WGL_H\n\n";
print HEADER "#include <stdarg.h>\n"; print HEADER "#include <stddef.h>\n"; +print HEADER "#include <stdint.h>\n"; print HEADER "#include <windef.h>\n"; print HEADER "#include <winbase.h>\n"; print HEADER "#include <wingdi.h>\n"; +print HEADER "#include <sys/types.h>\n"; print HEADER "\n";
print HEADER "#ifdef WINE_UNIX_LIB\n"; @@ -881,19 +938,23 @@ print HEADER "#ifndef GLAPIENTRY\n"; print HEADER "#define GLAPIENTRY __stdcall\n"; print HEADER "#endif\n\n";
+print HEADER "#ifndef EGL_CAST\n"; +print HEADER "#define EGL_CAST(t,x) ((t)(x))\n"; +print HEADER "#endif\n\n"; + foreach (@gl_types) { - my $type = $gl_types{$_}->textContent(); + my $type = $gl_types{$_}; foreach my $t (keys %khronos_types) { $type =~ s/\s(\Q$t\E)\s/ $khronos_types{$t} /; } printf HEADER $type . "\n"; } print HEADER "\n";
my $maxlen = 1; -foreach (keys %gl_enums) { $maxlen = length($_) if length($_) > $maxlen; } -foreach (sort keys %gl_enums) +foreach (keys %all_enums) { $maxlen = length($_) if length($_) > $maxlen; } +foreach (sort keys %all_enums) { - printf HEADER "#define %-*s %s\n", $maxlen, $_, $gl_enums{$_}; + printf HEADER "#define %-*s %s\n", $maxlen, $_, $all_enums{$_}; } print HEADER "\n";
@@ -913,6 +974,13 @@ foreach (sort keys %wgl_functions) 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, "" ); + my $func_ret = get_func_ret( $egl_functions{$_}, 0 ); + printf HEADER "typedef %-10s (GLAPIENTRY *PFN_$_)($decl_args);\n", $func_ret; +} + foreach (sort keys %norm_functions) { my $decl_args = get_func_args( $norm_functions{$_}, 1, 0, "" ); @@ -941,6 +1009,20 @@ foreach (sort keys %ext_functions) printf HEADER " \\n USE_GL_FUNC(%s)", $_; } print HEADER "\n\n"; +print HEADER "#define ALL_EGL_FUNCS"; +foreach (sort keys %egl_functions) +{ + next unless $_ =~ /^egl/; + printf HEADER " \\n USE_GL_FUNC(%s)", $_; +} +print HEADER "\n\n"; +print HEADER "#define ALL_EGL_EXT_FUNCS"; +foreach (sort keys %ext_functions) +{ + next unless $_ =~ /^egl/; + printf HEADER " \\n USE_GL_FUNC(%s)", $_; +} +print HEADER "\n\n"; print HEADER "#define ALL_GL_FUNCS"; foreach (sort keys %norm_functions) { @@ -1013,6 +1095,7 @@ 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{$_}); } @@ -1045,6 +1128,7 @@ 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", $_; } @@ -1103,6 +1187,7 @@ 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{$_}); @@ -1111,6 +1196,7 @@ 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 ); @@ -1121,6 +1207,7 @@ 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"; @@ -1170,6 +1257,7 @@ 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 needs_wrapper( $_, $ext_functions{$_} ); print OUT "extern NTSTATUS ext_$_( void *args );\n"; @@ -1192,6 +1280,7 @@ 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 needs_wrapper( $_, $ext_functions{$_} ); print OUT "static " unless defined $manual_wow64_thunks{$_}; @@ -1216,6 +1305,7 @@ 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", $_; } @@ -1242,6 +1332,7 @@ 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"); @@ -1261,6 +1352,7 @@ 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"; @@ -1284,6 +1376,7 @@ 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", $_; } @@ -1310,6 +1403,7 @@ 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{$_}); } @@ -1330,6 +1424,7 @@ 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"; } @@ -1342,6 +1437,7 @@ 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/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index aacb0c6a1fc..ddcd140a82f 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -35,9 +35,6 @@ #include <stdlib.h> #include <string.h> #include <dlfcn.h> -#ifdef HAVE_EGL_EGL_H -#include <EGL/egl.h> -#endif
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -49,7 +46,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(android);
-#define DECL_FUNCPTR(f) typeof(f) * p_##f = NULL +#define DECL_FUNCPTR(f) static PFN_##f p_##f = NULL DECL_FUNCPTR( eglCreateContext ); DECL_FUNCPTR( eglCreateWindowSurface ); DECL_FUNCPTR( eglCreatePbufferSurface ); diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index ef1fb49368b..9bc33393295 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -39,17 +39,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv);
#include <wayland-egl.h> -#include <EGL/egl.h> -#include <EGL/eglext.h>
#include "wine/opengl_driver.h"
-/* Support building on systems with older EGL headers, which may not include - * the EGL_EXT_present_opaque extension. */ -#ifndef EGL_PRESENT_OPAQUE_EXT -#define EGL_PRESENT_OPAQUE_EXT 0x31DF -#endif - static void *egl_handle; static EGLDisplay egl_display; static char wgl_extensions[4096]; @@ -57,7 +49,7 @@ static EGLConfig *egl_configs; static int num_egl_configs; static BOOL has_egl_ext_pixel_format_float;
-#define DECL_FUNCPTR(f) static typeof(f) * p_##f +#define DECL_FUNCPTR(f) static PFN_##f p_##f DECL_FUNCPTR(eglBindAPI); DECL_FUNCPTR(eglChooseConfig); DECL_FUNCPTR(eglCreateContext); diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 7d8bed72d60..e87085da7b6 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -105,6 +105,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_EGL_FUNCS ALL_GL_FUNCS ALL_GL_EXT_FUNCS #undef USE_GL_FUNC diff --git a/include/wine/wgl.h b/include/wine/wgl.h index 4419704e84e..6ba341d11a4 100644 --- a/include/wine/wgl.h +++ b/include/wine/wgl.h @@ -5,9 +5,11 @@
#include <stdarg.h> #include <stddef.h> +#include <stdint.h> #include <windef.h> #include <winbase.h> #include <wingdi.h> +#include <sys/types.h>
#ifdef WINE_UNIX_LIB #define GL_NO_PROTOTYPES @@ -18,6 +20,14 @@ #define GLAPIENTRY __stdcall #endif
+#ifndef EGL_CAST +#define EGL_CAST(t,x) ((t)(x)) +#endif + +typedef void *EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; +typedef int EGLint; typedef unsigned int GLenum; typedef unsigned char GLboolean; typedef unsigned int GLbitfield; @@ -75,8 +85,240 @@ DECLARE_HANDLE(HGPUNV); DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef struct _GPU_DEVICE GPU_DEVICE; typedef struct _GPU_DEVICE *PGPU_DEVICE; +struct AHardwareBuffer; +struct wl_buffer; +struct wl_display; +struct wl_resource; +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef intptr_t EGLAttribKHR; +typedef intptr_t EGLAttrib; +typedef void *EGLClientBuffer; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDeviceEXT; +typedef void *EGLDisplay; +typedef void *EGLImage; +typedef void *EGLImageKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLStreamKHR; +typedef void *EGLSurface; +typedef void *EGLSync; +typedef void *EGLSyncKHR; +typedef void *EGLSyncNV; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +typedef unsigned __int64 EGLTimeKHR; +typedef unsigned __int64 EGLTime; +typedef unsigned __int64 EGLTimeNV; +typedef unsigned __int64 EGLuint64NV; +typedef unsigned __int64 EGLuint64KHR; +typedef __int64 EGLnsecsANDROID; +typedef int EGLNativeFileDescriptorKHR; +typedef ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +typedef void ( *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC typedef unsigned int GLhandleARB;
+#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CLIENT_APIS 0x308D +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_LOST 0x300E +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0) +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_NO_TEXTURE 0x305C +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_PLATFORM_ANDROID_KHR 0x3141 +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#define EGL_PRESENT_OPAQUE_EXT 0x31DF +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SIGNALED 0x30F2 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_UNSIGNALED 0x30F3 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INVALID_PROFILE_ARB 0x2096 @@ -5608,6 +5850,50 @@ 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 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 ); +typedef EGLint (GLAPIENTRY *PFN_eglClientWaitSync)( EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglCopyBuffers)( EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target ); +typedef EGLContext (GLAPIENTRY *PFN_eglCreateContext)( EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list ); +typedef EGLImage (GLAPIENTRY *PFN_eglCreateImage)( EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreatePbufferFromClientBuffer)( EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreatePbufferSurface)( EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreatePixmapSurface)( EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreatePlatformPixmapSurface)( EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreatePlatformWindowSurface)( EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list ); +typedef EGLSync (GLAPIENTRY *PFN_eglCreateSync)( EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list ); +typedef EGLSurface (GLAPIENTRY *PFN_eglCreateWindowSurface)( EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglDestroyContext)( EGLDisplay dpy, EGLContext ctx ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglDestroyImage)( EGLDisplay dpy, EGLImage image ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglDestroySurface)( EGLDisplay dpy, EGLSurface surface ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglDestroySync)( EGLDisplay dpy, EGLSync sync ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglGetConfigAttrib)( EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglGetConfigs)( EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config ); +typedef EGLContext (GLAPIENTRY *PFN_eglGetCurrentContext)(void); +typedef EGLDisplay (GLAPIENTRY *PFN_eglGetCurrentDisplay)(void); +typedef EGLSurface (GLAPIENTRY *PFN_eglGetCurrentSurface)( EGLint readdraw ); +typedef EGLDisplay (GLAPIENTRY *PFN_eglGetDisplay)( EGLNativeDisplayType display_id ); +typedef EGLint (GLAPIENTRY *PFN_eglGetError)(void); +typedef EGLDisplay (GLAPIENTRY *PFN_eglGetPlatformDisplay)( EGLenum platform, void *native_display, const EGLAttrib *attrib_list ); +typedef __eglMustCastToProperFunctionPointerType (GLAPIENTRY *PFN_eglGetProcAddress)( const char *procname ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglGetSyncAttrib)( EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglInitialize)( EGLDisplay dpy, EGLint *major, EGLint *minor ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglMakeCurrent)( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx ); +typedef EGLenum (GLAPIENTRY *PFN_eglQueryAPI)(void); +typedef EGLBoolean (GLAPIENTRY *PFN_eglQueryContext)( EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value ); +typedef const char * (GLAPIENTRY *PFN_eglQueryString)( EGLDisplay dpy, EGLint name ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglQuerySurface)( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglReleaseTexImage)( EGLDisplay dpy, EGLSurface surface, EGLint buffer ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglReleaseThread)(void); +typedef EGLBoolean (GLAPIENTRY *PFN_eglSurfaceAttrib)( EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglSwapBuffers)( EGLDisplay dpy, EGLSurface surface ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglSwapInterval)( EGLDisplay dpy, EGLint interval ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglTerminate)( EGLDisplay dpy ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglWaitClient)(void); +typedef EGLBoolean (GLAPIENTRY *PFN_eglWaitGL)(void); +typedef EGLBoolean (GLAPIENTRY *PFN_eglWaitNative)( EGLint engine ); +typedef EGLBoolean (GLAPIENTRY *PFN_eglWaitSync)( EGLDisplay dpy, EGLSync sync, EGLint flags ); typedef void (GLAPIENTRY *PFN_glAccum)( GLenum op, GLfloat value ); typedef void (GLAPIENTRY *PFN_glAlphaFunc)( GLenum func, GLfloat ref ); typedef GLboolean (GLAPIENTRY *PFN_glAreTexturesResident)( GLsizei n, const GLuint *textures, GLboolean *residences ); @@ -8693,6 +8979,54 @@ typedef BOOL (GLAPIENTRY *PFN_wglSwapIntervalEXT)( int interval ); USE_GL_FUNC(wglSetPixelFormatWINE) \ USE_GL_FUNC(wglSwapIntervalEXT)
+#define ALL_EGL_FUNCS \ + USE_GL_FUNC(eglBindAPI) \ + USE_GL_FUNC(eglBindTexImage) \ + USE_GL_FUNC(eglChooseConfig) \ + USE_GL_FUNC(eglClientWaitSync) \ + USE_GL_FUNC(eglCopyBuffers) \ + USE_GL_FUNC(eglCreateContext) \ + USE_GL_FUNC(eglCreateImage) \ + USE_GL_FUNC(eglCreatePbufferFromClientBuffer) \ + USE_GL_FUNC(eglCreatePbufferSurface) \ + USE_GL_FUNC(eglCreatePixmapSurface) \ + USE_GL_FUNC(eglCreatePlatformPixmapSurface) \ + USE_GL_FUNC(eglCreatePlatformWindowSurface) \ + USE_GL_FUNC(eglCreateSync) \ + USE_GL_FUNC(eglCreateWindowSurface) \ + USE_GL_FUNC(eglDestroyContext) \ + USE_GL_FUNC(eglDestroyImage) \ + USE_GL_FUNC(eglDestroySurface) \ + USE_GL_FUNC(eglDestroySync) \ + USE_GL_FUNC(eglGetConfigAttrib) \ + USE_GL_FUNC(eglGetConfigs) \ + USE_GL_FUNC(eglGetCurrentContext) \ + USE_GL_FUNC(eglGetCurrentDisplay) \ + USE_GL_FUNC(eglGetCurrentSurface) \ + USE_GL_FUNC(eglGetDisplay) \ + USE_GL_FUNC(eglGetError) \ + USE_GL_FUNC(eglGetPlatformDisplay) \ + USE_GL_FUNC(eglGetProcAddress) \ + USE_GL_FUNC(eglGetSyncAttrib) \ + USE_GL_FUNC(eglInitialize) \ + USE_GL_FUNC(eglMakeCurrent) \ + USE_GL_FUNC(eglQueryAPI) \ + USE_GL_FUNC(eglQueryContext) \ + USE_GL_FUNC(eglQueryString) \ + USE_GL_FUNC(eglQuerySurface) \ + USE_GL_FUNC(eglReleaseTexImage) \ + USE_GL_FUNC(eglReleaseThread) \ + USE_GL_FUNC(eglSurfaceAttrib) \ + USE_GL_FUNC(eglSwapBuffers) \ + USE_GL_FUNC(eglSwapInterval) \ + USE_GL_FUNC(eglTerminate) \ + USE_GL_FUNC(eglWaitClient) \ + USE_GL_FUNC(eglWaitGL) \ + USE_GL_FUNC(eglWaitNative) \ + USE_GL_FUNC(eglWaitSync) + +#define ALL_EGL_EXT_FUNCS + #define ALL_GL_FUNCS \ USE_GL_FUNC(glAccum) \ USE_GL_FUNC(glAlphaFunc) \
From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 13 +++++-- dlls/opengl32/make_opengl | 1 + dlls/opengl32/unix_thunks.c | 1 + dlls/win32u/opengl.c | 70 ++++++++++++++++++++++++++++++++++++ include/wine/opengl_driver.h | 10 +++++- 5 files changed, 91 insertions(+), 4 deletions(-)
diff --git a/configure.ac b/configure.ac index 0a9d37f94d7..353fbc1948d 100644 --- a/configure.ac +++ b/configure.ac @@ -983,7 +983,6 @@ 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(EGL,eglGetProcAddress) WINE_CHECK_SONAME(GLESv2,glFlush)
if test "x$exec_prefix" = xNONE @@ -1213,6 +1212,16 @@ WINE_ERROR_WITH(pthread,[test "x$ac_cv_func_pthread_create" != xyes -a "x$PTHREA [pthread ${notice_platform}development files not found. Wine cannot support threads without libpthread.])
+dnl **** Check for EGL **** + +if test "x$with_opengl" != "xno" +then + WINE_PACKAGE_FLAGS(EGL,[egl],[-lEGL],,, + [WINE_CHECK_SONAME(EGL,eglGetProcAddress,,,[$EGL_LIBS])]) + WINE_NOTICE_WITH(opengl, [test -z "$ac_cv_lib_soname_EGL"], + [EGL ${notice_platform}development files not found]) +fi + dnl **** Check for X11 ****
AC_PATH_X @@ -1401,8 +1410,6 @@ then AC_CHECK_LIB(xkbregistry,rxkb_context_new,[:],[XKBREGISTRY_LIBS=""],[$XKBREGISTRY_LIBS])]) if test "x$with_opengl" != "xno" then - WINE_PACKAGE_FLAGS(EGL,[egl],[-lEGL],,, - [WINE_CHECK_SONAME(EGL,eglGetProcAddress,,,[$EGL_LIBS])]) WINE_PACKAGE_FLAGS(WAYLAND_EGL,[wayland-egl],,,, [AC_CHECK_HEADER([wayland-egl.h], [AC_CHECK_LIB(wayland-egl,wl_egl_window_create, diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index fa4983384a5..8f6d825f42e 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -1224,6 +1224,7 @@ print OUT "#if 0\n"; print OUT "#pragma makedep unix\n"; print OUT "#endif\n\n";
+print OUT "#include <config.h>\n"; print OUT "#include <stdarg.h>\n"; print OUT "#include <stddef.h>\n\n";
diff --git a/dlls/opengl32/unix_thunks.c b/dlls/opengl32/unix_thunks.c index 26f89bfc1eb..0f0154f9e17 100644 --- a/dlls/opengl32/unix_thunks.c +++ b/dlls/opengl32/unix_thunks.c @@ -4,6 +4,7 @@ #pragma makedep unix #endif
+#include <config.h> #include <stdarg.h> #include <stddef.h>
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 7b3910c5ab4..46f60153412 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -173,6 +173,74 @@ static void register_extension( char *list, size_t size, const char *name ) } }
+#ifdef SONAME_LIBEGL + +static BOOL egl_init(void) +{ + struct opengl_funcs *funcs = &display_funcs; + const char *extensions; + + if (!(funcs->egl_handle = dlopen( SONAME_LIBEGL, RTLD_NOW | RTLD_GLOBAL ))) + { + ERR( "Failed to load %s: %s\n", SONAME_LIBEGL, dlerror() ); + goto failed; + } + +#define LOAD_FUNCPTR( name ) \ + if (!(funcs->p_##name = dlsym( funcs->egl_handle, #name ))) \ + { \ + ERR( "Failed to find EGL function %s\n", #name ); \ + goto failed; \ + } + LOAD_FUNCPTR( eglGetProcAddress ); + LOAD_FUNCPTR( eglQueryString ); +#undef LOAD_FUNCPTR + + if (!(extensions = funcs->p_eglQueryString( EGL_NO_DISPLAY, EGL_EXTENSIONS ))) + { + ERR( "Failed to find client extensions\n" ); + goto failed; + } + TRACE( "EGL client extensions:\n" ); + dump_extensions( extensions ); + +#define CHECK_EXTENSION( ext ) \ + if (!has_extension( extensions, #ext )) \ + { \ + ERR( "Failed to find required extension %s\n", #ext ); \ + goto failed; \ + } + CHECK_EXTENSION( EGL_KHR_client_get_all_proc_addresses ); + CHECK_EXTENSION( EGL_EXT_platform_base ); +#undef CHECK_EXTENSION + +#define USE_GL_FUNC( func ) \ + if (!funcs->p_##func && !(funcs->p_##func = (void *)display_funcs.p_eglGetProcAddress( #func ))) \ + { \ + ERR( "Failed to load symbol %s\n", #func ); \ + goto failed; \ + } + ALL_EGL_FUNCS +#undef USE_GL_FUNC + + return TRUE; + +failed: + dlclose( display_funcs.egl_handle ); + display_funcs.egl_handle = NULL; + return FALSE; +} + +#else /* SONAME_LIBEGL */ + +static BOOL egl_init(void) +{ + WARN( "EGL support not compiled in!\n" ); + return FALSE; +} + +#endif /* SONAME_LIBEGL */ + #ifdef SONAME_LIBOSMESA
#define OSMESA_COLOR_INDEX GL_COLOR_INDEX @@ -1350,6 +1418,8 @@ static void display_funcs_init(void) { UINT status;
+ if (egl_init()) TRACE( "Initialized EGL library\n" ); + if ((status = user_driver->pOpenGLInit( WINE_OPENGL_DRIVER_VERSION, &display_funcs, &display_driver_funcs ))) WARN( "Failed to initialize the driver OpenGL functions, status %#x\n", status );
diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index e87085da7b6..32ef8010e27 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -60,8 +60,14 @@ struct wgl_pixel_format
#ifdef WINE_UNIX_LIB
+#ifdef HAVE_EGL_EGL_H +#define EGL_EGLEXT_PROTOTYPES +#include <EGL/egl.h> +#include <EGL/eglext.h> +#endif /* HAVE_EGL_EGL_H */ + /* Wine internal opengl driver version, needs to be bumped upon opengl_funcs changes. */ -#define WINE_OPENGL_DRIVER_VERSION 32 +#define WINE_OPENGL_DRIVER_VERSION 33
struct wgl_context; struct wgl_pbuffer; @@ -109,6 +115,8 @@ struct opengl_funcs ALL_GL_FUNCS ALL_GL_EXT_FUNCS #undef USE_GL_FUNC + + void *egl_handle; };
/* interface between win32u and the user drivers */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winewayland.drv/opengl.c | 175 +++++++++++----------------------- 1 file changed, 54 insertions(+), 121 deletions(-)
diff --git a/dlls/winewayland.drv/opengl.c b/dlls/winewayland.drv/opengl.c index 9bc33393295..6b16d61de32 100644 --- a/dlls/winewayland.drv/opengl.c +++ b/dlls/winewayland.drv/opengl.c @@ -42,32 +42,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv);
#include "wine/opengl_driver.h"
-static void *egl_handle; static EGLDisplay egl_display; static char wgl_extensions[4096]; static EGLConfig *egl_configs; static int num_egl_configs; static BOOL has_egl_ext_pixel_format_float; - -#define DECL_FUNCPTR(f) static PFN_##f p_##f -DECL_FUNCPTR(eglBindAPI); -DECL_FUNCPTR(eglChooseConfig); -DECL_FUNCPTR(eglCreateContext); -DECL_FUNCPTR(eglCreateWindowSurface); -DECL_FUNCPTR(eglDestroyContext); -DECL_FUNCPTR(eglDestroySurface); -DECL_FUNCPTR(eglGetConfigAttrib); -DECL_FUNCPTR(eglGetCurrentContext); -DECL_FUNCPTR(eglGetCurrentSurface); -DECL_FUNCPTR(eglGetError); -DECL_FUNCPTR(eglGetPlatformDisplay); -DECL_FUNCPTR(eglGetProcAddress); -DECL_FUNCPTR(eglInitialize); -DECL_FUNCPTR(eglMakeCurrent); -DECL_FUNCPTR(eglQueryString); -DECL_FUNCPTR(eglSwapBuffers); -DECL_FUNCPTR(eglSwapInterval); -#undef DECL_FUNCPTR +static const struct opengl_funcs *funcs;
#define DECL_FUNCPTR(f) static PFN_##f p_##f DECL_FUNCPTR(glClear); @@ -151,7 +131,7 @@ static struct wayland_gl_drawable *wayland_gl_drawable_get(HWND hwnd, HDC hdc) static void wayland_gl_drawable_release(struct wayland_gl_drawable *gl) { if (InterlockedDecrement(&gl->ref)) return; - if (gl->surface) p_eglDestroySurface(egl_display, gl->surface); + if (gl->surface) funcs->p_eglDestroySurface(egl_display, gl->surface); if (gl->wl_egl_window) wl_egl_window_destroy(gl->wl_egl_window); if (gl->client) { @@ -206,8 +186,8 @@ static struct wayland_gl_drawable *wayland_gl_drawable_create(HWND hwnd, HDC hdc goto err; }
- gl->surface = p_eglCreateWindowSurface(egl_display, egl_config_for_format(format), - gl->wl_egl_window, attribs); + gl->surface = funcs->p_eglCreateWindowSurface(egl_display, egl_config_for_format(format), + gl->wl_egl_window, attribs); if (!gl->surface) { ERR("Failed to create EGL surface\n"); @@ -279,7 +259,7 @@ static BOOL wayland_context_make_current(HDC draw_hdc, HDC read_hdc, void *priva
if (!private) { - p_eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + funcs->p_eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); NtCurrentTeb()->glReserved2 = NULL; return TRUE; } @@ -298,10 +278,10 @@ static BOOL wayland_context_make_current(HDC draw_hdc, HDC read_hdc, void *priva
pthread_mutex_lock(&gl_object_mutex);
- ret = p_eglMakeCurrent(egl_display, - draw ? draw->surface : EGL_NO_SURFACE, - read ? read->surface : EGL_NO_SURFACE, - ctx->context); + ret = funcs->p_eglMakeCurrent(egl_display, + draw ? draw->surface : EGL_NO_SURFACE, + read ? read->surface : EGL_NO_SURFACE, + ctx->context); if (ret) { old_draw = ctx->draw; @@ -409,7 +389,7 @@ static void wayland_context_refresh(struct wayland_context *ctx) ctx->new_read = NULL; refresh = TRUE; } - if (refresh) p_eglMakeCurrent(egl_display, ctx->draw, ctx->read, ctx->context); + if (refresh) funcs->p_eglMakeCurrent(egl_display, ctx->draw, ctx->read, ctx->context);
pthread_mutex_unlock(&gl_object_mutex);
@@ -462,10 +442,10 @@ static BOOL wayland_context_create(HDC hdc, int format, void *share_private, con * > EGL_OPENGL_API and EGL_OPENGL_ES_API are interchangeable for all * > purposes except eglCreateContext. */ - p_eglBindAPI(EGL_OPENGL_API); - ctx->context = p_eglCreateContext(egl_display, EGL_NO_CONFIG_KHR, - share ? share->context : EGL_NO_CONTEXT, - ctx->attribs); + funcs->p_eglBindAPI(EGL_OPENGL_API); + ctx->context = funcs->p_eglCreateContext(egl_display, EGL_NO_CONFIG_KHR, + share ? share->context : EGL_NO_CONTEXT, + ctx->attribs);
pthread_mutex_lock(&gl_object_mutex); list_add_head(&gl_contexts, &ctx->entry); @@ -499,7 +479,7 @@ static BOOL wayland_context_destroy(void *private) pthread_mutex_lock(&gl_object_mutex); list_remove(&ctx->entry); pthread_mutex_unlock(&gl_object_mutex); - p_eglDestroyContext(egl_display, ctx->context); + funcs->p_eglDestroyContext(egl_display, ctx->context); if (ctx->draw) wayland_gl_drawable_release(ctx->draw); if (ctx->read) wayland_gl_drawable_release(ctx->read); free(ctx); @@ -510,7 +490,7 @@ static void *wayland_get_proc_address(const char *name) { if (!strcmp(name, "glClear")) return wayland_glClear;
- return p_eglGetProcAddress(name); + return funcs->p_eglGetProcAddress(name); }
static BOOL wayland_context_share(void *src_private, void *dst_private) @@ -544,9 +524,9 @@ static BOOL wayland_context_share(void *src_private, void *dst_private) return FALSE; }
- p_eglDestroyContext(egl_display, clobber->context); - clobber->context = p_eglCreateContext(egl_display, EGL_NO_CONFIG_KHR, - keep->context, clobber->attribs); + funcs->p_eglDestroyContext(egl_display, clobber->context); + clobber->context = funcs->p_eglCreateContext(egl_display, EGL_NO_CONFIG_KHR, + keep->context, clobber->attribs); TRACE("re-created context (%p) for Wine context %p (%p) " "sharing lists with ctx %p (%p)\n", clobber->context, clobber, clobber->config, @@ -573,7 +553,7 @@ static BOOL wayland_swap_buffers(void *private, HWND hwnd, HDC hdc, int interval if (interval < 0) interval = -interval; if (gl->swap_interval != interval) { - p_eglSwapInterval(egl_display, interval); + funcs->p_eglSwapInterval(egl_display, interval); gl->swap_interval = interval; }
@@ -581,7 +561,7 @@ static BOOL wayland_swap_buffers(void *private, HWND hwnd, HDC hdc, int interval ensure_window_surface_contents(toplevel); /* Although all the EGL surfaces we create are double-buffered, we want to * use some as single-buffered, so avoid swapping those. */ - if (gl->double_buffered) p_eglSwapBuffers(egl_display, gl->surface); + if (gl->double_buffered) funcs->p_eglSwapBuffers(egl_display, gl->surface); wayland_gl_drawable_sync_size(gl);
wayland_gl_drawable_release(gl); @@ -641,7 +621,7 @@ static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt PIXELFORMATDESCRIPTOR *pfd = &fmt->pfd;
/* If we can't get basic information, there is no point continuing */ - if (!p_eglGetConfigAttrib(egl_display, config, EGL_SURFACE_TYPE, &surface_type)) return FALSE; + if (!funcs->p_eglGetConfigAttrib(egl_display, config, EGL_SURFACE_TYPE, &surface_type)) return FALSE;
memset(fmt, 0, sizeof(*fmt)); pfd->nSize = sizeof(*pfd); @@ -657,10 +637,10 @@ static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt
#define SET_ATTRIB(field, attrib) \ value = 0; \ - p_eglGetConfigAttrib(egl_display, config, attrib, &value); \ + funcs->p_eglGetConfigAttrib(egl_display, config, attrib, &value); \ pfd->field = value; #define SET_ATTRIB_ARB(field, attrib) \ - if (!p_eglGetConfigAttrib(egl_display, config, attrib, &value)) value = -1; \ + if (!funcs->p_eglGetConfigAttrib(egl_display, config, attrib, &value)) value = -1; \ fmt->field = value;
/* Although the documentation describes cColorBits as excluding alpha, real @@ -685,7 +665,7 @@ static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt
fmt->swap_method = WGL_SWAP_UNDEFINED_ARB;
- if (p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_TYPE, &value)) + if (funcs->p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_TYPE, &value)) { switch (value) { @@ -700,7 +680,7 @@ static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt else fmt->transparent = -1;
if (!has_egl_ext_pixel_format_float) fmt->pixel_type = WGL_TYPE_RGBA_ARB; - else if (p_eglGetConfigAttrib(egl_display, config, EGL_COLOR_COMPONENT_TYPE_EXT, &value)) + else if (funcs->p_eglGetConfigAttrib(egl_display, config, EGL_COLOR_COMPONENT_TYPE_EXT, &value)) { switch (value) { @@ -724,17 +704,17 @@ static BOOL describe_pixel_format(EGLConfig config, struct wgl_pixel_format *fmt fmt->max_pbuffer_height = 4096; fmt->max_pbuffer_pixels = fmt->max_pbuffer_width * fmt->max_pbuffer_height;
- if (p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_RED_VALUE, &value)) + if (funcs->p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_RED_VALUE, &value)) { fmt->transparent_red_value_valid = GL_TRUE; fmt->transparent_red_value = value; } - if (p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_GREEN_VALUE, &value)) + if (funcs->p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_GREEN_VALUE, &value)) { fmt->transparent_green_value_valid = GL_TRUE; fmt->transparent_green_value = value; } - if (p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_BLUE_VALUE, &value)) + if (funcs->p_eglGetConfigAttrib(egl_display, config, EGL_TRANSPARENT_BLUE_VALUE, &value)) { fmt->transparent_blue_value_valid = GL_TRUE; fmt->transparent_blue_value = value; @@ -798,7 +778,7 @@ static void register_extension(const char *ext)
static BOOL init_opengl_funcs(void) { - p_glClear = (void *)p_eglGetProcAddress("glClear"); + p_glClear = (void *)funcs->p_eglGetProcAddress("glClear"); return TRUE; }
@@ -823,14 +803,14 @@ static UINT wayland_init_pixel_formats(UINT *onscreen_count) EGL_NONE };
- p_eglChooseConfig(egl_display, attribs, NULL, 0, &num_egl_configs); + funcs->p_eglChooseConfig(egl_display, attribs, NULL, 0, &num_egl_configs); if (!(egl_configs = malloc(num_egl_configs * sizeof(*egl_configs)))) { ERR("Failed to allocate memory for EGL configs\n"); return 0; } - if (!p_eglChooseConfig(egl_display, attribs, egl_configs, num_egl_configs, - &num_egl_configs) || + if (!funcs->p_eglChooseConfig(egl_display, attribs, egl_configs, num_egl_configs, + &num_egl_configs) || !num_egl_configs) { free(egl_configs); @@ -845,18 +825,18 @@ static UINT wayland_init_pixel_formats(UINT *onscreen_count) for (i = 0; i < num_egl_configs; i++) { EGLint id, type, visual_id, native, render, color, r, g, b, a, d, s; - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_VISUAL_ID, &visual_id); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_SURFACE_TYPE, &type); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RENDERABLE_TYPE, &render); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_CONFIG_ID, &id); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_RENDERABLE, &native); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_COLOR_BUFFER_TYPE, &color); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RED_SIZE, &r); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_GREEN_SIZE, &g); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_BLUE_SIZE, &b); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_ALPHA_SIZE, &a); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_DEPTH_SIZE, &d); - p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_STENCIL_SIZE, &s); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_VISUAL_ID, &visual_id); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_SURFACE_TYPE, &type); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RENDERABLE_TYPE, &render); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_CONFIG_ID, &id); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_RENDERABLE, &native); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_COLOR_BUFFER_TYPE, &color); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RED_SIZE, &r); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_GREEN_SIZE, &g); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_BLUE_SIZE, &b); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_ALPHA_SIZE, &a); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_DEPTH_SIZE, &d); + funcs->p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_STENCIL_SIZE, &s); TRACE("%u: config %d id %d type %x visual %d native %d render %x " "colortype %d rgba %d,%d,%d,%d depth %u stencil %d\n", num_egl_configs, i, id, type, visual_id, native, render, @@ -894,7 +874,7 @@ static const struct opengl_driver_funcs wayland_driver_funcs = UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, const struct opengl_driver_funcs **driver_funcs) { EGLint egl_version[2]; - const char *egl_client_exts, *egl_exts; + const char *egl_exts;
if (version != WINE_OPENGL_DRIVER_VERSION) { @@ -903,70 +883,25 @@ UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, c return STATUS_INVALID_PARAMETER; }
- if (!(egl_handle = dlopen(SONAME_LIBEGL, RTLD_NOW|RTLD_GLOBAL))) - { - ERR("Failed to load %s: %s\n", SONAME_LIBEGL, dlerror()); - return STATUS_NOT_SUPPORTED; - } - -#define LOAD_FUNCPTR_DLSYM(func) \ - do { \ - if (!(p_##func = dlsym(egl_handle, #func))) \ - { ERR("Failed to load symbol %s\n", #func); goto err; } \ - } while(0) - LOAD_FUNCPTR_DLSYM(eglGetProcAddress); - LOAD_FUNCPTR_DLSYM(eglQueryString); -#undef LOAD_FUNCPTR_DLSYM + if (!opengl_funcs->egl_handle) return STATUS_NOT_SUPPORTED; + funcs = opengl_funcs;
- egl_client_exts = p_eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); - -#define REQUIRE_CLIENT_EXT(ext) \ - do { \ - if (!has_extension(egl_client_exts, #ext)) \ - { ERR("Failed to find required extension %s\n", #ext); goto err; } \ - } while(0) - REQUIRE_CLIENT_EXT(EGL_KHR_client_get_all_proc_addresses); - REQUIRE_CLIENT_EXT(EGL_KHR_platform_wayland); -#undef REQUIRE_CLIENT_EXT - -#define LOAD_FUNCPTR_EGL(func) \ - do { \ - if (!(p_##func = (void *)p_eglGetProcAddress(#func))) \ - { ERR("Failed to load symbol %s\n", #func); goto err; } \ - } while(0) - LOAD_FUNCPTR_EGL(eglBindAPI); - LOAD_FUNCPTR_EGL(eglChooseConfig); - LOAD_FUNCPTR_EGL(eglCreateContext); - LOAD_FUNCPTR_EGL(eglCreateWindowSurface); - LOAD_FUNCPTR_EGL(eglDestroyContext); - LOAD_FUNCPTR_EGL(eglDestroySurface); - LOAD_FUNCPTR_EGL(eglGetConfigAttrib); - LOAD_FUNCPTR_EGL(eglGetCurrentContext); - LOAD_FUNCPTR_EGL(eglGetCurrentSurface); - LOAD_FUNCPTR_EGL(eglGetError); - LOAD_FUNCPTR_EGL(eglGetPlatformDisplay); - LOAD_FUNCPTR_EGL(eglInitialize); - LOAD_FUNCPTR_EGL(eglMakeCurrent); - LOAD_FUNCPTR_EGL(eglSwapBuffers); - LOAD_FUNCPTR_EGL(eglSwapInterval); -#undef LOAD_FUNCPTR_EGL - - egl_display = p_eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, - process_wayland.wl_display, - NULL); + egl_display = funcs->p_eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, + process_wayland.wl_display, + NULL); if (egl_display == EGL_NO_DISPLAY) { ERR("Failed to get EGLDisplay\n"); goto err; } - if (!p_eglInitialize(egl_display, &egl_version[0], &egl_version[1])) + if (!funcs->p_eglInitialize(egl_display, &egl_version[0], &egl_version[1])) { - ERR("Failed to initialized EGLDisplay with error %d\n", p_eglGetError()); + ERR("Failed to initialized EGLDisplay with error %d\n", funcs->p_eglGetError()); goto err; } TRACE("EGL version %u.%u\n", egl_version[0], egl_version[1]);
- egl_exts = p_eglQueryString(egl_display, EGL_EXTENSIONS); + egl_exts = funcs->p_eglQueryString(egl_display, EGL_EXTENSIONS); #define REQUIRE_EXT(ext) \ do { \ if (!has_extension(egl_exts, #ext)) \ @@ -985,8 +920,6 @@ UINT WAYLAND_OpenGLInit(UINT version, const struct opengl_funcs *opengl_funcs, c return STATUS_SUCCESS;
err: - dlclose(egl_handle); - egl_handle = NULL; return STATUS_NOT_SUPPORTED; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/wineandroid.drv/opengl.c | 117 ++++++++++++---------------------- 1 file changed, 40 insertions(+), 77 deletions(-)
diff --git a/dlls/wineandroid.drv/opengl.c b/dlls/wineandroid.drv/opengl.c index ddcd140a82f..dd3de7fc25a 100644 --- a/dlls/wineandroid.drv/opengl.c +++ b/dlls/wineandroid.drv/opengl.c @@ -46,22 +46,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(android);
-#define DECL_FUNCPTR(f) static PFN_##f p_##f = NULL -DECL_FUNCPTR( eglCreateContext ); -DECL_FUNCPTR( eglCreateWindowSurface ); -DECL_FUNCPTR( eglCreatePbufferSurface ); -DECL_FUNCPTR( eglDestroyContext ); -DECL_FUNCPTR( eglDestroySurface ); -DECL_FUNCPTR( eglGetConfigAttrib ); -DECL_FUNCPTR( eglGetConfigs ); -DECL_FUNCPTR( eglGetDisplay ); -DECL_FUNCPTR( eglGetProcAddress ); -DECL_FUNCPTR( eglInitialize ); -DECL_FUNCPTR( eglMakeCurrent ); -DECL_FUNCPTR( eglSwapBuffers ); -DECL_FUNCPTR( eglSwapInterval ); -#undef DECL_FUNCPTR - +static const struct opengl_funcs *funcs; static const int egl_client_version = 2;
struct egl_pixel_format @@ -91,7 +76,6 @@ struct gl_drawable int swap_interval; };
-static void *egl_handle; static void *opengl_handle; static struct egl_pixel_format *pixel_formats; static int nb_pixel_formats, nb_onscreen_formats; @@ -113,7 +97,7 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, HDC hdc, int format ) gl->format = format; gl->window = create_ioctl_window( hwnd, TRUE, 1.0f ); gl->surface = 0; - gl->pbuffer = p_eglCreatePbufferSurface( display, pixel_formats[gl->format - 1].config, attribs ); + gl->pbuffer = funcs->p_eglCreatePbufferSurface( display, pixel_formats[gl->format - 1].config, attribs ); pthread_mutex_lock( &drawable_mutex ); list_add_head( &gl_drawables, &gl->entry ); return gl; @@ -147,8 +131,8 @@ void destroy_gl_drawable( HWND hwnd ) { if (gl->hwnd != hwnd) continue; list_remove( &gl->entry ); - if (gl->surface) p_eglDestroySurface( display, gl->surface ); - if (gl->pbuffer) p_eglDestroySurface( display, gl->pbuffer ); + if (gl->surface) funcs->p_eglDestroySurface( display, gl->surface ); + if (gl->pbuffer) funcs->p_eglDestroySurface( display, gl->pbuffer ); release_ioctl_window( gl->window ); free( gl ); break; @@ -163,7 +147,7 @@ static BOOL refresh_context( struct android_context *ctx ) if (ret) { TRACE( "refreshing hwnd %p context %p surface %p\n", ctx->hwnd, ctx->context, ctx->surface ); - p_eglMakeCurrent( display, ctx->surface, ctx->surface, ctx->context ); + funcs->p_eglMakeCurrent( display, ctx->surface, ctx->surface, ctx->context ); NtUserRedrawWindow( ctx->hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE ); } return ret; @@ -177,7 +161,8 @@ void update_gl_drawable( HWND hwnd ) if ((gl = get_gl_drawable( hwnd, 0 ))) { if (!gl->surface && - (gl->surface = p_eglCreateWindowSurface( display, pixel_formats[gl->format - 1].config, gl->window, NULL ))) + (gl->surface = funcs->p_eglCreateWindowSurface( display, pixel_formats[gl->format - 1].config, + gl->window, NULL ))) { LIST_FOR_EACH_ENTRY( ctx, &gl_contexts, struct android_context, entry ) { @@ -185,7 +170,7 @@ void update_gl_drawable( HWND hwnd ) TRACE( "hwnd %p refreshing %p %scurrent\n", hwnd, ctx, NtCurrentTeb()->glReserved2 == ctx ? "" : "not " ); ctx->surface = gl->surface; if (NtCurrentTeb()->glReserved2 == ctx) - p_eglMakeCurrent( display, ctx->surface, ctx->surface, ctx->context ); + funcs->p_eglMakeCurrent( display, ctx->surface, ctx->surface, ctx->context ); else InterlockedExchange( &ctx->refresh, TRUE ); } @@ -206,7 +191,7 @@ static BOOL android_set_pixel_format( HWND hwnd, int old_format, int new_format, if (internal) { EGLint pf; - p_eglGetConfigAttrib( display, pixel_formats[new_format - 1].config, EGL_NATIVE_VISUAL_ID, &pf ); + funcs->p_eglGetConfigAttrib( display, pixel_formats[new_format - 1].config, EGL_NATIVE_VISUAL_ID, &pf ); gl->window->perform( gl->window, NATIVE_WINDOW_SET_BUFFERS_FORMAT, pf ); gl->format = new_format; } @@ -259,7 +244,7 @@ static BOOL android_context_create( HDC hdc, int format, void *share, const int ctx->config = pixel_formats[format - 1].config; ctx->surface = 0; ctx->refresh = FALSE; - ctx->context = p_eglCreateContext( display, ctx->config, shared_ctx ? shared_ctx->context : EGL_NO_CONTEXT, attribs ); + ctx->context = funcs->p_eglCreateContext( display, ctx->config, shared_ctx ? shared_ctx->context : EGL_NO_CONTEXT, attribs ); TRACE( "%p fmt %d ctx %p\n", hdc, format, ctx->context ); list_add_head( &gl_contexts, &ctx->entry );
@@ -283,19 +268,19 @@ static BOOL android_describe_pixel_format( int format, struct wgl_pixel_format * pfd->iPixelType = PFD_TYPE_RGBA; pfd->iLayerType = PFD_MAIN_PLANE;
- p_eglGetConfigAttrib( display, config, EGL_BUFFER_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_BUFFER_SIZE, &val ); pfd->cColorBits = val; - p_eglGetConfigAttrib( display, config, EGL_RED_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_RED_SIZE, &val ); pfd->cRedBits = val; - p_eglGetConfigAttrib( display, config, EGL_GREEN_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_GREEN_SIZE, &val ); pfd->cGreenBits = val; - p_eglGetConfigAttrib( display, config, EGL_BLUE_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_BLUE_SIZE, &val ); pfd->cBlueBits = val; - p_eglGetConfigAttrib( display, config, EGL_ALPHA_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_ALPHA_SIZE, &val ); pfd->cAlphaBits = val; - p_eglGetConfigAttrib( display, config, EGL_DEPTH_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_DEPTH_SIZE, &val ); pfd->cDepthBits = val; - p_eglGetConfigAttrib( display, config, EGL_STENCIL_SIZE, &val ); + funcs->p_eglGetConfigAttrib( display, config, EGL_STENCIL_SIZE, &val ); pfd->cStencilBits = val;
pfd->cAlphaShift = 0; @@ -317,7 +302,7 @@ static BOOL android_context_make_current( HDC draw_hdc, HDC read_hdc, void *priv
if (!private) { - p_eglMakeCurrent( display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); + funcs->p_eglMakeCurrent( display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); NtCurrentTeb()->glReserved2 = NULL; return TRUE; } @@ -330,7 +315,7 @@ static BOOL android_context_make_current( HDC draw_hdc, HDC read_hdc, void *priv read_surface = read_gl->surface ? read_gl->surface : read_gl->pbuffer; TRACE( "%p/%p context %p surface %p/%p\n", draw_hdc, read_hdc, ctx->context, draw_surface, read_surface ); - ret = p_eglMakeCurrent( display, draw_surface, read_surface, ctx->context ); + ret = funcs->p_eglMakeCurrent( display, draw_surface, read_surface, ctx->context ); if (ret) { ctx->surface = draw_gl->surface; @@ -366,7 +351,7 @@ static BOOL android_context_destroy( void *private ) pthread_mutex_lock( &drawable_mutex ); list_remove( &ctx->entry ); pthread_mutex_unlock( &drawable_mutex ); - p_eglDestroyContext( display, ctx->context ); + funcs->p_eglDestroyContext( display, ctx->context ); free( ctx ); return TRUE; } @@ -375,7 +360,7 @@ static void *android_get_proc_address( const char *name ) { void *ptr; if ((ptr = dlsym( opengl_handle, name ))) return ptr; - return p_eglGetProcAddress( name ); + return funcs->p_eglGetProcAddress( name ); }
static BOOL android_context_share( void *org, void *dest ) @@ -388,7 +373,7 @@ static void set_swap_interval( struct gl_drawable *gl, int interval ) { if (interval < 0) interval = -interval; if (gl->swap_interval == interval) return; - p_eglSwapInterval( display, interval ); + funcs->p_eglSwapInterval( display, interval ); gl->swap_interval = interval; }
@@ -409,7 +394,7 @@ static BOOL android_swap_buffers( void *private, HWND hwnd, HDC hdc, int interva release_gl_drawable( gl ); }
- if (ctx->surface) p_eglSwapBuffers( display, ctx->surface ); + if (ctx->surface) funcs->p_eglSwapBuffers( display, ctx->surface ); return TRUE; }
@@ -447,10 +432,10 @@ static UINT android_init_pixel_formats( UINT *onscreen_count ) EGLConfig *configs; EGLint count, i, pass;
- p_eglGetConfigs( display, NULL, 0, &count ); + funcs->p_eglGetConfigs( display, NULL, 0, &count ); configs = malloc( count * sizeof(*configs) ); pixel_formats = malloc( count * sizeof(*pixel_formats) ); - p_eglGetConfigs( display, configs, count, &count ); + funcs->p_eglGetConfigs( display, configs, count, &count ); if (!count || !configs || !pixel_formats) { free( configs ); @@ -465,22 +450,22 @@ static UINT android_init_pixel_formats( UINT *onscreen_count ) { EGLint id, type, visual_id, native, render, color, r, g, b, d, s;
- p_eglGetConfigAttrib( display, configs[i], EGL_SURFACE_TYPE, &type ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_SURFACE_TYPE, &type ); if (!(type & EGL_WINDOW_BIT) == !pass) continue; - p_eglGetConfigAttrib( display, configs[i], EGL_RENDERABLE_TYPE, &render ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_RENDERABLE_TYPE, &render ); if (egl_client_version == 2 && !(render & EGL_OPENGL_ES2_BIT)) continue;
pixel_formats[nb_pixel_formats++].config = configs[i];
- p_eglGetConfigAttrib( display, configs[i], EGL_CONFIG_ID, &id ); - p_eglGetConfigAttrib( display, configs[i], EGL_NATIVE_VISUAL_ID, &visual_id ); - p_eglGetConfigAttrib( display, configs[i], EGL_NATIVE_RENDERABLE, &native ); - p_eglGetConfigAttrib( display, configs[i], EGL_COLOR_BUFFER_TYPE, &color ); - p_eglGetConfigAttrib( display, configs[i], EGL_RED_SIZE, &r ); - p_eglGetConfigAttrib( display, configs[i], EGL_GREEN_SIZE, &g ); - p_eglGetConfigAttrib( display, configs[i], EGL_BLUE_SIZE, &b ); - p_eglGetConfigAttrib( display, configs[i], EGL_DEPTH_SIZE, &d ); - p_eglGetConfigAttrib( display, configs[i], EGL_STENCIL_SIZE, &s ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_CONFIG_ID, &id ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_NATIVE_VISUAL_ID, &visual_id ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_NATIVE_RENDERABLE, &native ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_COLOR_BUFFER_TYPE, &color ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_RED_SIZE, &r ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_GREEN_SIZE, &g ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_BLUE_SIZE, &b ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_DEPTH_SIZE, &d ); + funcs->p_eglGetConfigAttrib( display, configs[i], EGL_STENCIL_SIZE, &s ); TRACE( "%u: config %u id %u type %x visual %u native %u render %x colortype %u rgb %u,%u,%u depth %u stencil %u\n", nb_pixel_formats, i, id, type, visual_id, native, render, color, r, g, b, d, s ); } @@ -519,38 +504,16 @@ 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 (!(egl_handle = dlopen( SONAME_LIBEGL, RTLD_NOW|RTLD_GLOBAL ))) - { - ERR( "failed to load %s: %s\n", SONAME_LIBEGL, dlerror() ); - return STATUS_NOT_SUPPORTED; - } + 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; } + funcs = opengl_funcs;
-#define LOAD_FUNCPTR(func) do { \ - if (!(p_##func = dlsym( egl_handle, #func ))) \ - { ERR( "can't find symbol %s\n", #func); return FALSE; } \ - } while(0) - LOAD_FUNCPTR( eglCreateContext ); - LOAD_FUNCPTR( eglCreateWindowSurface ); - LOAD_FUNCPTR( eglCreatePbufferSurface ); - LOAD_FUNCPTR( eglDestroyContext ); - LOAD_FUNCPTR( eglDestroySurface ); - LOAD_FUNCPTR( eglGetConfigAttrib ); - LOAD_FUNCPTR( eglGetConfigs ); - LOAD_FUNCPTR( eglGetDisplay ); - LOAD_FUNCPTR( eglGetProcAddress ); - LOAD_FUNCPTR( eglInitialize ); - LOAD_FUNCPTR( eglMakeCurrent ); - LOAD_FUNCPTR( eglSwapBuffers ); - LOAD_FUNCPTR( eglSwapInterval ); -#undef LOAD_FUNCPTR - - display = p_eglGetDisplay( EGL_DEFAULT_DISPLAY ); - if (!p_eglInitialize( display, &major, &minor )) return 0; + display = funcs->p_eglGetDisplay( EGL_DEFAULT_DISPLAY ); + if (!funcs->p_eglInitialize( display, &major, &minor )) return 0; TRACE( "display %p version %u.%u\n", display, major, minor );
*driver_funcs = &android_driver_funcs;
On Wed May 21 16:56:36 2025 +0000, Rémi Bernon wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/8103/diffs?diff_id=179507&start_sha=145f541992043888c2c5589204d0a0b80e591c1b#832d3127ac90db21326c970af502e8c173db234b_139_119)
Done, some types like `EGLNativeWindowType` are supposed to be platform dependent but I suppose using `void *` (and later a cast for X11 Window) should be fine.