[PATCH weston 2/3] window: Bring back support for rgb windows

Ander Conselvan de Oliveira conselvan2 at gmail.com
Fri Dec 7 03:10:37 PST 2012


On 12/07/2012 05:03 AM, Kristian Høgsberg wrote:
> On Wed, Dec 05, 2012 at 03:14:05PM +0200, Ander Conselvan de Oliveira wrote:
>> This let us test overlays with toytoolkit applications. We can't just
>> rely on the opaque region, because a drmModeSetPlane() call will fail
>> if we use an ARGB bo because of the format check.
>
> Aren't we better of allowing ARGB BOs in planes if the opaque region
> contains surface?  Similar to how we handle ARGB primary frame
> buffers?

I'd rather do that too. I thought we would have to change the kernel 
side, since the plane ioctl fails with EINVAL if we pass an ARGB bo to a 
plane that advertises support only for XRGB. What I didn't realize is 
that the format it is checking is the one we supply to AddFB2, so we can 
just override it.

> I'm not excited about bringing this back, the extra
> EGLContext does burn a lot of memory.  We should make sure it's
> possible to hit the same optimizations with an ARGB surface and the
> opaque region as you can with an RGB surface.

Yeah, good point. New patch coming soon.

Cheers,
Ander


> Kristian
>
>> This reverts commits 067fd605345355094953d8e355fcfd0935304039,
>> fedc527723128ee08f443c8955d75d7cd0d956a6 and partially reverts
>> 010f98b0839e4eb8dd18056289590c1d0cb61ed5.
>>
>> ---
>> Hi,
>>
>> I'm thinking that with this we could move all the things we added to
>> simple-egl to test scanout surfaces, overlays and what not into a
>> toytoolkit client and make simple-egl simple again. Perhaps just rename
>> transformed to plane_test or something and add it all there.
>> ---
>>   clients/window.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++---
>>   clients/window.h |    5 +++++
>>   2 files changed, 64 insertions(+), 3 deletions(-)
>>
>> diff --git a/clients/window.c b/clients/window.c
>> index 20d09d5..5f9603e 100644
>> --- a/clients/window.c
>> +++ b/clients/window.c
>> @@ -93,8 +93,11 @@ struct display {
>>   	struct text_cursor_position *text_cursor_position;
>>   	struct workspace_manager *workspace_manager;
>>   	EGLDisplay dpy;
>> +	EGLConfig rgb_config;
>>   	EGLConfig argb_config;
>> +	EGLContext rgb_ctx;
>>   	EGLContext argb_ctx;
>> +	cairo_device_t *rgb_device;
>>   	cairo_device_t *argb_device;
>>   	uint32_t serial;
>>
>> @@ -454,6 +457,8 @@ egl_window_surface_acquire(struct toysurface *base, EGLContext ctx)
>>   	if (!ctx) {
>>   		if (device == surface->display->argb_device)
>>   			ctx = surface->display->argb_ctx;
>> +		else if (device == surface->display->rgb_device)
>> +			ctx = surface->display->rgb_ctx;
>>   		else
>>   			assert(0);
>>   	}
>> @@ -505,6 +510,8 @@ egl_window_surface_create(struct display *display,
>>   			  struct rectangle *rectangle)
>>   {
>>   	struct egl_window_surface *surface;
>> +	cairo_device_t *device;
>> +	EGLConfig config;
>>
>>   	if (display->dpy == EGL_NO_DISPLAY)
>>   		return NULL;
>> @@ -519,6 +526,14 @@ egl_window_surface_create(struct display *display,
>>   	surface->base.release = egl_window_surface_release;
>>   	surface->base.destroy = egl_window_surface_destroy;
>>
>> +	if (flags & SURFACE_OPAQUE) {
>> +		device = display->rgb_device;
>> +		config = display->rgb_config;
>> +	} else {
>> +		device = display->argb_device;
>> +		config = display->argb_config;
>> +	}
>> +
>>   	surface->display = display;
>>   	surface->surface = wl_surface;
>>
>> @@ -526,13 +541,12 @@ egl_window_surface_create(struct display *display,
>>   						   rectangle->width,
>>   						   rectangle->height);
>>
>> -	surface->egl_surface = eglCreateWindowSurface(display->dpy,
>> -						      display->argb_config,
>> +	surface->egl_surface = eglCreateWindowSurface(display->dpy, config,
>>   						      surface->egl_window,
>>   						      NULL);
>>
>>   	surface->cairo_surface =
>> -		cairo_gl_surface_create_for_egl(display->argb_device,
>> +		cairo_gl_surface_create_for_egl(device,
>>   						surface->egl_surface,
>>   						rectangle->width,
>>   						rectangle->height);
>> @@ -3418,6 +3432,12 @@ window_set_output_handler(struct window *window,
>>   }
>>
>>   void
>> +window_set_transparent(struct window *window, int transparent)
>> +{
>> +	window->transparent = transparent;
>> +}
>> +
>> +void
>>   window_set_title(struct window *window, const char *title)
>>   {
>>   	free(window->title);
>> @@ -4090,6 +4110,17 @@ init_egl(struct display *d)
>>   		EGL_NONE
>>   	};
>>
>> +	static const EGLint rgb_cfg_attribs[] = {
>> +		EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
>> +		EGL_RED_SIZE, 1,
>> +		EGL_GREEN_SIZE, 1,
>> +		EGL_BLUE_SIZE, 1,
>> +		EGL_ALPHA_SIZE, 0,
>> +		EGL_DEPTH_SIZE, 1,
>> +		EGL_RENDERABLE_TYPE, GL_BIT,
>> +		EGL_NONE
>> +	};
>> +
>>   #ifdef USE_CAIRO_GLESV2
>>   	static const EGLint context_attribs[] = {
>>   		EGL_CONTEXT_CLIENT_VERSION, 2,
>> @@ -4118,6 +4149,18 @@ init_egl(struct display *d)
>>   		return -1;
>>   	}
>>
>> +	if (!eglChooseConfig(d->dpy, rgb_cfg_attribs,
>> +			     &d->rgb_config, 1, &n) || n != 1) {
>> +		fprintf(stderr, "failed to choose rgb config\n");
>> +		return -1;
>> +	}
>> +
>> +	d->rgb_ctx = eglCreateContext(d->dpy, d->rgb_config,
>> +				      EGL_NO_CONTEXT, context_attribs);
>> +	if (d->rgb_ctx == NULL) {
>> +		fprintf(stderr, "failed to create context\n");
>> +		return -1;
>> +	}
>>   	d->argb_ctx = eglCreateContext(d->dpy, d->argb_config,
>>   				       EGL_NO_CONTEXT, context_attribs);
>>   	if (d->argb_ctx == NULL) {
>> @@ -4130,6 +4173,12 @@ init_egl(struct display *d)
>>   		return -1;
>>   	}
>>
>> +	d->rgb_device = cairo_egl_device_create(d->dpy, d->rgb_ctx);
>> +	if (cairo_device_status(d->rgb_device) != CAIRO_STATUS_SUCCESS) {
>> +		fprintf(stderr, "failed to get cairo egl rgb device\n");
>> +		return -1;
>> +	}
>> +
>>   	d->argb_device = cairo_egl_device_create(d->dpy, d->argb_ctx);
>>   	if (cairo_device_status(d->argb_device) != CAIRO_STATUS_SUCCESS) {
>>   		fprintf(stderr, "failed to get cairo egl argb device\n");
>> @@ -4143,6 +4192,7 @@ static void
>>   fini_egl(struct display *display)
>>   {
>>   	cairo_device_destroy(display->argb_device);
>> +	cairo_device_destroy(display->rgb_device);
>>
>>   	eglMakeCurrent(display->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
>>   		       EGL_NO_CONTEXT);
>> @@ -4374,6 +4424,12 @@ display_create_data_source(struct display *display)
>>   }
>>
>>   EGLConfig
>> +display_get_rgb_egl_config(struct display *d)
>> +{
>> +	return d->rgb_config;
>> +}
>> +
>> +EGLConfig
>>   display_get_argb_egl_config(struct display *d)
>>   {
>>   	return d->argb_config;
>> diff --git a/clients/window.h b/clients/window.h
>> index 29bba30..be9114d 100644
>> --- a/clients/window.h
>> +++ b/clients/window.h
>> @@ -112,6 +112,9 @@ EGLDisplay
>>   display_get_egl_display(struct display *d);
>>
>>   EGLConfig
>> +display_get_rgb_egl_config(struct display *d);
>> +
>> +EGLConfig
>>   display_get_argb_egl_config(struct display *d);
>>
>>   int
>> @@ -266,6 +269,8 @@ window_move(struct window *window, struct input *input, uint32_t time);
>>   void
>>   window_get_allocation(struct window *window, struct rectangle *allocation);
>>   void
>> +window_set_transparent(struct window *window, int transparent);
>> +void
>>   window_schedule_redraw(struct window *window);
>>   void
>>   window_schedule_resize(struct window *window, int width, int height);
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>



More information about the wayland-devel mailing list