| From 7cc76d50bddd6ff1eb5fb19712415f385f5d3f49 Mon Sep 17 00:00:00 2001 |
| From: Madhurkiran Harikrishnan <madhurkiran.harikrishnan@xilinx.com> |
| Date: Mon, 3 Feb 2020 14:26:21 -0800 |
| Subject: [PATCH] gl-renderer.c: Use gr->egl_config to create pbuffer surface |
| |
| The original implementation always chose first egl config for pbuffer |
| surface type, however the returned configs are implementation specific |
| and egl config may not always match between ctx and surface. Hence, |
| use gr->egl_config which already has the matching config but ensure that |
| windows and pbuffer bit are set for the surface type. |
| |
| Signed-off-by: Madhurkiran Harikrishnan <madhurkiran.harikrishnan@xilinx.com> |
| Upstream-status: Pending |
| --- |
| libweston/renderer-gl/gl-renderer.c | 28 ++++++++++++++-------------- |
| 1 file changed, 14 insertions(+), 14 deletions(-) |
| |
| diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c |
| index 54f8b1c..f50c959 100644 |
| --- a/libweston/renderer-gl/gl-renderer.c |
| +++ b/libweston/renderer-gl/gl-renderer.c |
| @@ -3567,7 +3567,7 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) |
| } |
| |
| static const EGLint gl_renderer_opaque_attribs[] = { |
| - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, |
| + EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, |
| EGL_RED_SIZE, 1, |
| EGL_GREEN_SIZE, 1, |
| EGL_BLUE_SIZE, 1, |
| @@ -3577,7 +3577,7 @@ static const EGLint gl_renderer_opaque_attribs[] = { |
| }; |
| |
| static const EGLint gl_renderer_alpha_attribs[] = { |
| - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, |
| + EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, |
| EGL_RED_SIZE, 1, |
| EGL_GREEN_SIZE, 1, |
| EGL_BLUE_SIZE, 1, |
| @@ -3682,15 +3682,7 @@ static int |
| gl_renderer_create_pbuffer_surface(struct gl_renderer *gr) { |
| EGLConfig pbuffer_config; |
| |
| - static const EGLint pbuffer_config_attribs[] = { |
| - EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, |
| - EGL_RED_SIZE, 1, |
| - EGL_GREEN_SIZE, 1, |
| - EGL_BLUE_SIZE, 1, |
| - EGL_ALPHA_SIZE, 0, |
| - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, |
| - EGL_NONE |
| - }; |
| + EGLint surface_type; |
| |
| static const EGLint pbuffer_attribs[] = { |
| EGL_WIDTH, 10, |
| @@ -3698,13 +3690,21 @@ gl_renderer_create_pbuffer_surface(struct gl_renderer *gr) { |
| EGL_NONE |
| }; |
| |
| - if (egl_choose_config(gr, pbuffer_config_attribs, NULL, 0, &pbuffer_config) < 0) { |
| - weston_log("failed to choose EGL config for PbufferSurface\n"); |
| + if(!eglGetConfigAttrib(gr->egl_display, gr->egl_config, EGL_SURFACE_TYPE, &surface_type)) { |
| + weston_log("failed to get surface type for PbufferSurface\n"); |
| + return -1; |
| + } |
| + |
| + if (!((surface_type & EGL_WINDOW_BIT) && (surface_type & EGL_PBUFFER_BIT)) && |
| + !gr->has_configless_context) { |
| + weston_log("attempted to use a different EGL config for an " |
| + "output but EGL_KHR_no_config_context or " |
| + "EGL_MESA_configless_context is not supported\n"); |
| return -1; |
| } |
| |
| gr->dummy_surface = eglCreatePbufferSurface(gr->egl_display, |
| - pbuffer_config, |
| + gr->egl_config, |
| pbuffer_attribs); |
| |
| if (gr->dummy_surface == EGL_NO_SURFACE) { |
| -- |
| 2.7.4 |
| |