[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