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

Yuan, Shengquan shengquan.yuan at gmail.com
Wed Jun 30 02:06:02 PDT 2010


On Wed, Jun 30, 2010 at 4:22 PM, Gwenole Beauchesne
<gbeauchesne at splitted-desktop.com> 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.
>
> 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?
>

There isn't a simple way for it. We firstly tried this:
======================================

/* Check drawable type, 1 for window, 0 for pixmap
 * Have significant performance drop in XFCE environment
 */
static void psb__CheckDrawableType(Display *dpy, Window win, Drawable
draw, int *type_ret)
{

    unsigned int child_num;
    Window root_return;
    Window parent_return;
    Window *child_return;
    int i;

    if (win == draw) {
        *type_ret = 1;
        return;
    }

    XQueryTree(dpy, win, &root_return, &parent_return, &child_return,
&child_num);

    if (!child_num)
        return;

    for(i =0; i< child_num; i++)
        psb__CheckDrawableType(dpy, child_return[i], draw, type_ret);
}
======================================

But we found it has performance issue, then we changed to use a Xv
attribute to get it from X server.
In some sense, we need to check it for every vaPutSurface and then
will cause high C0 residence.


> 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;
> }
>
> Regards,
> Gwenole.
> _______________________________________________
> Libva mailing list
> Libva at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libva
>


More information about the Libva mailing list