From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/unix_wgl.c | 54 ++++++++++++++++++++++++++-------------- dlls/win32u/opengl.c | 1 + 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 32a939ff4a0..ba00b548f39 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -887,12 +887,6 @@ const GLubyte *wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ) { const struct opengl_funcs *funcs = teb->glTable; - if (!funcs->p_glGetStringi) - { - void **func_ptr = (void **)&funcs->p_glGetStringi; - *func_ptr = funcs->p_wglGetProcAddress( "glGetStringi" ); - } - if (name == GL_EXTENSIONS) { struct context *ctx = get_current_context( teb, NULL, NULL ); @@ -980,7 +974,7 @@ static BOOL initialize_vk_device( TEB *teb, struct context *ctx ) static PFN_vkGetPhysicalDeviceProperties2KHR p_vkGetPhysicalDeviceProperties2KHR; if (ctx->buffers->vk_device) return TRUE; /* already initialized */ - if (!is_extension_supported( ctx, "GL_EXT_memory_object_fd" )) + if (!ctx->base.extensions.has_GL_EXT_memory_object_fd) { TRACE( "GL_EXT_memory_object_fd is not supported\n" ); return FALSE; @@ -1213,7 +1207,7 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD struct opengl_client_context *client = opengl_client_context_from_client( ctx->base.client_context ); DWORD tid = HandleToULong(teb->ClientId.UniqueThread); size_t size = ARRAYSIZE(legacy_extensions) - 1, count = 0; - const char *version, *rest = "", **extensions; + const char *version, *rest = "", **extensions, *ext; int i, j; static const char *disabled, *enabled; @@ -1235,7 +1229,24 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD funcs->p_init_extensions( &ctx->base.extensions ); + if (ctx->major_version >= 3) + { + GLint num; + funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &num ); + for (GLint i = 0; i < num; i++) + { + ext = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + add_extension( &ctx->base.extensions, ext, strlen( ext ), TRUE ); + } + } + else if ((ext = (const char *)funcs->p_glGetString( GL_EXTENSIONS ))) + { + parse_extensions( &ctx->base.extensions, ext, TRUE ); + } + dump_extensions( "Host", &ctx->base.extensions ); + #define USE_GL_EXT(x) if (enabled_extensions.has_ ## x) client->extensions.has_ ## x = ctx->base.extensions.has_ ## x; + ALL_GL_CLIENT_EXTS ALL_WGL_EXTS #undef USE_GL_EXT @@ -1245,13 +1256,6 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD if (ctx->major_version >= 3) { GLint extensions_count; - - if (!funcs->p_glGetStringi) - { - void **func_ptr = (void **)&funcs->p_glGetStringi; - *func_ptr = funcs->p_wglGetProcAddress( "glGetStringi" ); - } - funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); size += extensions_count; if (!(extensions = malloc( size * sizeof(*extensions) ))) return; @@ -1298,15 +1302,24 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD count = j; } - if (funcs->p_glImportMemoryWin32HandleEXT) extensions[count++] = "GL_EXT_memory_object_win32"; - if (funcs->p_glImportSemaphoreWin32HandleEXT) extensions[count++] = "GL_EXT_semaphore_win32"; + if (funcs->p_glImportMemoryWin32HandleEXT) + { + client->extensions.has_GL_EXT_memory_object_win32 = 1; + extensions[count++] = "GL_EXT_memory_object_win32"; + } + if (funcs->p_glImportSemaphoreWin32HandleEXT) + { + client->extensions.has_GL_EXT_semaphore_win32 = 1; + extensions[count++] = "GL_EXT_semaphore_win32"; + } + for (i = 0; legacy_extensions[i]; i++) extensions[count++] = legacy_extensions[i]; qsort( extensions, count, sizeof(*extensions), string_array_cmp ); ctx->extension_array = extensions; ctx->extension_count = count; if (is_win64 && ctx->buffers && !initialize_vk_device( teb, ctx ) - && !(ctx->use_pinned_memory = is_extension_supported( ctx, "GL_AMD_pinned_memory" ))) + && !(ctx->use_pinned_memory = ctx->base.extensions.has_GL_AMD_pinned_memory)) { if (ctx->major_version > 4 || (ctx->major_version == 4 && ctx->minor_version > 3)) { @@ -1325,6 +1338,11 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD } extensions[j++] = ext; } + if (client->extensions.has_GL_ARB_buffer_storage) + { + FIXME( "Disabling has_GL_ARB_buffer_storage extension on wow64\n" ); + client->extensions.has_GL_ARB_buffer_storage = 0; + } ctx->extension_count = j; } diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index 225b3fe1c8a..a65e791c534 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -2674,6 +2674,7 @@ static void display_funcs_init(void) USE_GL_FUNC(glDeleteFramebuffers) USE_GL_FUNC(glDeleteRenderbuffers) USE_GL_FUNC(glGetNamedFramebufferAttachmentParameteriv) + USE_GL_FUNC(glGetStringi) USE_GL_FUNC(glGetUnsignedBytei_vEXT) USE_GL_FUNC(glGetUnsignedBytevEXT) USE_GL_FUNC(glImportMemoryFdEXT) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10019