[Cogl] [PATCH 4/4] cogland: Try forcing an EGL context
Robert Bragg
robert at sixbynine.org
Thu Apr 11 10:12:37 PDT 2013
This series of patches looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Thu, Apr 11, 2013 at 5:11 PM, Neil Roberts <neil at linux.intel.com> wrote:
> Cogland works a lot better with an EGL context because then Mesa will
> automatically set up the wl_drm object and it can accept DRM buffers.
> However Cogland is still useful with GLX because it can gracefully
> fallback to accepting only SHM buffers. This patch therefore makes it
> first try creating and connecting a renderer with the EGL constraint,
> but if that doesn't work it will try again without it.
> ---
> examples/cogland.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 54 insertions(+), 8 deletions(-)
>
> diff --git a/examples/cogland.c b/examples/cogland.c
> index eb18011..e6d31b3 100644
> --- a/examples/cogland.c
> +++ b/examples/cogland.c
> @@ -93,7 +93,6 @@ struct _CoglandCompositor
> struct wl_display *wayland_display;
> struct wl_event_loop *wayland_loop;
>
> - CoglDisplay *cogl_display;
> CoglContext *cogl_context;
>
> int virtual_width;
> @@ -1014,6 +1013,36 @@ bind_shell (struct wl_client *client,
> &cogland_shell_interface, id, data);
> }
>
> +static CoglContext *
> +create_cogl_context (CoglandCompositor *compositor,
> + CoglBool use_egl_constraint,
> + CoglError **error)
> +{
> + CoglRenderer *renderer = renderer = cogl_renderer_new ();
> + CoglDisplay *display;
> + CoglContext *context;
> +
> + if (use_egl_constraint)
> + cogl_renderer_add_constraint (renderer, COGL_RENDERER_CONSTRAINT_USES_EGL);
> +
> + if (!cogl_renderer_connect (renderer, error))
> + {
> + cogl_object_unref (renderer);
> + return NULL;
> + }
> +
> + display = cogl_display_new (renderer, NULL);
> + cogl_wayland_display_set_compositor_display (display,
> + compositor->wayland_display);
> +
> + context = cogl_context_new (display, error);
> +
> + cogl_object_unref (renderer);
> + cogl_object_unref (display);
> +
> + return context;
> +}
> +
> int
> main (int argc, char **argv)
> {
> @@ -1057,13 +1086,30 @@ main (int argc, char **argv)
> wayland_event_source_new (compositor.wayland_display);
> g_source_attach (compositor.wayland_event_source, NULL);
>
> - compositor.cogl_display = cogl_display_new (NULL, NULL);
> - cogl_wayland_display_set_compositor_display (compositor.cogl_display,
> - compositor.wayland_display);
> -
> - compositor.cogl_context = cogl_context_new (compositor.cogl_display, &error);
> - if (!compositor.cogl_context)
> - g_error ("Failed to create a Cogl context: %s\n", error->message);
> + /* We want Cogl to use an EGL renderer because otherwise it won't
> + * set up the wl_drm object and only SHM buffers will work. */
> + compositor.cogl_context =
> + create_cogl_context (&compositor,
> + TRUE /* use EGL constraint */,
> + &error);
> + if (compositor.cogl_context == NULL)
> + {
> + /* If we couldn't get an EGL context then try any type of
> + * context */
> + cogl_error_free (error);
> + error = NULL;
> +
> + compositor.cogl_context =
> + create_cogl_context (&compositor,
> + FALSE, /* don't set EGL constraint */
> + &error);
> +
> + if (compositor.cogl_context)
> + g_warning ("Failed to create context with EGL constraint, "
> + "falling back");
> + else
> + g_error ("Failed to create a Cogl context: %s\n", error->message);
> + }
>
> compositor.virtual_width = 800;
> compositor.virtual_height = 600;
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list