gl-renderer: Refactor gl_renderer_output_window_create()
This change refactors gl_renderer_output_window_create() to separate out
window surface creation code from output common creation code.
Signed-off-by: Miguel A Vico Moya <mvicomoya@nvidia.com>
Reviewed-by: Andy Ritger <aritger@nvidia.com>
Reviewed-by: James Jones <jajones@nvidia.com>
[Pekka: rebased and removed unused 'gr' and 'ec']
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index cf8df08..09256b4 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/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
@@ -2639,6 +2640,67 @@
static int
gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface);
+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)
+{
+ EGLSurface egl_surface = EGL_NO_SURFACE;
+ EGLConfig egl_config;
+
+ 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 EGL_NO_SURFACE;
+ }
+
+ if (egl_config != gr->egl_config &&
+ !gr->has_configless_context) {
+ weston_log("attempted to use a different EGL config for an "
+ "output but EGL_MESA_configless_context is not "
+ "supported\n");
+ return EGL_NO_SURFACE;
+ }
+
+ log_egl_config_info(gr->egl_display, egl_config);
+
+ 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);
+
+ return egl_surface;
+}
+
+static int
+gl_renderer_output_create(struct weston_output *output,
+ EGLSurface surface)
+{
+ struct gl_output_state *go;
+ int i;
+
+ 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;
+
+ return 0;
+}
+
static int
gl_renderer_output_window_create(struct weston_output *output,
EGLNativeWindowType window_for_legacy,
@@ -2649,55 +2711,24 @@
{
struct weston_compositor *ec = output->compositor;
struct gl_renderer *gr = get_renderer(ec);
- struct gl_output_state *go;
- EGLConfig egl_config;
- int i;
+ EGLSurface egl_surface = EGL_NO_SURFACE;
+ int ret = 0;
- 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;
- }
-
- if (egl_config != gr->egl_config &&
- !gr->has_configless_context) {
- weston_log("attempted to use a different EGL config for an "
- "output but EGL_MESA_configless_context is not "
- "supported\n");
- return -1;
- }
-
- go = zalloc(sizeof *go);
- if (go == NULL)
- return -1;
-
- 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 (go->egl_surface == EGL_NO_SURFACE) {
+ 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");
- free(go);
return -1;
}
- for (i = 0; i < BUFFER_DAMAGE_COUNT; i++)
- pixman_region32_init(&go->buffer_damage[i]);
+ ret = gl_renderer_output_create(output, egl_surface);
+ if (ret < 0)
+ eglDestroySurface(gr->egl_display, egl_surface);
- output->renderer_state = go;
-
- log_egl_config_info(gr->egl_display, egl_config);
-
- return 0;
+ return ret;
}
static void