From: Derek Lesho dlesho@codeweavers.com
Signed-off-by: Derek Lesho dlesho@codeweavers.com --- dlls/opengl32/unix_wgl.c | 35 +++++++++++++++++++++++++++++++++-- dlls/win32u/tests/d3dkmt.c | 4 ++-- 2 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 36ac8417f4a..ca0d0076f7d 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -542,6 +542,12 @@ static const char *legacy_extensions[] = NULL, };
+static const char *platform_extensions[] = +{ + "GL_EXT_memory_object_fd", "GL_EXT_memory_object_win32", + NULL +}; + static const char *parse_gl_version( const char *gl_version, int *major, int *minor ) { const char *ptr = gl_version; @@ -735,6 +741,7 @@ static GLubyte *filter_extensions( struct context *ctx, const char *extensions )
size = strlen( extensions ) + 2; for (extra = legacy_extensions; *extra; extra++) size += strlen( *extra ) + 1; + for (extra = platform_extensions; *extra; extra+=2) size += strlen( extra[1] + 1 ); if (!(p = str = malloc( size ))) return NULL;
TRACE( "GL_EXTENSIONS:\n" ); @@ -748,10 +755,22 @@ static GLubyte *filter_extensions( struct context *ctx, const char *extensions ) memcpy( p, extensions, end - extensions ); p[end - extensions] = 0;
+ for (extra = platform_extensions; *extra; extra += 2) + { + if (strcmp(p, extra[0])) + continue; + + TRACE("Replace platform extension %s with:\n", p); + + size = strlen( extra[1] ); + memcpy( p, extra[1], size ); + p[size] = 0; + } + if (is_extension_supported( ctx, p )) { TRACE( "++ %s\n", p ); - p += end - extensions; + p += strlen(p); *p++ = ' '; } else @@ -1232,6 +1251,7 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD if (ctx->major_version >= 3) { GLint extensions_count; + const char **platform_ext;
if (!funcs->p_glGetStringi) { @@ -1242,7 +1262,18 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); size += extensions_count; if (!(extensions = malloc( size * sizeof(*extensions) ))) return; - for (i = 0; i < extensions_count; i++) extensions[count++] = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + for (i = 0; i < extensions_count; i++) + { + extensions[count] = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + + for (platform_ext = platform_extensions; *platform_ext; platform_ext+=2) + { + if (!strcmp(extensions[count], platform_ext[0])) + extensions[count] = platform_ext[1]; + } + + count++; + } } else { diff --git a/dlls/win32u/tests/d3dkmt.c b/dlls/win32u/tests/d3dkmt.c index a852c2f45d9..3d102489949 100644 --- a/dlls/win32u/tests/d3dkmt.c +++ b/dlls/win32u/tests/d3dkmt.c @@ -4250,7 +4250,7 @@ static struct opengl_device *create_opengl_device( HWND hwnd, LUID *luid ) ok_ptr( extensions, !=, NULL );
ptr = find_opengl_extension( extensions, "GL_EXT_memory_object_win32" ); - todo_wine ok_ptr( ptr, !=, NULL ); + ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_semaphore_win32" ); todo_wine ok_ptr( ptr, !=, NULL ); ptr = find_opengl_extension( extensions, "GL_EXT_win32_keyed_mutex" ); @@ -4274,7 +4274,7 @@ static struct opengl_device *create_opengl_device( HWND hwnd, LUID *luid ) ok_x4( glGetError(), ==, 0 ); ok( !IsEqualGUID( &GUID_NULL, &guid ), "got GL_DRIVER_UUID_EXT %s\n", debugstr_guid( &guid ) );
- if (!winetest_platform_is_wine) /* crashes in host drivers */ + if (find_opengl_extension( extensions, "GL_EXT_memory_object_win32" ) || find_opengl_extension( extensions, "GL_EXT_semaphore_win32" )) /* crashes in host drivers */ { LUID device_luid = {0}; unsigned int nodes = 0;