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


_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to