summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdel Gadllah <adel.gadllah@gmail.com>2015-07-26 11:29:10 +0200
committerAdel Gadllah <adel.gadllah@gmail.com>2015-07-26 16:05:07 +0200
commit9a510c011746ba7e0d258c76302e83e16e371ec7 (patch)
treed7e538c3db78ed04e5be087033113e1ba149a016
parent40f6a0135e9007c1830aa6e35b65399ce897e0fc (diff)
downloadclutter-9a510c011746ba7e0d258c76302e83e16e371ec7.tar.gz
backend: Check for a known set of drivers
We want to use the Cogl GL3 driver, if possible, and then go through a known list of Cogl drivers, before giving up and using COGL_DRIVER_ANY. Based on original patch from Emmanuele Bassi. We have to create and tear down the whole context when trying out the drivers though because the extension checks do not happen until cogl_context_init. https://bugzilla.gnome.org/show_bug.cgi?id=742678
-rw-r--r--clutter/clutter-backend.c69
1 files changed, 56 insertions, 13 deletions
diff --git a/clutter/clutter-backend.c b/clutter/clutter-backend.c
index 04079518a..e1d2336c2 100644
--- a/clutter/clutter-backend.c
+++ b/clutter/clutter-backend.c
@@ -243,8 +243,9 @@ clutter_backend_real_font_changed (ClutterBackend *backend)
}
static gboolean
-clutter_backend_real_create_context (ClutterBackend *backend,
- GError **error)
+clutter_backend_do_real_create_context (ClutterBackend *backend,
+ CoglDriver driver_id,
+ GError **error)
{
ClutterBackendClass *klass;
CoglSwapChain *swap_chain;
@@ -276,6 +277,7 @@ clutter_backend_real_create_context (ClutterBackend *backend,
#endif
CLUTTER_NOTE (BACKEND, "Connecting the renderer");
+ cogl_renderer_set_driver (backend->cogl_renderer, driver_id);
if (!cogl_renderer_connect (backend->cogl_renderer, &internal_error))
goto error;
@@ -332,10 +334,6 @@ clutter_backend_real_create_context (ClutterBackend *backend,
if (backend->cogl_context == NULL)
goto error;
- backend->cogl_source = cogl_glib_source_new (backend->cogl_context,
- G_PRIORITY_DEFAULT);
- g_source_attach (backend->cogl_source, NULL);
-
/* the display owns the renderer and the swap chain */
cogl_object_unref (backend->cogl_renderer);
cogl_object_unref (swap_chain);
@@ -358,16 +356,61 @@ error:
if (swap_chain != NULL)
cogl_object_unref (swap_chain);
- if (internal_error != NULL)
- g_propagate_error (error, internal_error);
- else
- g_set_error_literal (error, CLUTTER_INIT_ERROR,
- CLUTTER_INIT_ERROR_BACKEND,
- _("Unable to initialize the Clutter backend"));
-
return FALSE;
}
+static gboolean
+clutter_backend_real_create_context (ClutterBackend *backend,
+ GError **error)
+{
+ static const struct {
+ const char *driver_name;
+ CoglDriver driver_id;
+ } known_drivers[] = {
+ { "GL3", COGL_DRIVER_GL3 },
+ { "GL (Legacy)", COGL_DRIVER_GL },
+ { "GLES 2.0", COGL_DRIVER_GLES2 },
+ { "ANY", COGL_DRIVER_ANY },
+ };
+
+ GError *internal_error = NULL;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (known_drivers); i++)
+ {
+ CLUTTER_NOTE (BACKEND, "Checking for the %s driver", known_drivers[i].driver_name);
+
+ if (clutter_backend_do_real_create_context (backend, known_drivers[i].driver_id, &internal_error))
+ break;
+
+ if (internal_error)
+ {
+ CLUTTER_NOTE (BACKEND, "Unable to use the %s driver: %s",
+ known_drivers[i].driver_name,
+ internal_error->message);
+ g_clear_error (&internal_error);
+ }
+ }
+
+ if (backend->cogl_context == NULL)
+ {
+ if (internal_error != NULL)
+ g_propagate_error (error, internal_error);
+ else
+ g_set_error_literal (error, CLUTTER_INIT_ERROR,
+ CLUTTER_INIT_ERROR_BACKEND,
+ _("Unable to initialize the Clutter backend"));
+
+ return FALSE;
+ }
+
+ backend->cogl_source = cogl_glib_source_new (backend->cogl_context,
+ G_PRIORITY_DEFAULT);
+ g_source_attach (backend->cogl_source, NULL);
+
+ return TRUE;
+}
+
static void
clutter_backend_real_ensure_context (ClutterBackend *backend,
ClutterStage *stage)