gl: Add GDK_GL_DISABLE env var

This allows disabling certain GL features for testing, same as with
Vulkan.
This commit is contained in:
Benjamin Otte 2024-03-16 12:36:51 +01:00
parent d6a1eb1b2f
commit 3a04542146
2 changed files with 60 additions and 14 deletions

View File

@ -347,6 +347,28 @@ a `*`, which means: try all remaining backends. The special value
backends. For more information about selecting backends, backends. For more information about selecting backends,
see the [func@Gdk.DisplayManager.get] function. see the [func@Gdk.DisplayManager.get] function.
### `GDK_GL_DISABLE`
This variable can be set to a list of values, which cause GDK to
disable extension features of the OpenGL support.
Note that these features may already be disabled if the GL driver
does not support them.
`debug`
: GL_KHR_debug
`unpack-subimage`
:GL_EXT_unpack_subimage
`half-float`
:GL_OES_vertex_half_float
`sync`
:GL_ARB_sync
`bgra`
:GL_EXT_texture_format_BGRA8888
### `GDK_VULKAN_DEVICE` ### `GDK_VULKAN_DEVICE`
This variable can be set to the index of a Vulkan device to override This variable can be set to the index of a Vulkan device to override

View File

@ -103,6 +103,14 @@
#define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES #define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES
static const GdkDebugKey gdk_gl_feature_keys[] = {
{ "debug", GDK_GL_FEATURE_DEBUG, "GL_KHR_debug" },
{ "unpack-subimage", GDK_GL_FEATURE_UNPACK_SUBIMAGE, "GL_EXT_unpack_subimage" },
{ "half-float", GDK_GL_FEATURE_VERTEX_HALF_FLOAT, "GL_OES_vertex_half_float" },
{ "sync", GDK_GL_FEATURE_SYNC, "GL_ARB_sync" },
{ "bgra", GDK_GL_FEATURE_BGRA, "GL_EXT_texture_format_BGRA8888" },
};
typedef struct _GdkGLContextPrivate GdkGLContextPrivate; typedef struct _GdkGLContextPrivate GdkGLContextPrivate;
struct _GdkGLContextPrivate struct _GdkGLContextPrivate
@ -1699,6 +1707,7 @@ static void
gdk_gl_context_check_extensions (GdkGLContext *context) gdk_gl_context_check_extensions (GdkGLContext *context)
{ {
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
GdkGLFeatures supported_features, disabled_features;
gboolean gl_debug = FALSE; gboolean gl_debug = FALSE;
GdkDisplay *display; GdkDisplay *display;
@ -1726,7 +1735,12 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
!gdk_gl_version_greater_equal (&priv->gl_version, &GDK_GL_VERSION_INIT (3, 2))) !gdk_gl_version_greater_equal (&priv->gl_version, &GDK_GL_VERSION_INIT (3, 2)))
priv->is_legacy = TRUE; priv->is_legacy = TRUE;
priv->features = gdk_gl_context_check_features (context); supported_features = gdk_gl_context_check_features (context);
disabled_features = gdk_parse_debug_var ("GDK_GL_DISABLE",
gdk_gl_feature_keys,
G_N_ELEMENTS (gdk_gl_feature_keys));
priv->features = supported_features & ~disabled_features;
gdk_gl_context_init_memory_flags (context); gdk_gl_context_init_memory_flags (context);
@ -1736,19 +1750,29 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
glGetIntegerv (GL_MAX_LABEL_LENGTH, &priv->max_debug_label_length); glGetIntegerv (GL_MAX_LABEL_LENGTH, &priv->max_debug_label_length);
} }
{ if (GDK_DISPLAY_DEBUG_CHECK (display, OPENGL))
int max_texture_size; {
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_texture_size); int i, max_texture_size;
GDK_DISPLAY_DEBUG (gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context)), OPENGL, glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_texture_size);
"%s version: %d.%d (%s)\n" gdk_debug_message ("%s version: %d.%d (%s)\n"
"* GLSL version: %s\n" "* GLSL version: %s\n"
"* Max texture size: %d\n", "* Max texture size: %d\n",
gdk_gl_context_get_use_es (context) ? "OpenGL ES" : "OpenGL", gdk_gl_context_get_use_es (context) ? "OpenGL ES" : "OpenGL",
gdk_gl_version_get_major (&priv->gl_version), gdk_gl_version_get_minor (&priv->gl_version), gdk_gl_version_get_major (&priv->gl_version), gdk_gl_version_get_minor (&priv->gl_version),
priv->is_legacy ? "legacy" : "core", priv->is_legacy ? "legacy" : "core",
glGetString (GL_SHADING_LANGUAGE_VERSION), glGetString (GL_SHADING_LANGUAGE_VERSION),
max_texture_size); max_texture_size);
} gdk_debug_message ("Enabled features (use GDK_GL_DISABLE env var to disable):");
for (i = 0; i < G_N_ELEMENTS (gdk_gl_feature_keys); i++)
{
gdk_debug_message (" %s: %s",
gdk_gl_feature_keys[i].key,
(priv->features & gdk_gl_feature_keys[i].value) ? "YES" :
((disabled_features & gdk_gl_feature_keys[i].value) ? "disabled via env var" :
(((supported_features & gdk_gl_feature_keys[i].value) == 0) ? "not supported" :
"Hum, what? This should not happen.")));
}
}
priv->extensions_checked = TRUE; priv->extensions_checked = TRUE;
} }