Revert "clutter: Drop CLUTTER_DRIVER env variable"

This reverts commit 7d376dfddc386ae01da8c4dafbb4fc6080642253.

Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/3923

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4312>
This commit is contained in:
Robert Mader 2025-03-02 00:23:29 +01:00 committed by Marge Bot
parent 9d5f8d464e
commit 6c05ec7ded

View File

@ -165,8 +165,9 @@ clutter_backend_real_resolution_changed (ClutterBackend *backend)
#endif
static gboolean
clutter_backend_real_create_context (ClutterBackend *backend,
GError **error)
clutter_backend_do_real_create_context (ClutterBackend *backend,
CoglDriverId driver_id,
GError **error)
{
ClutterBackendClass *klass;
@ -180,6 +181,7 @@ clutter_backend_real_create_context (ClutterBackend *backend,
goto error;
CLUTTER_NOTE (BACKEND, "Connecting the renderer");
cogl_renderer_set_driver (backend->cogl_renderer, driver_id);
if (!cogl_renderer_connect (backend->cogl_renderer, error))
goto error;
@ -201,9 +203,6 @@ clutter_backend_real_create_context (ClutterBackend *backend,
/* the display owns the renderer and the swap chain */
g_object_unref (backend->cogl_renderer);
backend->cogl_source = cogl_glib_source_new (backend->cogl_renderer, G_PRIORITY_DEFAULT);
g_source_attach (backend->cogl_source, NULL);
return TRUE;
error:
@ -213,6 +212,80 @@ error:
return FALSE;
}
static const struct {
const char *driver_name;
const char *driver_desc;
CoglDriverId driver_id;
} all_known_drivers[] = {
{ "gl3", "OpenGL 3.1 core profile", COGL_DRIVER_ID_GL3 },
{ "gles2", "OpenGL ES 2.0", COGL_DRIVER_ID_GLES2 },
{ "any", "Default Cogl driver", COGL_DRIVER_ID_ANY },
};
static gboolean
clutter_backend_real_create_context (ClutterBackend *backend,
GError **error)
{
GError *internal_error = NULL;
const char *drivers_list;
char **known_drivers;
int i;
if (backend->cogl_context != NULL)
return TRUE;
drivers_list = g_getenv ("CLUTTER_DRIVER");
if (drivers_list == NULL)
drivers_list = "*";
known_drivers = g_strsplit (drivers_list, ",", 0);
for (i = 0; backend->cogl_context == NULL && known_drivers[i] != NULL; i++)
{
const char *driver_name = known_drivers[i];
gboolean is_any = g_str_equal (driver_name, "*");
int j;
for (j = 0; j < G_N_ELEMENTS (all_known_drivers); j++)
{
if (is_any ||
g_str_equal (all_known_drivers[j].driver_name, driver_name))
{
CLUTTER_NOTE (BACKEND, "Checking for the %s driver", all_known_drivers[j].driver_desc);
if (clutter_backend_do_real_create_context (backend, all_known_drivers[j].driver_id, &internal_error))
break;
if (internal_error)
{
CLUTTER_NOTE (BACKEND, "Unable to use the %s driver: %s",
all_known_drivers[j].driver_desc,
internal_error->message);
g_clear_error (&internal_error);
}
}
}
}
g_strfreev (known_drivers);
if (backend->cogl_context == NULL)
{
if (internal_error != NULL)
g_propagate_error (error, internal_error);
else
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Unable to initialize the Clutter backend: no available drivers found.");
return FALSE;
}
backend->cogl_source = cogl_glib_source_new (backend->cogl_renderer, G_PRIORITY_DEFAULT);
g_source_attach (backend->cogl_source, NULL);
return TRUE;
}
static void
clutter_backend_class_init (ClutterBackendClass *klass)
{