gdk/backend: Use the context creation hooks

Same as it has happened to the X11 backend.
This commit is contained in:
Emmanuele Bassi 2011-11-04 15:54:58 +00:00
parent 68e8ef0103
commit 6ec7a28802

View File

@ -264,25 +264,19 @@ clutter_backend_gdk_get_device_manager (ClutterBackend *backend)
return backend_gdk->device_manager; return backend_gdk->device_manager;
} }
static gboolean static CoglRenderer *
clutter_backend_gdk_create_context (ClutterBackend *backend, clutter_backend_gdk_get_renderer (ClutterBackend *backend,
GError **error) GError **error)
{ {
ClutterBackendGdk *backend_gdk = CLUTTER_BACKEND_GDK (backend); ClutterBackendGdk *backend_gdk = CLUTTER_BACKEND_GDK (backend);
CoglSwapChain *swap_chain = NULL; CoglRenderer *renderer = cogl_renderer_new ();
CoglOnscreenTemplate *onscreen_template = NULL;
GdkVisual *rgba_visual = NULL;
if (backend->cogl_context != NULL)
return TRUE;
backend->cogl_renderer = cogl_renderer_new ();
#if defined(GDK_WINDOWING_X11) && defined(COGL_HAS_XLIB_SUPPORT) #if defined(GDK_WINDOWING_X11) && defined(COGL_HAS_XLIB_SUPPORT)
if (GDK_IS_X11_DISPLAY (backend_gdk->display)) if (GDK_IS_X11_DISPLAY (backend_gdk->display))
{ {
cogl_xlib_renderer_set_foreign_display (backend->cogl_renderer, Display *xdisplay = gdk_x11_display_get_xdisplay (backend_gdk->display);
gdk_x11_display_get_xdisplay (backend_gdk->display));
cogl_xlib_renderer_set_foreign_display (renderer, xdisplay);
} }
else else
#endif #endif
@ -297,65 +291,79 @@ clutter_backend_gdk_create_context (ClutterBackend *backend,
{ {
g_set_error (error, CLUTTER_INIT_ERROR, g_set_error (error, CLUTTER_INIT_ERROR,
CLUTTER_INIT_ERROR_BACKEND, CLUTTER_INIT_ERROR_BACKEND,
"Could not find a suitable CoglWinsys for" _("Could not find a suitable CoglWinsys for a GdkDisplay of type %s"),
"a GdkDisplay of type %s", G_OBJECT_TYPE_NAME (backend_gdk->display)); G_OBJECT_TYPE_NAME (backend_gdk->display));
goto error; cogl_object_unref (renderer);
return NULL;
} }
return renderer;
}
if (!cogl_renderer_connect (backend->cogl_renderer, error)) static CoglDisplay *
goto error; clutter_backend_gdk_get_display (ClutterBackend *backend,
CoglRenderer *renderer,
CoglSwapChain *swap_chain,
GError **error)
{
ClutterBackendGdk *backend_gdk = CLUTTER_BACKEND_GDK (backend);
CoglOnscreenTemplate *onscreen_template;
GError *internal_error = NULL;
CoglDisplay *display;
gboolean has_rgba_visual;
gboolean res;
swap_chain = cogl_swap_chain_new (); has_rgba_visual = gdk_screen_get_rgba_visual (backend_gdk->screen) == NULL;
rgba_visual = gdk_screen_get_rgba_visual (backend_gdk->screen); CLUTTER_NOTE (BACKEND, "Alpha on Cogl swap chain: %s",
cogl_swap_chain_set_has_alpha (swap_chain, rgba_visual != NULL); has_rgba_visual ? "enabled" : "disabled");
cogl_swap_chain_set_has_alpha (swap_chain, has_rgba_visual);
onscreen_template = cogl_onscreen_template_new (swap_chain); onscreen_template = cogl_onscreen_template_new (swap_chain);
cogl_object_unref (swap_chain);
/* XXX: I have some doubts that this is a good design. res = cogl_renderer_check_onscreen_template (renderer,
* Conceptually should we be able to check an onscreen_template
* without more details about the CoglDisplay configuration?
*/
if (!cogl_renderer_check_onscreen_template (backend->cogl_renderer,
onscreen_template, onscreen_template,
error)) &internal_error);
goto error; if (!res && has_rgba_visual)
backend->cogl_display = cogl_display_new (backend->cogl_renderer,
onscreen_template);
cogl_object_unref (backend->cogl_renderer);
cogl_object_unref (onscreen_template);
if (!cogl_display_setup (backend->cogl_display, error))
goto error;
backend->cogl_context = cogl_context_new (backend->cogl_display, error);
if (backend->cogl_context == NULL)
goto error;
return TRUE;
error:
if (backend->cogl_display != NULL)
{ {
cogl_object_unref (backend->cogl_display); CLUTTER_NOTE (BACKEND,
backend->cogl_display = NULL; "Creation of a context with a ARGB visual failed: %s",
internal_error != NULL ? internal_error->message
: "Unknown reason");
g_clear_error (&internal_error);
/* It's possible that the current renderer doesn't support transparency
* in a swap_chain so lets see if we can fallback to not having any
* transparency...
*
* XXX: It might be nice to have a CoglRenderer feature we could
* explicitly check for ahead of time.
*/
cogl_swap_chain_set_has_alpha (swap_chain, FALSE);
res = cogl_renderer_check_onscreen_template (renderer,
onscreen_template,
&internal_error);
} }
if (onscreen_template != NULL) if (!res)
cogl_object_unref (onscreen_template);
if (swap_chain != NULL)
cogl_object_unref (swap_chain);
if (backend->cogl_renderer != NULL)
{ {
cogl_object_unref (backend->cogl_renderer); g_set_error_literal (error, CLUTTER_INIT_ERROR,
backend->cogl_renderer = NULL; CLUTTER_INIT_ERROR_BACKEND,
internal_error->message);
g_error_free (internal_error);
cogl_object_unref (onscreen_template);
return NULL;
} }
return FALSE;
display = cogl_display_new (renderer, onscreen_template);
cogl_object_unref (onscreen_template);
return display;
} }
static ClutterStageWindow * static ClutterStageWindow *
@ -383,7 +391,9 @@ clutter_backend_gdk_class_init (ClutterBackendGdkClass *klass)
backend_class->get_device_manager = clutter_backend_gdk_get_device_manager; backend_class->get_device_manager = clutter_backend_gdk_get_device_manager;
backend_class->copy_event_data = clutter_backend_gdk_copy_event_data; backend_class->copy_event_data = clutter_backend_gdk_copy_event_data;
backend_class->free_event_data = clutter_backend_gdk_free_event_data; backend_class->free_event_data = clutter_backend_gdk_free_event_data;
backend_class->create_context = clutter_backend_gdk_create_context;
backend_class->get_renderer = clutter_backend_gdk_get_renderer;
backend_class->get_display = clutter_backend_gdk_get_display;
backend_class->create_stage = clutter_backend_gdk_create_stage; backend_class->create_stage = clutter_backend_gdk_create_stage;
} }