In preparation for follow-on changes to support frame presentation
through EGLDevice+EGLOutput, this change refactors
gl_renderer_output_window_create() to separate out window surface
creation code from output common creation code.

Bonus: Fix EGLSurface leakage upon gl_renderer_setup() failure.

Signed-off-by: Miguel A Vico Moya <[email protected]>
Reviewed-by: Andy Ritger <[email protected]>
Reviewed-by: James Jones <[email protected]>
---
 src/gl-renderer.c | 96 ++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 64 insertions(+), 32 deletions(-)

diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 1d76488..c208f36 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -1,6 +1,7 @@
 /*
  * Copyright © 2012 Intel Corporation
  * Copyright © 2015 Collabora, Ltd.
+ * Copyright © 2016 NVIDIA Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -2546,24 +2547,21 @@ gl_renderer_output_set_border(struct weston_output 
*output,
 static int
 gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface);
 
-static int
-gl_renderer_output_window_create(struct weston_output *output,
+static EGLSurface
+gl_renderer_create_window_surface(struct gl_renderer *gr,
                          EGLNativeWindowType window_for_legacy,
                          void *window_for_platform,
                          const EGLint *config_attribs,
                          const EGLint *visual_id,
                          int n_ids)
 {
-       struct weston_compositor *ec = output->compositor;
-       struct gl_renderer *gr = get_renderer(ec);
-       struct gl_output_state *go;
+       EGLSurface egl_surface = EGL_NO_SURFACE;
        EGLConfig egl_config;
-       int i;
 
        if (egl_choose_config(gr, config_attribs, visual_id,
                              n_ids, &egl_config) == -1) {
                weston_log("failed to choose EGL config for output\n");
-               return -1;
+               return EGL_NO_SURFACE;
        }
 
        if (egl_config != gr->egl_config &&
@@ -2571,48 +2569,82 @@ gl_renderer_output_window_create(struct weston_output 
*output,
                weston_log("attempted to use a different EGL config for an "
                           "output but EGL_MESA_configless_context is not "
                           "supported\n");
-               return -1;
+               return EGL_NO_SURFACE;
        }
 
-       go = zalloc(sizeof *go);
-       if (go == NULL)
-               return -1;
+       log_egl_config_info(gr->egl_display, egl_config);
 
-       if (gr->create_platform_window) {
-               go->egl_surface =
-                       gr->create_platform_window(gr->egl_display,
-                                                  egl_config,
-                                                  window_for_platform,
-                                                  NULL);
-       } else {
-               go->egl_surface =
-                       eglCreateWindowSurface(gr->egl_display,
-                                              egl_config,
-                                              window_for_legacy, NULL);
-       }
+       if (gr->create_platform_window)
+               egl_surface = gr->create_platform_window(gr->egl_display,
+                                                        egl_config,
+                                                        window_for_platform,
+                                                        NULL);
+       else
+               egl_surface = eglCreateWindowSurface(gr->egl_display,
+                                                    egl_config,
+                                                    window_for_legacy, NULL);
 
-       if (go->egl_surface == EGL_NO_SURFACE) {
-               weston_log("failed to create egl surface\n");
-               free(go);
-               return -1;
-       }
+       return egl_surface;
+}
+
+static int
+gl_renderer_output_create(struct weston_output *output,
+                          EGLSurface surface)
+{
+       struct weston_compositor *ec = output->compositor;
+       struct gl_renderer *gr = get_renderer(ec);
+       struct gl_output_state *go;
+       int i;
 
        if (gr->egl_context == NULL)
-               if (gl_renderer_setup(ec, go->egl_surface) < 0) {
-                       free(go);
+               if (gl_renderer_setup(ec, surface) < 0) {
                        return -1;
                }
 
+       go = zalloc(sizeof *go);
+       if (go == NULL)
+               return -1;
+
+       go->egl_surface = surface;
+
        for (i = 0; i < BUFFER_DAMAGE_COUNT; i++)
                pixman_region32_init(&go->buffer_damage[i]);
 
        output->renderer_state = go;
 
-       log_egl_config_info(gr->egl_display, egl_config);
-
        return 0;
 }
 
+static int
+gl_renderer_output_window_create(struct weston_output *output,
+                                 EGLNativeWindowType window_for_legacy,
+                                 void *window_for_platform,
+                                 const EGLint *config_attribs,
+                                 const EGLint *visual_id,
+                                 int n_ids)
+{
+       struct weston_compositor *ec = output->compositor;
+       struct gl_renderer *gr = get_renderer(ec);
+       EGLSurface egl_surface = EGL_NO_SURFACE;
+       int ret = 0;
+
+       egl_surface = gl_renderer_create_window_surface(gr,
+                                                       window_for_legacy,
+                                                       window_for_platform,
+                                                       config_attribs,
+                                                       visual_id, n_ids);
+       if (egl_surface == EGL_NO_SURFACE) {
+               weston_log("failed to create egl surface\n");
+               return -1;
+       }
+
+       ret = gl_renderer_output_create(output, egl_surface);
+       if (ret < 0)
+               eglDestroySurface(gr->egl_display, egl_surface);
+
+       return ret;
+}
+
 static void
 gl_renderer_output_destroy(struct weston_output *output)
 {
-- 
2.8.0

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to