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.

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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to