[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