gl-renderer: Take a list of acceptable formats in create functions
authorDerek Foreman <derekf@osg.samsung.com>
Fri, 15 May 2015 17:12:39 +0000 (12:12 -0500)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Mon, 18 May 2015 08:51:45 +0000 (11:51 +0300)
Currently we pass either a single format or no formats to the gl renderer
create and output_create functions.  We extend this to any number of
formats so we can allow fallback formats if we don't get our first pick.

Reviewed-By: Bryce Harrington <bryce@osg.samsung.com>
Reviewed-By: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
src/compositor-drm.c
src/compositor-fbdev.c
src/compositor-wayland.c
src/compositor-x11.c
src/gl-renderer.c
src/gl-renderer.h

index 0cdb8f47a58bced016450c7c34fabf9b7248b1f8..69bdcfdd256bfeedc140b4fc0b139a86e36964d3 100644 (file)
@@ -1398,7 +1398,7 @@ drm_compositor_create_gl_renderer(struct drm_compositor *ec)
 
        format = ec->format;
        if (gl_renderer->create(&ec->base, EGL_PLATFORM_GBM_KHR, (void *) ec->gbm,
-                              gl_renderer->opaque_attribs, &format) < 0) {
+                              gl_renderer->opaque_attribs, &format, 1) < 0) {
                return -1;
        }
 
@@ -1620,7 +1620,8 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec)
                                       (EGLNativeDisplayType)output->surface,
                                       output->surface,
                                       gl_renderer->opaque_attribs,
-                                      &format) < 0) {
+                                      &format,
+                                      1) < 0) {
                weston_log("failed to create gl renderer output state\n");
                gbm_surface_destroy(output->surface);
                return -1;
index 7c505ce8c7935547ad98431f6818120e07f08df5..3f3394f15307d8fd447f56c9676fc6ad97a737e5 100644 (file)
@@ -570,7 +570,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
                if (gl_renderer->output_create(&output->base,
                                               (EGLNativeWindowType)NULL, NULL,
                                               gl_renderer->opaque_attribs,
-                                              NULL) < 0) {
+                                              NULL, 0) < 0) {
                        weston_log("gl_renderer_output_create failed.\n");
                        goto out_shadow_surface;
                }
@@ -871,7 +871,7 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
                if (gl_renderer->create(&compositor->base, NO_EGL_PLATFORM,
                                        EGL_DEFAULT_DISPLAY,
                                        gl_renderer->opaque_attribs,
-                                       NULL) < 0) {
+                                       NULL, 0) < 0) {
                        weston_log("gl_renderer_create failed.\n");
                        goto out_launcher;
                }
index 303151c4be0f1374fbc295bf2149ab5cfd7f5a6a..c9983e012fc33ca471d404b3d0eb500936e8d383 100644 (file)
@@ -648,7 +648,8 @@ wayland_output_init_gl_renderer(struct wayland_output *output)
                                       output->gl.egl_window,
                                       output->gl.egl_window,
                                       gl_renderer->alpha_attribs,
-                                      NULL) < 0)
+                                      NULL,
+                                      0) < 0)
                goto cleanup_window;
 
        return 0;
@@ -1970,10 +1971,11 @@ wayland_compositor_create(struct wl_display *display, int use_pixman,
 
        if (!c->use_pixman) {
                if (gl_renderer->create(&c->base,
-                                              EGL_PLATFORM_WAYLAND_KHR,
-                                              c->parent.wl_display,
-                                              gl_renderer->alpha_attribs,
-                                              NULL) < 0) {
+                                       EGL_PLATFORM_WAYLAND_KHR,
+                                       c->parent.wl_display,
+                                       gl_renderer->alpha_attribs,
+                                       NULL,
+                                       0) < 0) {
                        weston_log("Failed to initialize the GL renderer; "
                                   "falling back to pixman.\n");
                        c->use_pixman = 1;
index 5129e852b2162d3c62f6b377b1bd7772e973d1f1..356567775883ccf298ff8dfd83762025817fbf5c 100644 (file)
@@ -906,7 +906,8 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y,
                                                 (EGLNativeWindowType) output->window,
                                                 &xid,
                                                 gl_renderer->opaque_attribs,
-                                                NULL);
+                                                NULL,
+                                                0);
                if (ret < 0)
                        return NULL;
        }
@@ -1493,7 +1494,7 @@ init_gl_renderer(struct x11_compositor *c)
                return -1;
 
        ret = gl_renderer->create(&c->base, EGL_PLATFORM_X11_KHR, (void *) c->dpy,
-                                 gl_renderer->opaque_attribs, NULL);
+                                 gl_renderer->opaque_attribs, NULL, 0);
 
        return ret;
 }
index ae3122f32b0cc5fab0bf90b849caef689e2ff497..248c8aac6e06ba606d863bb2ef05e66b75cf064a 100644 (file)
@@ -1897,15 +1897,39 @@ log_egl_config_info(EGLDisplay egldpy, EGLConfig eglconfig)
                weston_log_continue(" unknown\n");
 }
 
+static int
+match_config_to_visual(EGLDisplay egl_display,
+                      EGLint visual_id,
+                      EGLConfig *configs,
+                      int count)
+{
+       int i;
+
+       for (i = 0; i < count; ++i) {
+               EGLint id;
+
+               if (!eglGetConfigAttrib(egl_display,
+                               configs[i], EGL_NATIVE_VISUAL_ID,
+                               &id))
+                       continue;
+
+               if (id == visual_id)
+                       return i;
+       }
+
+       weston_log("Unable to find an appropriate EGL config.\n");
+       return -1;
+}
+
 static int
 egl_choose_config(struct gl_renderer *gr, const EGLint *attribs,
-                 const EGLint *visual_id,
+                 const EGLint *visual_id, const int n_ids,
                  EGLConfig *config_out)
 {
        EGLint count = 0;
        EGLint matched = 0;
        EGLConfig *configs;
-       int i;
+       int i, config_index = -1;
 
        if (!eglGetConfigs(gr->egl_display, NULL, 0, &count) || count < 1)
                return -1;
@@ -1915,31 +1939,27 @@ egl_choose_config(struct gl_renderer *gr, const EGLint *attribs,
                return -1;
 
        if (!eglChooseConfig(gr->egl_display, attribs, configs,
-                             count, &matched))
+                             count, &matched) || !matched)
                goto out;
 
-       for (i = 0; i < matched; ++i) {
-               EGLint id;
+       if (!visual_id)
+               config_index = 0;
 
-               if (visual_id) {
-                       if (!eglGetConfigAttrib(gr->egl_display,
-                                       configs[i], EGL_NATIVE_VISUAL_ID,
-                                       &id))
-                               continue;
+       for (i = 0; config_index == -1 && i < n_ids; i++)
+               config_index = match_config_to_visual(gr->egl_display,
+                                                     visual_id[i],
+                                                     configs,
+                                                     matched);
 
-                       if (id != 0 && id != *visual_id)
-                               continue;
-               }
-
-               *config_out = configs[i];
-
-               free(configs);
-               return 0;
-       }
+       if (config_index != -1)
+               *config_out = configs[config_index];
 
 out:
        free(configs);
-       return -1;
+       if (config_index == -1)
+               return -1;
+
+       return 0;
 }
 
 static void
@@ -1976,7 +1996,8 @@ gl_renderer_output_create(struct weston_output *output,
                          EGLNativeWindowType window_for_legacy,
                          void *window_for_platform,
                          const EGLint *attribs,
-                         const EGLint *visual_id)
+                         const EGLint *visual_id,
+                         int n_ids)
 {
        struct weston_compositor *ec = output->compositor;
        struct gl_renderer *gr = get_renderer(ec);
@@ -1984,7 +2005,8 @@ gl_renderer_output_create(struct weston_output *output,
        EGLConfig egl_config;
        int i;
 
-       if (egl_choose_config(gr, attribs, visual_id, &egl_config) == -1) {
+       if (egl_choose_config(gr, attribs, visual_id,
+                             n_ids, &egl_config) == -1) {
                weston_log("failed to choose EGL config for output\n");
                return -1;
        }
@@ -2260,7 +2282,7 @@ platform_to_extension(EGLenum platform)
 static int
 gl_renderer_create(struct weston_compositor *ec, EGLenum platform,
        void *native_window, const EGLint *attribs,
-       const EGLint *visual_id)
+       const EGLint *visual_id, int n_ids)
 {
        struct gl_renderer *gr;
        EGLint major, minor;
@@ -2323,7 +2345,8 @@ gl_renderer_create(struct weston_compositor *ec, EGLenum platform,
                goto err_egl;
        }
 
-       if (egl_choose_config(gr, attribs, visual_id, &gr->egl_config) < 0) {
+       if (egl_choose_config(gr, attribs, visual_id,
+                             n_ids, &gr->egl_config) < 0) {
                weston_log("failed to choose EGL config\n");
                goto err_egl;
        }
index ebc139f8f8a73367f38f3e656fe40e2fa4d874fc..ceb42062391210ca8d4e8ed1b75d0bfdf9dcd037 100644 (file)
@@ -76,7 +76,8 @@ struct gl_renderer_interface {
                      EGLenum platform,
                      void *native_window,
                      const EGLint *attribs,
-                     const EGLint *visual_id);
+                     const EGLint *visual_id,
+                     const int n_ids);
 
        EGLDisplay (*display)(struct weston_compositor *ec);
 
@@ -84,7 +85,8 @@ struct gl_renderer_interface {
                             EGLNativeWindowType window_for_legacy,
                             void *window_for_platform,
                             const EGLint *attribs,
-                            const EGLint *visual_id);
+                            const EGLint *visual_id,
+                            const int n_ids);
 
        void (*output_destroy)(struct weston_output *output);