[Libva] [PATCH] libva: new flags for vaPutSurface() to distinguish pixmap from window

Xiang, Haihao haihao.xiang at intel.com
Thu Jul 1 01:00:11 PDT 2010


On Thu, 2010-07-01 at 10:22 +0800, Xiang, Haihao wrote:
> On Wed, 2010-06-30 at 16:22 +0800, Gwenole Beauchesne wrote:
> > Hi,
> > 
> > On Tue, 29 Jun 2010, Xiang, Haihao wrote:
> > 
> > > Meanwhile render pixmap directly.
> > 
> > I once tried TFP on Ironlake. It used to work on Ubuntu/lucid-RC without 
> > other changes. This no longer works nowadays because Ubuntu/lucid final 
> > dropped support for GLX 1.3.
> 
> The latest DRI2 uses swapbuffer instead of DRI2CopyRegion if possible, and it seems swapbuffer doesn't work with a pixmap.
> in addition, rendering back buffer then swapping/copying to front buffer
> isn't necessary for pixmap. 
> 
> TFP on Ironlake works with this patch. Of course I don't use
> Ubuntu/lucid. 
> 
> you can use mplayer -vo vaapi:gl or maplyer -vo vaapi:gl:reflect  to
> verify it.
> 
> 
> > That said, I don't think this patch is useful. Normally, a VA driver will 
> > know whether the drawable is a Pixmap or a Window, since it's generally 
> > tied to the X driver. In our drivers, I use a function (e.g. is_pixmap()) 
> > to check for that.
> > 
> > I mean, do_drawable_hash() can also use such a function, if we can't know 
> > that from the X driver. How is the Moorestown driver working on this side?
> > 
> > BTW, here is the function I use. There surely is a better one though.
> > 
> > // 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;
> > }
> > 
> > void x11_trap_errors(void)
> > {
> >      x11_error_code    = 0;
> >      old_error_handler = XSetErrorHandler(error_handler);
> > }
> > 
> > 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;
> > }
> > 
> Thanks, I will give a try.
This way works for me, here is the patch.

>From 06e035120a0ba885ae8930cc62d846d8d66294af Mon Sep 17 00:00:00 2001
From: Xiang, Haihao <haihao.xiang at intel.com>
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 <gbeauchesne at splitted-desktop.com>
---
 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;
-- 
1.6.3.3






More information about the Libva mailing list