From 1bf70ad420508f5032a16b1cc40de3a015ef999b Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Thu, 1 Jul 2010 15:47:38 +0800 Subject: [PATCH] libva: render front buffer for Pixmap. The way to get drawable type is proposed by Gwenole Beauchesne --- va/x11/dri2_util.c | 6 +++++- va/x11/va_dricommon.c | 38 +++++++++++++++++++++++++++++++++++++- va/x11/va_dricommon.h | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/va/x11/dri2_util.c b/va/x11/dri2_util.c index 63db330..0309c0f 100644 --- a/va/x11/dri2_util.c +++ b/va/x11/dri2_util.c @@ -98,7 +98,11 @@ dri2GetRenderingBuffer(VADriverContextP ctx, struct dri_drawable *dri_drawable) VA_DRI2Buffer *buffers; i = 0; - attachments[i++] = __DRI_BUFFER_BACK_LEFT; + if (dri_drawable->is_window) + attachments[i++] = __DRI_BUFFER_BACK_LEFT; + else + attachments[i++] = __DRI_BUFFER_FRONT_LEFT; + buffers = VA_DRI2GetBuffers(ctx->native_dpy, dri_drawable->x_drawable, &dri2_drawable->width, &dri2_drawable->height, attachments, i, &count); diff --git a/va/x11/va_dricommon.c b/va/x11/va_dricommon.c index f9c3dfd..71f9705 100644 --- a/va/x11/va_dricommon.c +++ b/va/x11/va_dricommon.c @@ -1,6 +1,41 @@ #include "va_dricommon.h" -static struct dri_drawable * +// X error trap +static int x11_error_code = 0; +static int (*old_error_handler)(Display *, XErrorEvent *); + +static int +error_handler(Display *dpy, XErrorEvent *error) +{ + x11_error_code = error->error_code; + return 0; +} + +static void +x11_trap_errors(void) +{ + x11_error_code = 0; + old_error_handler = XSetErrorHandler(error_handler); +} + +static int +x11_untrap_errors(void) +{ + XSetErrorHandler(old_error_handler); + return x11_error_code; +} + +static int +is_window(Display *dpy, Drawable drawable) +{ + XWindowAttributes wattr; + + x11_trap_errors(); + XGetWindowAttributes(dpy, drawable, &wattr); + return x11_untrap_errors() == 0; +} + +static struct dri_drawable * do_drawable_hash(VADriverContextP ctx, XID drawable) { struct dri_state *dri_state = (struct dri_state *)ctx->dri_state; @@ -15,6 +50,7 @@ do_drawable_hash(VADriverContextP ctx, XID drawable) dri_drawable = dri_state->createDrawable(ctx, drawable); dri_drawable->x_drawable = drawable; + dri_drawable->is_window = is_window((Display *)ctx->native_dpy, drawable); dri_drawable->next = dri_state->drawable_hash[index]; dri_state->drawable_hash[index] = dri_drawable; diff --git a/va/x11/va_dricommon.h b/va/x11/va_dricommon.h index ae364e7..0f8a1db 100644 --- a/va/x11/va_dricommon.h +++ b/va/x11/va_dricommon.h @@ -40,6 +40,7 @@ union dri_buffer struct dri_drawable { XID x_drawable; + int is_window; int x; int y; unsigned int width; -- 2.7.4