diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-07-22 10:51:45 +0000 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-07-22 10:52:33 +0000 |
commit | df806d9e9daf0ac0dec81a2a34af24d33bfd83b5 (patch) | |
tree | 70a9e6b8e8f0d05ad3861422f99558b2e0a8d90d | |
parent | 0cc1c4613cd27691eee9b57aaa30df2f8ea46a26 (diff) |
va/wayland: Accept wl_egl_pixmap in vaPutSurface
-rw-r--r-- | va/va_wayland.h | 2 | ||||
-rw-r--r-- | va/wayland/va_wayland.c | 80 |
2 files changed, 61 insertions, 21 deletions
diff --git a/va/va_wayland.h b/va/va_wayland.h index 2cecbb7..364cd37 100644 --- a/va/va_wayland.h +++ b/va/va_wayland.h @@ -27,7 +27,7 @@ VADisplay vaGetDisplay ( VAStatus vaPutSurface ( VADisplay dpy, VASurfaceID surface, - struct wl_egl_window *draw, /* wayland surface */ + void *draw, /* wl_egl_window or wl_egl_pixmap */ short srcx, short srcy, unsigned short srcw, diff --git a/va/wayland/va_wayland.c b/va/wayland/va_wayland.c index bae6d23..647ee92 100644 --- a/va/wayland/va_wayland.c +++ b/va/wayland/va_wayland.c @@ -25,6 +25,7 @@ #include "va.h" #include "va_backend.h" #include "va_wayland.h" +#include "egl/va_backend_egl.h" #include "va_drmcommon.h" #include <stdio.h> #include <stdlib.h> @@ -68,6 +69,7 @@ enum wldrm_buffer_type { #define DRAWABLE_HASH_SZ 32 struct wldrm_drawable { struct drm_drawable base; + int is_window; struct wl_egl_window *win; int block_swap_buffers; @@ -150,6 +152,16 @@ wl_drm_create_without_bind(struct wl_display *display, uint32_t id) wl_proxy_create_for_id(display, &wl_drm_interface, id); } +static int +wayland_drawable_is_window(void *draw) +{ + struct wl_egl_window *win = draw; + struct wl_object *obj = (struct wl_object *) win->surface; + + /* wl_egl_windows first element is a wl_surface */ + return (obj->interface == &wl_surface_interface); +} + static inline int align(int value, int alignment) { @@ -222,6 +234,9 @@ wldrm_swap_buffer(struct VADriverContext *ctx, struct wl_egl_window *win = wdrawable->win; struct wldrm_buffer *wbuf; + if (!wdrawable->is_window) + return; + while (wdrawable->block_swap_buffers) wl_display_iterate(display, WL_DISPLAY_READABLE); @@ -260,31 +275,56 @@ static struct drm_drawable * wldrm_get_drawable(struct VADriverContext *ctx, void *native_drawable) { struct wldrm_state *drm_state = ctx->drm_state; - struct wl_egl_window *win = native_drawable; struct wldrm_drawable *wdrawable; - int index = surface_get_id(win->surface) % DRAWABLE_HASH_SZ; - for (wdrawable = drm_state->drawable_hash[index]; - wdrawable != NULL; wdrawable = wdrawable->next) { - if (wdrawable->win == win) - return &wdrawable->base; - } + if (wayland_drawable_is_window(native_drawable)) { + struct wl_egl_window *win = native_drawable; + int index = surface_get_id(win->surface) % DRAWABLE_HASH_SZ; - wdrawable = calloc(1, sizeof *wdrawable); - if (!wdrawable) - return NULL; + for (wdrawable = drm_state->drawable_hash[index]; + wdrawable != NULL; wdrawable = wdrawable->next) { + if (wdrawable->win == win) + return &wdrawable->base; + } + + wdrawable = calloc(1, sizeof *wdrawable); + if (!wdrawable) + return NULL; - wdrawable->next = drm_state->drawable_hash[index]; - drm_state->drawable_hash[index] = wdrawable; + wdrawable->next = drm_state->drawable_hash[index]; + drm_state->drawable_hash[index] = wdrawable; - wdrawable->base.x = 0; - wdrawable->base.y = 0; - wdrawable->base.width = win->width; - wdrawable->base.height = win->height; + wdrawable->is_window = 1; + wdrawable->base.x = 0; + wdrawable->base.y = 0; + wdrawable->base.width = win->width; + wdrawable->base.height = win->height; - wdrawable->win = win; - wdrawable->buffer[0] = wdrawable->buffer[1] = NULL; - wdrawable->block_swap_buffers = 0; + wdrawable->win = win; + wdrawable->buffer[0] = wdrawable->buffer[1] = NULL; + wdrawable->block_swap_buffers = 0; + } else { + struct wl_egl_pixmap *pixmap = native_drawable; + + wdrawable = calloc(1, sizeof *wdrawable); + if (!wdrawable) + return NULL; + + wdrawable->is_window = 0; + wdrawable->base.x = 0; + wdrawable->base.y = 0; + wdrawable->base.width = pixmap->width; + wdrawable->base.height = pixmap->height; + + wdrawable->buffer[WLDRM_BUFFER_FRONT] = NULL; + /* XXX: ugly and unsafe, since this implies the + * egl driver stores a pointer to a DRIbuffer in the first + * element of the (for us) unknown driver_private structure + */ + wdrawable->buffer[WLDRM_BUFFER_BACK] = (struct wldrm_buffer *) + *((union dri_buffer **) pixmap->driver_private); + wdrawable->block_swap_buffers = 0; + } return &wdrawable->base; } @@ -483,7 +523,7 @@ va_TracePutSurface(VADisplay dpy, VAStatus vaPutSurface(VADisplay dpy, VASurfaceID surface, - struct wl_egl_window *draw, + void *draw, short srcx, short srcy, unsigned short srcw, unsigned short srch, short destx, short desty, |