[PATCH 0/1] MR11197: opengl32: Only query GL_CONTEXT_PROFILE_MASK with GL >= 3.2.
From: Rémi Bernon <rbernon@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59880 --- dlls/opengl32/unix_wgl.c | 5 ++++- dlls/opengl32/wgl.c | 16 ++++++++++++++-- include/wine/opengl_driver.h | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index d11188ddfaf..9786a32e209 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1060,7 +1060,6 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD TRACE( "context %p version %d.%d\n", ctx, client->major_version, client->minor_version ); funcs->p_init_extensions( client->extensions ); - funcs->p_glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &client->profile_mask ); if (client->major_version >= 3) { @@ -1072,6 +1071,10 @@ static void make_context_current( TEB *teb, const struct opengl_funcs *funcs, HD enum opengl_extension ext = parse_extension( name, strlen( name ) ); if (ext != GL_EXTENSION_COUNT) client->extensions[ext] = TRUE; } + + if (client->major_version > 3 || client->minor_version > 1) + funcs->p_glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &client->profile_mask ); + funcs->p_glGetIntegerv( GL_CONTEXT_FLAGS, &client->context_flags ); } else { diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index caef0cd490e..40f5ca81815 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -639,6 +639,15 @@ static void alloc_client_objects( struct context *ctx, enum object_type type, UI ReleaseSRWLockExclusive( &table->lock ); } +static BOOL is_core_context( struct opengl_client_context *ctx ) +{ + if (ctx->major_version < 3) return FALSE; + if (ctx->major_version > 3) return !!(ctx->profile_mask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB); + if (ctx->minor_version > 1) return !!(ctx->profile_mask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB); + if (ctx->minor_version == 1) return !ctx->extensions[GL_ARB_compatibility]; + return !!(ctx->context_flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT); +} + BOOL alloc_context_objects( enum object_type type, UINT n, const GLuint *handles, BOOL extension ) { BOOL alloc_client, needs_client = FALSE; @@ -652,7 +661,7 @@ BOOL alloc_context_objects( enum object_type type, UINT n, const GLuint *handles switch (type) { case OBJ_TYPE_DISPLAY_LIST: - if (ctx->base.profile_mask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB) return FALSE; + if (is_core_context( &ctx->base )) return FALSE; alloc_client = TRUE; break; case OBJ_TYPE_FRAMEBUFFER: @@ -670,7 +679,7 @@ BOOL alloc_context_objects( enum object_type type, UINT n, const GLuint *handles alloc_client = FALSE; break; default: - alloc_client = !(ctx->base.profile_mask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB); + alloc_client = !is_core_context( &ctx->base ); break; } @@ -2653,6 +2662,9 @@ BOOL get_integer( GLenum name, GLuint index, GLint value, GLint *data ) switch (name) { + case GL_CONTEXT_FLAGS: + *data = ctx->base.context_flags; + return TRUE; case GL_CONTEXT_PROFILE_MASK: *data = ctx->base.profile_mask; return TRUE; diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index 3a4e7347b20..2320c84efc5 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -75,6 +75,7 @@ struct opengl_client_context UINT64 unix_funcs; DWORD current_tid; /* thread that the context is current in */ GLenum last_error; + GLint context_flags; GLint profile_mask; int major_version; int minor_version; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11197
participants (2)
-
Rémi Bernon -
Rémi Bernon (@rbernon)