From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/unix_wgl.c | 57 +++++++++++++++++++++++++++------------- dlls/win32u/opengl.c | 1 + 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 6fbc860231f..af088daf2cf 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[GL_EXT_memory_object_fd]) { TRACE( "GL_EXT_memory_object_fd is not supported\n" ); return FALSE; @@ -1245,9 +1239,11 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD static pthread_once_t once = PTHREAD_ONCE_INIT; struct opengl_client_context *client = opengl_client_context_from_client( ctx->base.client_context ); + enum opengl_extension parsed_extensions[GL_EXTENSION_COUNT] = {GL_EXTENSION_COUNT}; 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, *compat; + GLint num; int i, j; static const char *disabled, *enabled; @@ -1269,6 +1265,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) + { + funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &num ); + for (GLint i = 0; i < num; i++) + { + const char *name = (const char *)funcs->p_glGetStringi( GL_EXTENSIONS, i ); + enum opengl_extension ext = parse_extension( name, strlen( name ) ); + if (ext != GL_EXTENSION_COUNT) ctx->base.extensions[ext] = TRUE; + } + } + else if ((compat = (const char *)funcs->p_glGetString( GL_EXTENSIONS ))) + { + parse_extensions( parsed_extensions, compat ); + for (enum opengl_extension *ext = parsed_extensions; *ext != GL_EXTENSION_COUNT; ext++) + ctx->base.extensions[*ext++] = TRUE; + } + dump_extensions( "Host", ctx->base.extensions ); + for (UINT i = 0; i < ARRAY_SIZE(all_extensions); i++) { if (!enabled_extensions[i] || !all_extensions[i].exposed) client->extensions[i] = FALSE; @@ -1282,13 +1296,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; @@ -1335,15 +1342,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[GL_EXT_memory_object_win32] = 1; + extensions[count++] = "GL_EXT_memory_object_win32"; + } + if (funcs->p_glImportSemaphoreWin32HandleEXT) + { + client->extensions[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[GL_AMD_pinned_memory])) { if (ctx->major_version > 4 || (ctx->major_version == 4 && ctx->minor_version > 3)) { @@ -1362,6 +1378,11 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD } extensions[j++] = ext; } + if (client->extensions[GL_ARB_buffer_storage]) + { + FIXME( "Disabling has_GL_ARB_buffer_storage extension on wow64\n" ); + client->extensions[GL_ARB_buffer_storage] = FALSE; + } ctx->extension_count = j; } diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index b64013438ba..6bc4e363633 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