[Patch v4][weston] gl-renderer.c: Use gr->egl_config to create pbuffer surface

Pekka Paalanen ppaalanen at gmail.com
Tue Oct 1 10:05:38 UTC 2019


On Wed, 29 Aug 2018 13:18:43 -0700
Madhurkiran Harikrishnan <madhurkiran.harikrishnan at xilinx.com> wrote:

> 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 at xilinx.com>
> ---
>  libweston/gl-renderer.c | 31 +++++++++++++++----------------
>  1 file changed, 15 insertions(+), 16 deletions(-)

Hi,

it sounds like the patch you proposed here was inspired by some
problems with some EGL implementations. Could you test
https://gitlab.freedesktop.org/wayland/weston/merge_requests/276 to see
if that solves all the issues that made you write this patch?


Thanks,
pq

> 
> diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
> index da29b07..13d7707 100644
> --- a/libweston/gl-renderer.c
> +++ b/libweston/gl-renderer.c
> @@ -3033,7 +3033,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,
> @@ -3043,7 +3043,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,
> @@ -3146,17 +3146,7 @@ output_handle_destroy(struct wl_listener *listener, void *data)
>  
>  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,
> @@ -3164,13 +3154,22 @@ 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) {

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20191001/2b33c886/attachment.sig>


More information about the wayland-devel mailing list