summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-07-22 10:51:45 +0000
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-07-22 10:52:33 +0000
commitdf806d9e9daf0ac0dec81a2a34af24d33bfd83b5 (patch)
tree70a9e6b8e8f0d05ad3861422f99558b2e0a8d90d
parent0cc1c4613cd27691eee9b57aaa30df2f8ea46a26 (diff)
va/wayland: Accept wl_egl_pixmap in vaPutSurface
-rw-r--r--va/va_wayland.h2
-rw-r--r--va/wayland/va_wayland.c80
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,