[5/5] winex11: Use an offscreen redirected window for child OpenGL rendering

Alexandre Julliard julliard at winehq.org
Tue Sep 25 06:31:04 CDT 2007


Chris Robinson <chris.kcat at gmail.com> writes:

> +    if(w > 0 && h > 0) {
> +        XFlush(gdi_display);
> +        XCopyArea(gdi_display, physDev->gl_drawable, physDev->drawable,
> +                  physDev->gc, 0, 0, w, h, physDev->dc_rect.left,
> +                  physDev->dc_rect.top);

Why do you need an XFlush here?

> +    if(data->whole_window && vis->visualid == XVisualIDFromVisual(visual))
> +    {
> +        TRACE("Whole window available and visual match, rendering onscreen\n");
> +        goto done;
> +    }
> +
> +    if(!composite_gl)
> +        goto done;

There's no sense in having a config option for this since the
alternative doesn't work anyway, particularly since you removed the
scissor support.

> +        data->gl_drawable = XCreateWindow(gdi_display, root_window, -w, 0, w, h,
> +                                          0, vis->depth, InputOutput,
> +                                          vis->visual,
> +                                          CWColormap | CWOverrideRedirect,
> +                                          &attrib);

The window needs to be created on the thread display, and as a child
of the main window.

> +static void update_gl_drawable(struct x11drv_win_data *data)
> +{
> +    unsigned int border, depth;
> +    int x, y, w, h;
> +    Window root_win;
> +
> +    if(!data->gl_drawable)
> +        return;
> +
> +    wine_tsx11_lock();
> +    XGetGeometry(gdi_display, data->gl_drawable, &root_win, &x, &y,
> +                 (unsigned int*)&w, (unsigned int*)&h, &border, &depth);

You must not use XGetGeometry, this incurs a server round-trip.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list