On Wed, 2010-06-30 at 17:06 +0800, Yuan, Shengquan wrote: > On Wed, Jun 30, 2010 at 4:22 PM, Gwenole Beauchesne > <gbeauche...@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. Which Xv attribute? I am looking for a simple way to get drawable type.
Thanks Haihao > 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@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/libva > > _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva