summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2010-07-01 15:47:38 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2010-07-07 14:54:07 +0800
commit1bf70ad420508f5032a16b1cc40de3a015ef999b (patch)
treedafba07a0ebd9df2970586676628ccea8b5327c3
parent2e719ae5ca1ce3f271f46fb711d42a796efa2d29 (diff)
downloadlibva-1bf70ad420508f5032a16b1cc40de3a015ef999b.tar.gz
libva: render front buffer for Pixmap.
The way to get drawable type is proposed by Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
-rw-r--r--va/x11/dri2_util.c6
-rw-r--r--va/x11/va_dricommon.c38
-rw-r--r--va/x11/va_dricommon.h1
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;