[Mesa-dev] [PATCH] vl: move winsys helper out of winsys directory

Jose Fonseca jfonseca at vmware.com
Wed Mar 28 05:05:31 PDT 2012


Looks a good move to me. Thanks for the comment.

Joe

----- Original Message -----
> They aren't winsys of their own,
> just help dealing with them.
> 
> v2: add some more comments in vl_winsys.h
> 
> Signed-off-by: Christian König <deathsimple at vodafone.de>
> ---
>  configure.ac                                     |    7 -
>  src/gallium/auxiliary/vl/vl_winsys.h             |   69 ++++
>  src/gallium/auxiliary/vl/vl_winsys_dri.c         |  400
>  ++++++++++++++++++++++
>  src/gallium/auxiliary/vl/vl_winsys_xsp.c         |  170 +++++++++
>  src/gallium/state_trackers/va/Makefile           |    4 +-
>  src/gallium/state_trackers/va/va_context.c       |    3 +-
>  src/gallium/state_trackers/vdpau/Makefile        |    4 +-
>  src/gallium/state_trackers/vdpau/device.c        |    2 -
>  src/gallium/state_trackers/vdpau/query.c         |    1 -
>  src/gallium/state_trackers/vdpau/vdpau_private.h |    3 +-
>  src/gallium/state_trackers/xvmc/Makefile         |    4 +-
>  src/gallium/state_trackers/xvmc/context.c        |    2 +-
>  src/gallium/state_trackers/xvmc/subpicture.c     |    3 +-
>  src/gallium/state_trackers/xvmc/surface.c        |    3 +-
>  src/gallium/targets/Makefile.va                  |    1 -
>  src/gallium/targets/Makefile.vdpau               |    1 -
>  src/gallium/targets/Makefile.xvmc                |    1 -
>  src/gallium/targets/va-r300/Makefile             |    4 +-
>  src/gallium/targets/va-r600/Makefile             |    6 +-
>  src/gallium/targets/va-softpipe/Makefile         |    2 +-
>  src/gallium/targets/vdpau-nouveau/Makefile       |    4 +-
>  src/gallium/targets/vdpau-r300/Makefile          |    3 +-
>  src/gallium/targets/vdpau-r600/Makefile          |    8 +-
>  src/gallium/targets/vdpau-softpipe/Makefile      |    2 +-
>  src/gallium/targets/xvmc-nouveau/Makefile        |    2 +-
>  src/gallium/targets/xvmc-r300/Makefile           |    4 +-
>  src/gallium/targets/xvmc-r600/Makefile           |    8 +-
>  src/gallium/targets/xvmc-softpipe/Makefile       |    2 +-
>  src/gallium/winsys/g3dvl/Makefile                |   12 -
>  src/gallium/winsys/g3dvl/dri/Makefile            |   12 -
>  src/gallium/winsys/g3dvl/dri/dri_winsys.c        |  396
>  ---------------------
>  src/gallium/winsys/g3dvl/vl_winsys.h             |   63 ----
>  src/gallium/winsys/g3dvl/xlib/xsp_winsys.c       |  168 ---------
>  33 files changed, 674 insertions(+), 700 deletions(-)
>  create mode 100644 src/gallium/auxiliary/vl/vl_winsys.h
>  create mode 100644 src/gallium/auxiliary/vl/vl_winsys_dri.c
>  create mode 100644 src/gallium/auxiliary/vl/vl_winsys_xsp.c
>  delete mode 100644 src/gallium/winsys/g3dvl/Makefile
>  delete mode 100644 src/gallium/winsys/g3dvl/dri/Makefile
>  delete mode 100644 src/gallium/winsys/g3dvl/dri/dri_winsys.c
>  delete mode 100644 src/gallium/winsys/g3dvl/vl_winsys.h
>  delete mode 100644 src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> 
> diff --git a/configure.ac b/configure.ac
> index ac7d49f..1c437e7 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1844,15 +1844,12 @@ gallium_check_st() {
>      fi
>      if test "x$HAVE_ST_XVMC" = xyes && test "x$5" != x; then
>           GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $5"
> -         NEED_G3DVL_DRI="yes"
>      fi
>      if test "x$HAVE_ST_VDPAU" = xyes && test "x$6" != x; then
>           GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $6"
> -         NEED_G3DVL_DRI="yes"
>      fi
>      if test "x$HAVE_ST_VA" = xyes && test "x$7" != x; then
>           GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $7"
> -         NEED_G3DVL_DRI="yes"
>      fi
>  }
>  
> @@ -1932,10 +1929,6 @@ if test "x$with_gallium_drivers" != x; then
>      done
>  fi
>  
> -if test "x$NEED_G3DVL_DRI" = xyes; then
> -    GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS g3dvl/dri"
> -fi
> -
>  dnl Tell Automake which drivers to build
>  for driver in $GALLIUM_DRIVERS_DIRS; do
>      case "x$driver" in
> diff --git a/src/gallium/auxiliary/vl/vl_winsys.h
> b/src/gallium/auxiliary/vl/vl_winsys.h
> new file mode 100644
> index 0000000..5f60d3e
> --- /dev/null
> +++ b/src/gallium/auxiliary/vl/vl_winsys.h
> @@ -0,0 +1,69 @@
> +/**************************************************************************
> + *
> + * Copyright 2009 Younes Manton.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person
> obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction,
> including
> + * without limitation the rights to use, copy, modify, merge,
> publish,
> + * distribute, sub license, and/or sell copies of the Software, and
> to
> + * permit persons to whom the Software is furnished to do so,
> subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including
> the
> + * next paragraph) shall be included in all copies or substantial
> portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> +
> **************************************************************************/
> +
> +/*
> + * vl targets use either a dri or sw based winsys backend, so their
> + * Makefiles directly refer to either vl_winsys_dri.c or
> vl_winsys_xsp.c.
> + * Both files implement the interface described in this header.
> + */
> +
> +#ifndef vl_winsys_h
> +#define vl_winsys_h
> +
> +#include <X11/Xlib.h>
> +#include "pipe/p_defines.h"
> +#include "pipe/p_format.h"
> +
> +struct pipe_screen;
> +struct pipe_surface;
> +
> +struct vl_screen
> +{
> +   struct pipe_screen *pscreen;
> +};
> +
> +struct vl_screen*
> +vl_screen_create(Display *display, int screen);
> +
> +void vl_screen_destroy(struct vl_screen *vscreen);
> +
> +struct pipe_resource*
> +vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable);
> +
> +struct u_rect *
> +vl_screen_get_dirty_area(struct vl_screen *vscreen);
> +
> +uint64_t
> +vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable);
> +
> +void
> +vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp);
> +
> +void*
> +vl_screen_get_private(struct vl_screen *vscreen);
> +
> +#endif
> diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c
> b/src/gallium/auxiliary/vl/vl_winsys_dri.c
> new file mode 100644
> index 0000000..8e4e026
> --- /dev/null
> +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c
> @@ -0,0 +1,400 @@
> +/**************************************************************************
> + *
> + * Copyright 2009 Younes Manton.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person
> obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction,
> including
> + * without limitation the rights to use, copy, modify, merge,
> publish,
> + * distribute, sub license, and/or sell copies of the Software, and
> to
> + * permit persons to whom the Software is furnished to do so,
> subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including
> the
> + * next paragraph) shall be included in all copies or substantial
> portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> +
> **************************************************************************/
> +
> +/* directly referenced from target Makefile, because of X
> dependencies */
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#include <X11/Xlib-xcb.h>
> +#include <xcb/dri2.h>
> +#include <xf86drm.h>
> +
> +#include "pipe/p_screen.h"
> +#include "pipe/p_context.h"
> +#include "pipe/p_state.h"
> +#include "state_tracker/drm_driver.h"
> +
> +#include "util/u_memory.h"
> +#include "util/u_hash.h"
> +#include "util/u_hash_table.h"
> +#include "util/u_inlines.h"
> +
> +#include "vl/vl_compositor.h"
> +#include "vl/vl_winsys.h"
> +
> +struct vl_dri_screen
> +{
> +   struct vl_screen base;
> +   xcb_connection_t *conn;
> +   xcb_drawable_t drawable;
> +
> +   unsigned width, height;
> +
> +   bool current_buffer;
> +   uint32_t buffer_names[2];
> +   struct u_rect dirty_areas[2];
> +
> +   bool flushed;
> +   xcb_dri2_swap_buffers_cookie_t swap_cookie;
> +   xcb_dri2_wait_sbc_cookie_t wait_cookie;
> +   xcb_dri2_get_buffers_cookie_t buffers_cookie;
> +
> +   int64_t last_ust, ns_frame, last_msc, next_msc, skew_msc;
> +};
> +
> +static const unsigned int attachments[1] = {
> XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT };
> +
> +static void
> +vl_dri2_handle_stamps(struct vl_dri_screen* scrn,
> +                      uint32_t ust_hi, uint32_t ust_lo,
> +                      uint32_t msc_hi, uint32_t msc_lo)
> +{
> +   int64_t ust = ((((uint64_t)ust_hi) << 32) | ust_lo) * 1000;
> +   int64_t msc = (((uint64_t)msc_hi) << 32) | msc_lo;
> +
> +   if (scrn->last_ust && scrn->last_msc && (ust > scrn->last_ust) &&
> (msc > scrn->last_msc))
> +      scrn->ns_frame = (ust - scrn->last_ust) / (msc -
> scrn->last_msc);
> +
> +   if (scrn->next_msc && (scrn->next_msc < msc))
> +      scrn->skew_msc++;
> +
> +   scrn->last_ust = ust;
> +   scrn->last_msc = msc;
> +}
> +
> +static xcb_dri2_get_buffers_reply_t*
> +vl_dri2_get_flush_reply(struct vl_dri_screen *scrn)
> +{
> +   xcb_dri2_wait_sbc_reply_t *wait_sbc_reply;
> +
> +   assert(scrn);
> +
> +   if (!scrn->flushed)
> +      return NULL;
> +
> +   scrn->flushed = false;
> +
> +   free(xcb_dri2_swap_buffers_reply(scrn->conn, scrn->swap_cookie,
> NULL));
> +
> +   wait_sbc_reply = xcb_dri2_wait_sbc_reply(scrn->conn,
> scrn->wait_cookie, NULL);
> +   if (!wait_sbc_reply)
> +      return NULL;
> +   vl_dri2_handle_stamps(scrn, wait_sbc_reply->ust_hi,
> wait_sbc_reply->ust_lo,
> +                         wait_sbc_reply->msc_hi,
> wait_sbc_reply->msc_lo);
> +   free(wait_sbc_reply);
> +
> +   return xcb_dri2_get_buffers_reply(scrn->conn,
> scrn->buffers_cookie, NULL);
> +}
> +
> +static void
> +vl_dri2_flush_frontbuffer(struct pipe_screen *screen,
> +                          struct pipe_resource *resource,
> +                          unsigned level, unsigned layer,
> +                          void *context_private)
> +{
> +   struct vl_dri_screen *scrn = (struct
> vl_dri_screen*)context_private;
> +   uint32_t msc_hi, msc_lo;
> +
> +   assert(screen);
> +   assert(resource);
> +   assert(context_private);
> +
> +   free(vl_dri2_get_flush_reply(scrn));
> +
> +   msc_hi = scrn->next_msc >> 32;
> +   msc_lo = scrn->next_msc & 0xFFFFFFFF;
> +
> +   scrn->swap_cookie = xcb_dri2_swap_buffers_unchecked(scrn->conn,
> scrn->drawable, msc_hi, msc_lo, 0, 0, 0, 0);
> +   scrn->wait_cookie = xcb_dri2_wait_sbc_unchecked(scrn->conn,
> scrn->drawable, 0, 0);
> +   scrn->buffers_cookie = xcb_dri2_get_buffers_unchecked(scrn->conn,
> scrn->drawable, 1, 1, attachments);
> +
> +   scrn->flushed = true;
> +   scrn->current_buffer = !scrn->current_buffer;
> +}
> +
> +static void
> +vl_dri2_destroy_drawable(struct vl_dri_screen *scrn)
> +{
> +   xcb_void_cookie_t destroy_cookie;
> +   if (scrn->drawable) {
> +      free(vl_dri2_get_flush_reply(scrn));
> +      destroy_cookie = xcb_dri2_destroy_drawable_checked(scrn->conn,
> scrn->drawable);
> +      /* ignore any error here, since the drawable can be destroyed
> long ago */
> +      free(xcb_request_check(scrn->conn, destroy_cookie));
> +   }
> +}
> +
> +static void
> +vl_dri2_set_drawable(struct vl_dri_screen *scrn, Drawable drawable)
> +{
> +   assert(scrn);
> +   assert(drawable);
> +
> +   if (scrn->drawable == drawable)
> +      return;
> +
> +   vl_dri2_destroy_drawable(scrn);
> +
> +   xcb_dri2_create_drawable(scrn->conn, drawable);
> +   scrn->current_buffer = false;
> +   vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> +   vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> +   scrn->drawable = drawable;
> +}
> +
> +struct pipe_resource*
> +vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable)
> +{
> +   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> +
> +   struct winsys_handle dri2_handle;
> +   struct pipe_resource template, *tex;
> +
> +   xcb_dri2_get_buffers_reply_t *reply;
> +   xcb_dri2_dri2_buffer_t *buffers, *back_left;
> +
> +   unsigned i;
> +
> +   assert(scrn);
> +
> +   vl_dri2_set_drawable(scrn, drawable);
> +   reply = vl_dri2_get_flush_reply(scrn);
> +   if (!reply) {
> +      xcb_dri2_get_buffers_cookie_t cookie;
> +      cookie = xcb_dri2_get_buffers_unchecked(scrn->conn, drawable,
> 1, 1, attachments);
> +      reply = xcb_dri2_get_buffers_reply(scrn->conn, cookie, NULL);
> +   }
> +   if (!reply)
> +      return NULL;
> +
> +   buffers = xcb_dri2_get_buffers_buffers(reply);
> +   if (!buffers)  {
> +      free(reply);
> +      return NULL;
> +   }
> +
> +   for (i = 0; i < reply->count; ++i) {
> +      if (buffers[i].attachment ==
> XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT) {
> +         back_left = &buffers[i];
> +         break;
> +      }
> +   }
> +
> +   if (i == reply->count) {
> +      free(reply);
> +      return NULL;
> +   }
> +
> +   if (reply->width != scrn->width || reply->height != scrn->height)
> {
> +      vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> +      vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> +      scrn->width = reply->width;
> +      scrn->height = reply->height;
> +
> +   } else if (back_left->name !=
> scrn->buffer_names[scrn->current_buffer]) {
> +
>      vl_compositor_reset_dirty_area(&scrn->dirty_areas[scrn->current_buffer]);
> +      scrn->buffer_names[scrn->current_buffer] = back_left->name;
> +   }
> +
> +   memset(&dri2_handle, 0, sizeof(dri2_handle));
> +   dri2_handle.type = DRM_API_HANDLE_TYPE_SHARED;
> +   dri2_handle.handle = back_left->name;
> +   dri2_handle.stride = back_left->pitch;
> +
> +   memset(&template, 0, sizeof(template));
> +   template.target = PIPE_TEXTURE_2D;
> +   template.format = PIPE_FORMAT_B8G8R8X8_UNORM;
> +   template.last_level = 0;
> +   template.width0 = reply->width;
> +   template.height0 = reply->height;
> +   template.depth0 = 1;
> +   template.array_size = 1;
> +   template.usage = PIPE_USAGE_STATIC;
> +   template.bind = PIPE_BIND_RENDER_TARGET;
> +   template.flags = 0;
> +
> +   tex =
> scrn->base.pscreen->resource_from_handle(scrn->base.pscreen,
> &template, &dri2_handle);
> +   free(reply);
> +
> +   return tex;
> +}
> +
> +struct u_rect *
> +vl_screen_get_dirty_area(struct vl_screen *vscreen)
> +{
> +   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> +   assert(scrn);
> +   return &scrn->dirty_areas[scrn->current_buffer];
> +}
> +
> +uint64_t
> +vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable)
> +{
> +   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> +   xcb_dri2_get_msc_cookie_t cookie;
> +   xcb_dri2_get_msc_reply_t *reply;
> +
> +   assert(scrn);
> +
> +   vl_dri2_set_drawable(scrn, drawable);
> +   if (!scrn->last_ust) {
> +      cookie = xcb_dri2_get_msc_unchecked(scrn->conn, drawable);
> +      reply = xcb_dri2_get_msc_reply(scrn->conn, cookie, NULL);
> +
> +      if (reply) {
> +         vl_dri2_handle_stamps(scrn, reply->ust_hi, reply->ust_lo,
> +                               reply->msc_hi, reply->msc_lo);
> +         free(reply);
> +      }
> +   }
> +   return scrn->last_ust;
> +}
> +
> +void
> +vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp)
> +{
> +   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> +   assert(scrn);
> +   if (stamp && scrn->last_ust && scrn->ns_frame && scrn->last_msc)
> +      scrn->next_msc = ((int64_t)stamp - scrn->last_ust) /
> scrn->ns_frame + scrn->last_msc + scrn->skew_msc;
> +   else
> +      scrn->next_msc = 0;
> +}
> +
> +void*
> +vl_screen_get_private(struct vl_screen *vscreen)
> +{
> +   return vscreen;
> +}
> +
> +struct vl_screen*
> +vl_screen_create(Display *display, int screen)
> +{
> +   struct vl_dri_screen *scrn;
> +   const xcb_query_extension_reply_t *extension;
> +   xcb_dri2_query_version_cookie_t dri2_query_cookie;
> +   xcb_dri2_query_version_reply_t *dri2_query = NULL;
> +   xcb_dri2_connect_cookie_t connect_cookie;
> +   xcb_dri2_connect_reply_t *connect = NULL;
> +   xcb_dri2_authenticate_cookie_t authenticate_cookie;
> +   xcb_dri2_authenticate_reply_t *authenticate = NULL;
> +   xcb_screen_iterator_t s;
> +   xcb_generic_error_t *error = NULL;
> +   char *device_name;
> +   int fd, device_name_length;
> +
> +   drm_magic_t magic;
> +
> +   assert(display);
> +
> +   scrn = CALLOC_STRUCT(vl_dri_screen);
> +   if (!scrn)
> +      return NULL;
> +
> +   scrn->conn = XGetXCBConnection(display);
> +   if (!scrn->conn)
> +      goto free_screen;
> +
> +   xcb_prefetch_extension_data(scrn->conn, &xcb_dri2_id);
> +
> +   extension = xcb_get_extension_data(scrn->conn, &xcb_dri2_id);
> +   if (!(extension && extension->present))
> +      goto free_screen;
> +
> +   dri2_query_cookie = xcb_dri2_query_version (scrn->conn,
> XCB_DRI2_MAJOR_VERSION, XCB_DRI2_MINOR_VERSION);
> +   dri2_query = xcb_dri2_query_version_reply (scrn->conn,
> dri2_query_cookie, &error);
> +   if (dri2_query == NULL || error != NULL ||
> dri2_query->minor_version < 2)
> +      goto free_screen;
> +
> +   s = xcb_setup_roots_iterator(xcb_get_setup(scrn->conn));
> +   connect_cookie = xcb_dri2_connect_unchecked(scrn->conn,
> s.data->root, XCB_DRI2_DRIVER_TYPE_DRI);
> +   connect = xcb_dri2_connect_reply(scrn->conn, connect_cookie,
> NULL);
> +   if (connect == NULL || connect->driver_name_length +
> connect->device_name_length == 0)
> +      goto free_screen;
> +
> +   device_name_length =
> xcb_dri2_connect_device_name_length(connect);
> +   device_name = CALLOC(1, device_name_length);
> +   memcpy(device_name, xcb_dri2_connect_device_name(connect),
> device_name_length);
> +   device_name[device_name_length] = 0;
> +   fd = open(device_name, O_RDWR);
> +   free(device_name);
> +
> +   if (fd < 0)
> +      goto free_screen;
> +
> +   if (drmGetMagic(fd, &magic))
> +      goto free_screen;
> +
> +   authenticate_cookie = xcb_dri2_authenticate_unchecked(scrn->conn,
> s.data->root, magic);
> +   authenticate = xcb_dri2_authenticate_reply(scrn->conn,
> authenticate_cookie, NULL);
> +
> +   if (authenticate == NULL || !authenticate->authenticated)
> +      goto free_screen;
> +
> +   scrn->base.pscreen = driver_descriptor.create_screen(fd);
> +   if (!scrn->base.pscreen)
> +      goto free_screen;
> +
> +   scrn->base.pscreen->flush_frontbuffer =
> vl_dri2_flush_frontbuffer;
> +   vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> +   vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> +
> +   free(dri2_query);
> +   free(connect);
> +   free(authenticate);
> +
> +   return &scrn->base;
> +
> +free_screen:
> +   FREE(scrn);
> +
> +   free(dri2_query);
> +   free(connect);
> +   free(authenticate);
> +   free(error);
> +
> +   return NULL;
> +}
> +
> +void vl_screen_destroy(struct vl_screen *vscreen)
> +{
> +   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> +
> +   assert(vscreen);
> +
> +   if (scrn->flushed) {
> +      free(xcb_dri2_swap_buffers_reply(scrn->conn,
> scrn->swap_cookie, NULL));
> +      free(xcb_dri2_wait_sbc_reply(scrn->conn, scrn->wait_cookie,
> NULL));
> +      free(xcb_dri2_get_buffers_reply(scrn->conn,
> scrn->buffers_cookie, NULL));
> +   }
> +
> +   vl_dri2_destroy_drawable(scrn);
> +   scrn->base.pscreen->destroy(scrn->base.pscreen);
> +   FREE(scrn);
> +}
> diff --git a/src/gallium/auxiliary/vl/vl_winsys_xsp.c
> b/src/gallium/auxiliary/vl/vl_winsys_xsp.c
> new file mode 100644
> index 0000000..ce3a37f
> --- /dev/null
> +++ b/src/gallium/auxiliary/vl/vl_winsys_xsp.c
> @@ -0,0 +1,170 @@
> +/**************************************************************************
> + *
> + * Copyright 2009 Younes Manton.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person
> obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction,
> including
> + * without limitation the rights to use, copy, modify, merge,
> publish,
> + * distribute, sub license, and/or sell copies of the Software, and
> to
> + * permit persons to whom the Software is furnished to do so,
> subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including
> the
> + * next paragraph) shall be included in all copies or substantial
> portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> +
> **************************************************************************/
> +
> +/* directly referenced from target Makefile, because of X
> dependencies */
> +
> +#include <sys/time.h>
> +
> +#include "pipe/p_state.h"
> +
> +#include "util/u_memory.h"
> +#include "util/u_format.h"
> +#include "util/u_inlines.h"
> +
> +#include "state_tracker/xlib_sw_winsys.h"
> +#include "softpipe/sp_public.h"
> +
> +#include "vl/vl_compositor.h"
> +#include "vl/vl_winsys.h"
> +
> +struct vl_xsp_screen
> +{
> +   struct vl_screen base;
> +   Display *display;
> +   int screen;
> +   Visual visual;
> +   struct xlib_drawable xdraw;
> +   struct pipe_resource *tex;
> +   struct u_rect dirty_area;
> +};
> +
> +struct pipe_resource*
> +vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable)
> +{
> +   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> +   Window root;
> +   int x, y;
> +   unsigned int width, height;
> +   unsigned int border_width;
> +   unsigned int depth;
> +   struct pipe_resource templat;
> +
> +   assert(vscreen);
> +   assert(drawable != None);
> +
> +   if (XGetGeometry(xsp_screen->display, drawable, &root, &x, &y,
> &width, &height, &border_width, &depth) == BadDrawable)
> +      return NULL;
> +
> +   xsp_screen->xdraw.drawable = drawable;
> +
> +   if (xsp_screen->tex) {
> +      if (xsp_screen->tex->width0 == width &&
> xsp_screen->tex->height0 == height)
> +         return xsp_screen->tex;
> +      pipe_resource_reference(&xsp_screen->tex, NULL);
> +      vl_compositor_reset_dirty_area(&xsp_screen->dirty_area);
> +   }
> +
> +   memset(&templat, 0, sizeof(struct pipe_resource));
> +   templat.target = PIPE_TEXTURE_2D;
> +   /* XXX: Need to figure out drawable's format */
> +   templat.format = PIPE_FORMAT_B8G8R8X8_UNORM;
> +   templat.last_level = 0;
> +   templat.width0 = width;
> +   templat.height0 = height;
> +   templat.depth0 = 1;
> +   templat.usage = PIPE_USAGE_DEFAULT;
> +   templat.bind = PIPE_BIND_RENDER_TARGET |
> PIPE_BIND_DISPLAY_TARGET;
> +   templat.flags = 0;
> +
> +   xsp_screen->xdraw.depth =
> 24/*util_format_get_blocksizebits(templat.format) /
> +
>                             util_format_get_blockwidth(templat.format)*/;
> +
> +   pipe_resource_reference(&xsp_screen->tex,
> vscreen->pscreen->resource_create(vscreen->pscreen, &templat));
> +   return xsp_screen->tex;
> +}
> +
> +struct u_rect *
> +vl_screen_get_dirty_area(struct vl_screen *vscreen)
> +{
> +   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> +   return &xsp_screen->dirty_area;
> +}
> +
> +uint64_t
> +vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable)
> +{
> +   struct timeval tv;
> +   gettimeofday(&tv, NULL);
> +   return (uint64_t)tv.tv_sec * 1000000000LL + (uint64_t)tv.tv_usec
> * 1000LL;
> +}
> +
> +void
> +vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp)
> +{
> +   /* not supported on softpipe and so only a dummy */
> +}
> +
> +void*
> +vl_screen_get_private(struct vl_screen *vscreen)
> +{
> +   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> +   return &xsp_screen->xdraw;
> +}
> +
> +struct vl_screen*
> +vl_screen_create(Display *display, int screen)
> +{
> +   struct vl_xsp_screen *xsp_screen;
> +   struct sw_winsys *winsys;
> +
> +   assert(display);
> +
> +   xsp_screen = CALLOC_STRUCT(vl_xsp_screen);
> +   if (!xsp_screen)
> +      return NULL;
> +
> +   winsys = xlib_create_sw_winsys(display);
> +   if (!winsys) {
> +      FREE(xsp_screen);
> +      return NULL;
> +   }
> +
> +   xsp_screen->base.pscreen = softpipe_create_screen(winsys);
> +   if (!xsp_screen->base.pscreen) {
> +      winsys->destroy(winsys);
> +      FREE(xsp_screen);
> +      return NULL;
> +   }
> +
> +   xsp_screen->display = display;
> +   xsp_screen->screen = screen;
> +   xsp_screen->xdraw.visual = XDefaultVisual(display, screen);
> +   vl_compositor_reset_dirty_area(&xsp_screen->dirty_area);
> +
> +   return &xsp_screen->base;
> +}
> +
> +void vl_screen_destroy(struct vl_screen *vscreen)
> +{
> +   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> +
> +   assert(vscreen);
> +
> +   pipe_resource_reference(&xsp_screen->tex, NULL);
> +   vscreen->pscreen->destroy(vscreen->pscreen);
> +   FREE(vscreen);
> +}
> diff --git a/src/gallium/state_trackers/va/Makefile
> b/src/gallium/state_trackers/va/Makefile
> index 775e4db..007d16f 100644
> --- a/src/gallium/state_trackers/va/Makefile
> +++ b/src/gallium/state_trackers/va/Makefile
> @@ -7,9 +7,7 @@ VA_MAJOR = 0
>  VA_MINOR = 3
>  LIBRARY_DEFINES = -DVER_MAJOR=$(VA_MAJOR) -DVER_MINOR=$(VA_MINOR)
>  $(STATE_TRACKER_DEFINES)
>  
> -LIBRARY_INCLUDES = \
> -	$(shell $(PKG_CONFIG) --cflags-only-I libva) \
> -	-I$(TOP)/src/gallium/winsys/g3dvl
> +LIBRARY_INCLUDES = $(shell $(PKG_CONFIG) --cflags-only-I libva)
>  
>  C_SOURCES = htab.c \
>  	    ftab.c \
> diff --git a/src/gallium/state_trackers/va/va_context.c
> b/src/gallium/state_trackers/va/va_context.c
> index ea0782f..218677f 100644
> --- a/src/gallium/state_trackers/va/va_context.c
> +++ b/src/gallium/state_trackers/va/va_context.c
> @@ -34,8 +34,7 @@
>  
>  #include "util/u_debug.h"
>  #include "util/u_memory.h"
> -
> -#include "vl_winsys.h"
> +#include "vl/vl_winsys.h"
>  
>  #include "va_private.h"
>  
> diff --git a/src/gallium/state_trackers/vdpau/Makefile
> b/src/gallium/state_trackers/vdpau/Makefile
> index 0aeadc0..e9cfc4c 100644
> --- a/src/gallium/state_trackers/vdpau/Makefile
> +++ b/src/gallium/state_trackers/vdpau/Makefile
> @@ -7,9 +7,7 @@ VDPAU_MAJOR = 1
>  VDPAU_MINOR = 0
>  LIBRARY_DEFINES = -DVER_MAJOR=$(VDPAU_MAJOR)
>  -DVER_MINOR=$(VDPAU_MINOR) $(STATE_TRACKER_DEFINES)
>  
> -LIBRARY_INCLUDES = \
> -	$(shell $(PKG_CONFIG) --cflags-only-I vdpau) \
> -	-I$(TOP)/src/gallium/winsys/g3dvl
> +LIBRARY_INCLUDES = $(shell $(PKG_CONFIG) --cflags-only-I vdpau)
>  
>  C_SOURCES = htab.c \
>  	    ftab.c \
> diff --git a/src/gallium/state_trackers/vdpau/device.c
> b/src/gallium/state_trackers/vdpau/device.c
> index 2e38f6c..dd586f5 100644
> --- a/src/gallium/state_trackers/vdpau/device.c
> +++ b/src/gallium/state_trackers/vdpau/device.c
> @@ -31,8 +31,6 @@
>  #include "util/u_debug.h"
>  #include "util/u_sampler.h"
>  
> -#include "vl_winsys.h"
> -
>  #include "vdpau_private.h"
>  
>  /**
> diff --git a/src/gallium/state_trackers/vdpau/query.c
> b/src/gallium/state_trackers/vdpau/query.c
> index 2b13ce1..2281dcf 100644
> --- a/src/gallium/state_trackers/vdpau/query.c
> +++ b/src/gallium/state_trackers/vdpau/query.c
> @@ -29,7 +29,6 @@
>  #include <math.h>
>  
>  #include "vdpau_private.h"
> -#include "vl_winsys.h"
>  #include "pipe/p_screen.h"
>  #include "pipe/p_defines.h"
>  #include "util/u_debug.h"
> diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h
> b/src/gallium/state_trackers/vdpau/vdpau_private.h
> index a54fcdc..918a6c2 100644
> --- a/src/gallium/state_trackers/vdpau/vdpau_private.h
> +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
> @@ -44,8 +44,7 @@
>  #include "vl/vl_csc.h"
>  #include "vl/vl_matrix_filter.h"
>  #include "vl/vl_median_filter.h"
> -
> -#include "vl_winsys.h"
> +#include "vl/vl_winsys.h"
>  
>  /* Full VDPAU API documentation available at :
>   * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html
>   */
> diff --git a/src/gallium/state_trackers/xvmc/Makefile
> b/src/gallium/state_trackers/xvmc/Makefile
> index 179446f..c54bd7a 100644
> --- a/src/gallium/state_trackers/xvmc/Makefile
> +++ b/src/gallium/state_trackers/xvmc/Makefile
> @@ -3,9 +3,7 @@ include $(TOP)/configs/current
>  
>  LIBNAME = xvmctracker
>  
> -LIBRARY_INCLUDES = \
> -	$(shell $(PKG_CONFIG) --cflags-only-I xvmc) \
> -	-I$(TOP)/src/gallium/winsys/g3dvl
> +LIBRARY_INCLUDES = $(shell $(PKG_CONFIG) --cflags-only-I xvmc)
>  
>  C_SOURCES = block.c \
>              surface.c \
> diff --git a/src/gallium/state_trackers/xvmc/context.c
> b/src/gallium/state_trackers/xvmc/context.c
> index 7b97a67..366f29b 100644
> --- a/src/gallium/state_trackers/xvmc/context.c
> +++ b/src/gallium/state_trackers/xvmc/context.c
> @@ -38,7 +38,7 @@
>  #include "util/u_memory.h"
>  
>  #include "vl/vl_csc.h"
> -#include "vl_winsys.h"
> +#include "vl/vl_winsys.h"
>  
>  #include "xvmc_private.h"
>  
> diff --git a/src/gallium/state_trackers/xvmc/subpicture.c
> b/src/gallium/state_trackers/xvmc/subpicture.c
> index 058c568..b33f16e 100644
> --- a/src/gallium/state_trackers/xvmc/subpicture.c
> +++ b/src/gallium/state_trackers/xvmc/subpicture.c
> @@ -39,8 +39,7 @@
>  #include "util/u_format.h"
>  #include "util/u_sampler.h"
>  #include "util/u_rect.h"
> -
> -#include "vl_winsys.h"
> +#include "vl/vl_winsys.h"
>  
>  #include "xvmc_private.h"
>  
> diff --git a/src/gallium/state_trackers/xvmc/surface.c
> b/src/gallium/state_trackers/xvmc/surface.c
> index 615fd08..bec23a4 100644
> --- a/src/gallium/state_trackers/xvmc/surface.c
> +++ b/src/gallium/state_trackers/xvmc/surface.c
> @@ -37,8 +37,7 @@
>  #include "util/u_inlines.h"
>  #include "util/u_memory.h"
>  #include "util/u_math.h"
> -
> -#include "vl_winsys.h"
> +#include "vl/vl_winsys.h"
>  
>  #include "xvmc_private.h"
>  
> diff --git a/src/gallium/targets/Makefile.va
> b/src/gallium/targets/Makefile.va
> index 7215fc3..884b59d 100644
> --- a/src/gallium/targets/Makefile.va
> +++ b/src/gallium/targets/Makefile.va
> @@ -8,7 +8,6 @@ INCLUDES = -I$(TOP)/src/gallium/include \
>  	   -I$(TOP)/src/gallium/drivers \
>  	   -I$(TOP)/src/gallium/auxiliary \
>  	   -I$(TOP)/src/gallium/winsys \
> -	   -I$(TOP)/src/gallium/winsys/g3dvl \
>  	   $(DRIVER_INCLUDES)
>  DEFINES = -DGALLIUM_TRACE -DVER_MAJOR=$(VA_MAJOR)
>  -DVER_MINOR=$(VA_MINOR) $(DRIVER_DEFINES)
>  LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lva -lXext -lX11 -lm
> diff --git a/src/gallium/targets/Makefile.vdpau
> b/src/gallium/targets/Makefile.vdpau
> index 2c2385c..a9e7a9c 100644
> --- a/src/gallium/targets/Makefile.vdpau
> +++ b/src/gallium/targets/Makefile.vdpau
> @@ -8,7 +8,6 @@ INCLUDES = -I$(TOP)/src/gallium/include \
>  	   -I$(TOP)/src/gallium/drivers \
>  	   -I$(TOP)/src/gallium/auxiliary \
>  	   -I$(TOP)/src/gallium/winsys \
> -	   -I$(TOP)/src/gallium/winsys/g3dvl \
>  	   $(DRIVER_INCLUDES)
>  DEFINES = -DGALLIUM_TRACE -DVER_MAJOR=$(VDPAU_MAJOR)
>  -DVER_MINOR=$(VDPAU_MINOR) $(DRIVER_DEFINES)
>  LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lvdpau -lX11-xcb -lxcb-dri2
>  -lm -lrt
> diff --git a/src/gallium/targets/Makefile.xvmc
> b/src/gallium/targets/Makefile.xvmc
> index 5eafe98..217481e 100644
> --- a/src/gallium/targets/Makefile.xvmc
> +++ b/src/gallium/targets/Makefile.xvmc
> @@ -8,7 +8,6 @@ INCLUDES = -I$(TOP)/src/gallium/include \
>  	   -I$(TOP)/src/gallium/drivers \
>  	   -I$(TOP)/src/gallium/auxiliary \
>  	   -I$(TOP)/src/gallium/winsys \
> -	   -I$(TOP)/src/gallium/winsys/g3dvl \
>  	   $(DRIVER_INCLUDES)
>  DEFINES = -DGALLIUM_TRACE $(DRIVER_DEFINES)
>  LIBS = $(EXTRA_LIB_PATH) $(DRIVER_LIBS) -lXv -lX11-xcb -lxcb-dri2
>  -lm
> diff --git a/src/gallium/targets/va-r300/Makefile
> b/src/gallium/targets/va-r300/Makefile
> index a270dfa..7c89c79 100644
> --- a/src/gallium/targets/va-r300/Makefile
> +++ b/src/gallium/targets/va-r300/Makefile
> @@ -4,11 +4,10 @@ include $(TOP)/configs/current
>  LIBBASENAME = r300_drv_video
>  
>  DRIVER_DEFINES = -DGALLIUM_SOFTPIPE
> -DRIVER_INCLUDES =
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
>  
>  PIPE_DRIVERS = \
>  	$(TOP)/src/gallium/drivers/r300/libr300.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>          $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
>  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
>          $(TOP)/src/gallium/drivers/trace/libtrace.a \
> @@ -16,6 +15,7 @@ PIPE_DRIVERS = \
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/va-r600/Makefile
> b/src/gallium/targets/va-r600/Makefile
> index afead84..50e7fa5 100644
> --- a/src/gallium/targets/va-r600/Makefile
> +++ b/src/gallium/targets/va-r600/Makefile
> @@ -4,18 +4,18 @@ include $(TOP)/configs/current
>  LIBBASENAME = r600_drv_video
>  
>  DRIVER_DEFINES = -DGALLIUM_SOFTPIPE
> -DRIVER_INCLUDES =
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
>  
>  PIPE_DRIVERS = \
>  	$(TOP)/src/gallium/drivers/r600/libr600.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>  	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
>  	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
> -        $(TOP)/src/gallium/drivers/trace/libtrace.a \
> +	$(TOP)/src/gallium/drivers/trace/libtrace.a \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/va-softpipe/Makefile
> b/src/gallium/targets/va-softpipe/Makefile
> index a58df36..536cb7b 100644
> --- a/src/gallium/targets/va-softpipe/Makefile
> +++ b/src/gallium/targets/va-softpipe/Makefile
> @@ -12,7 +12,7 @@ PIPE_DRIVERS = \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
> -	$(TOP)/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_xsp.c
>  
>  DRIVER_LIBS =
>  
> diff --git a/src/gallium/targets/vdpau-nouveau/Makefile
> b/src/gallium/targets/vdpau-nouveau/Makefile
> index 55f9907..d3f1c7d 100644
> --- a/src/gallium/targets/vdpau-nouveau/Makefile
> +++ b/src/gallium/targets/vdpau-nouveau/Makefile
> @@ -3,8 +3,9 @@ include $(TOP)/configs/current
>  
>  LIBBASENAME = vdpau_nouveau
>  
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
> +
>  PIPE_DRIVERS = \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>  	$(TOP)/src/gallium/winsys/nouveau/drm/libnouveaudrm.a \
>  	$(TOP)/src/gallium/drivers/nvfx/libnvfx.a \
>  	$(TOP)/src/gallium/drivers/nv50/libnv50.a \
> @@ -16,6 +17,7 @@ PIPE_DRIVERS = \
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/vdpau-r300/Makefile
> b/src/gallium/targets/vdpau-r300/Makefile
> index 849f72e..1ada550 100644
> --- a/src/gallium/targets/vdpau-r300/Makefile
> +++ b/src/gallium/targets/vdpau-r300/Makefile
> @@ -3,10 +3,10 @@ include $(TOP)/configs/current
>  
>  LIBBASENAME = vdpau_r300
>  
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
>  
>  PIPE_DRIVERS = \
>          $(TOP)/src/gallium/drivers/r300/libr300.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>          $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
>          $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
>          $(TOP)/src/gallium/drivers/rbug/librbug.a \
> @@ -17,6 +17,7 @@ PIPE_DRIVERS = \
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/vdpau-r600/Makefile
> b/src/gallium/targets/vdpau-r600/Makefile
> index ef27b65..05e0b4f 100644
> --- a/src/gallium/targets/vdpau-r600/Makefile
> +++ b/src/gallium/targets/vdpau-r600/Makefile
> @@ -3,15 +3,17 @@ include $(TOP)/configs/current
>  
>  LIBBASENAME = vdpau_r600
>  
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
> +
>  PIPE_DRIVERS = \
> -        $(TOP)/src/gallium/drivers/r600/libr600.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
> +	$(TOP)/src/gallium/drivers/r600/libr600.a \
>  	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
> -        $(TOP)/src/gallium/drivers/trace/libtrace.a \
> +	$(TOP)/src/gallium/drivers/trace/libtrace.a \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/vdpau-softpipe/Makefile
> b/src/gallium/targets/vdpau-softpipe/Makefile
> index 139b01b..41cc514 100644
> --- a/src/gallium/targets/vdpau-softpipe/Makefile
> +++ b/src/gallium/targets/vdpau-softpipe/Makefile
> @@ -12,7 +12,7 @@ PIPE_DRIVERS = \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
> -	$(TOP)/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_xsp.c
>  
>  DRIVER_LIBS =
>  
> diff --git a/src/gallium/targets/xvmc-nouveau/Makefile
> b/src/gallium/targets/xvmc-nouveau/Makefile
> index 67036ee..06727f1 100644
> --- a/src/gallium/targets/xvmc-nouveau/Makefile
> +++ b/src/gallium/targets/xvmc-nouveau/Makefile
> @@ -4,7 +4,6 @@ include $(TOP)/configs/current
>  LIBBASENAME = XvMCnouveau
>  
>  PIPE_DRIVERS = \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>  	$(TOP)/src/gallium/winsys/nouveau/drm/libnouveaudrm.a \
>  	$(TOP)/src/gallium/drivers/nvfx/libnvfx.a \
>  	$(TOP)/src/gallium/drivers/nv50/libnv50.a \
> @@ -16,6 +15,7 @@ PIPE_DRIVERS = \
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/xvmc-r300/Makefile
> b/src/gallium/targets/xvmc-r300/Makefile
> index 221335a..800f8d5 100644
> --- a/src/gallium/targets/xvmc-r300/Makefile
> +++ b/src/gallium/targets/xvmc-r300/Makefile
> @@ -3,15 +3,17 @@ include $(TOP)/configs/current
>  
>  LIBBASENAME = XvMCr300
>  
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
> +
>  PIPE_DRIVERS = \
>          $(TOP)/src/gallium/drivers/r300/libr300.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
>          $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
>          $(TOP)/src/gallium/drivers/trace/libtrace.a \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/xvmc-r600/Makefile
> b/src/gallium/targets/xvmc-r600/Makefile
> index 6667120..d9ce72f 100644
> --- a/src/gallium/targets/xvmc-r600/Makefile
> +++ b/src/gallium/targets/xvmc-r600/Makefile
> @@ -3,15 +3,17 @@ include $(TOP)/configs/current
>  
>  LIBBASENAME = XvMCr600
>  
> +DRIVER_INCLUDES = $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
> +
>  PIPE_DRIVERS = \
> -        $(TOP)/src/gallium/drivers/r600/libr600.a \
> -	$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
> +	$(TOP)/src/gallium/drivers/r600/libr600.a \
>  	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
> -        $(TOP)/src/gallium/drivers/trace/libtrace.a \
> +	$(TOP)/src/gallium/drivers/trace/libtrace.a \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
>  	target.c \
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_dri.c \
>  	$(COMMON_GALLIUM_SOURCES) \
>  	$(DRIVER_SOURCES)
>  
> diff --git a/src/gallium/targets/xvmc-softpipe/Makefile
> b/src/gallium/targets/xvmc-softpipe/Makefile
> index 5b60bed..35db16f 100644
> --- a/src/gallium/targets/xvmc-softpipe/Makefile
> +++ b/src/gallium/targets/xvmc-softpipe/Makefile
> @@ -12,7 +12,7 @@ PIPE_DRIVERS = \
>  	$(TOP)/src/gallium/auxiliary/libgallium.a
>  
>  C_SOURCES = \
> -	$(TOP)/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> +	$(TOP)/src/gallium/auxiliary/vl/vl_winsys_xsp.c
>  
>  DRIVER_LIBS =
>  
> diff --git a/src/gallium/winsys/g3dvl/Makefile
> b/src/gallium/winsys/g3dvl/Makefile
> deleted file mode 100644
> index 6c793e0..0000000
> --- a/src/gallium/winsys/g3dvl/Makefile
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -# src/gallium/winsys/Makefile
> -TOP = ../../../..
> -include $(TOP)/configs/current
> -
> -SUBDIRS = $(GALLIUM_STATE_TRACKERS_DIRS) $(GALLIUM_WINSYS_DIRS)
> -
> -default install clean:
> -	@for dir in $(SUBDIRS) ; do \
> -		if [ -d $$dir ] ; then \
> -			(cd $$dir && $(MAKE) $@) || exit 1; \
> -		fi \
> -	done
> diff --git a/src/gallium/winsys/g3dvl/dri/Makefile
> b/src/gallium/winsys/g3dvl/dri/Makefile
> deleted file mode 100644
> index 43abcd9..0000000
> --- a/src/gallium/winsys/g3dvl/dri/Makefile
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -TOP = ../../../../..
> -include $(TOP)/configs/current
> -
> -LIBNAME = vldri
> -
> -LIBRARY_INCLUDES = -I$(TOP)/src/gallium/winsys/g3dvl \
> -                   $(shell $(PKG_CONFIG) libdrm --cflags-only-I)
> -
> -C_SOURCES = \
> -	dri_winsys.c
> -
> -include ../../../Makefile.template
> diff --git a/src/gallium/winsys/g3dvl/dri/dri_winsys.c
> b/src/gallium/winsys/g3dvl/dri/dri_winsys.c
> deleted file mode 100644
> index afaabaa..0000000
> --- a/src/gallium/winsys/g3dvl/dri/dri_winsys.c
> +++ /dev/null
> @@ -1,396 +0,0 @@
> -/**************************************************************************
> - *
> - * Copyright 2009 Younes Manton.
> - * All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person
> obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction,
> including
> - * without limitation the rights to use, copy, modify, merge,
> publish,
> - * distribute, sub license, and/or sell copies of the Software, and
> to
> - * permit persons to whom the Software is furnished to do so,
> subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including
> the
> - * next paragraph) shall be included in all copies or substantial
> portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> -
> **************************************************************************/
> -
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <fcntl.h>
> -
> -#include <X11/Xlib-xcb.h>
> -#include <xcb/dri2.h>
> -#include <xf86drm.h>
> -
> -#include "pipe/p_screen.h"
> -#include "pipe/p_context.h"
> -#include "pipe/p_state.h"
> -#include "state_tracker/drm_driver.h"
> -
> -#include "util/u_memory.h"
> -#include "util/u_hash.h"
> -#include "util/u_hash_table.h"
> -#include "util/u_inlines.h"
> -
> -#include "vl/vl_compositor.h"
> -#include "vl_winsys.h"
> -
> -struct vl_dri_screen
> -{
> -   struct vl_screen base;
> -   xcb_connection_t *conn;
> -   xcb_drawable_t drawable;
> -
> -   unsigned width, height;
> -
> -   bool current_buffer;
> -   uint32_t buffer_names[2];
> -   struct u_rect dirty_areas[2];
> -
> -   bool flushed;
> -   xcb_dri2_swap_buffers_cookie_t swap_cookie;
> -   xcb_dri2_wait_sbc_cookie_t wait_cookie;
> -   xcb_dri2_get_buffers_cookie_t buffers_cookie;
> -
> -   int64_t last_ust, ns_frame, last_msc, next_msc, skew_msc;
> -};
> -
> -static const unsigned int attachments[1] = {
> XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT };
> -
> -static void
> -vl_dri2_handle_stamps(struct vl_dri_screen* scrn,
> -                      uint32_t ust_hi, uint32_t ust_lo,
> -                      uint32_t msc_hi, uint32_t msc_lo)
> -{
> -   int64_t ust = ((((uint64_t)ust_hi) << 32) | ust_lo) * 1000;
> -   int64_t msc = (((uint64_t)msc_hi) << 32) | msc_lo;
> -
> -   if (scrn->last_ust && scrn->last_msc && (ust > scrn->last_ust) &&
> (msc > scrn->last_msc))
> -      scrn->ns_frame = (ust - scrn->last_ust) / (msc -
> scrn->last_msc);
> -
> -   if (scrn->next_msc && (scrn->next_msc < msc))
> -      scrn->skew_msc++;
> -
> -   scrn->last_ust = ust;
> -   scrn->last_msc = msc;
> -}
> -
> -static xcb_dri2_get_buffers_reply_t*
> -vl_dri2_get_flush_reply(struct vl_dri_screen *scrn)
> -{
> -   xcb_dri2_wait_sbc_reply_t *wait_sbc_reply;
> -
> -   assert(scrn);
> -
> -   if (!scrn->flushed)
> -      return NULL;
> -
> -   scrn->flushed = false;
> -
> -   free(xcb_dri2_swap_buffers_reply(scrn->conn, scrn->swap_cookie,
> NULL));
> -
> -   wait_sbc_reply = xcb_dri2_wait_sbc_reply(scrn->conn,
> scrn->wait_cookie, NULL);
> -   if (!wait_sbc_reply)
> -      return NULL;
> -   vl_dri2_handle_stamps(scrn, wait_sbc_reply->ust_hi,
> wait_sbc_reply->ust_lo,
> -                         wait_sbc_reply->msc_hi,
> wait_sbc_reply->msc_lo);
> -   free(wait_sbc_reply);
> -
> -   return xcb_dri2_get_buffers_reply(scrn->conn,
> scrn->buffers_cookie, NULL);
> -}
> -
> -static void
> -vl_dri2_flush_frontbuffer(struct pipe_screen *screen,
> -                          struct pipe_resource *resource,
> -                          unsigned level, unsigned layer,
> -                          void *context_private)
> -{
> -   struct vl_dri_screen *scrn = (struct
> vl_dri_screen*)context_private;
> -   uint32_t msc_hi, msc_lo;
> -
> -   assert(screen);
> -   assert(resource);
> -   assert(context_private);
> -
> -   free(vl_dri2_get_flush_reply(scrn));
> -
> -   msc_hi = scrn->next_msc >> 32;
> -   msc_lo = scrn->next_msc & 0xFFFFFFFF;
> -
> -   scrn->swap_cookie = xcb_dri2_swap_buffers_unchecked(scrn->conn,
> scrn->drawable, msc_hi, msc_lo, 0, 0, 0, 0);
> -   scrn->wait_cookie = xcb_dri2_wait_sbc_unchecked(scrn->conn,
> scrn->drawable, 0, 0);
> -   scrn->buffers_cookie = xcb_dri2_get_buffers_unchecked(scrn->conn,
> scrn->drawable, 1, 1, attachments);
> -
> -   scrn->flushed = true;
> -   scrn->current_buffer = !scrn->current_buffer;
> -}
> -
> -static void
> -vl_dri2_destroy_drawable(struct vl_dri_screen *scrn)
> -{
> -   xcb_void_cookie_t destroy_cookie;
> -   if (scrn->drawable) {
> -      free(vl_dri2_get_flush_reply(scrn));
> -      destroy_cookie = xcb_dri2_destroy_drawable_checked(scrn->conn,
> scrn->drawable);
> -      /* ignore any error here, since the drawable can be destroyed
> long ago */
> -      free(xcb_request_check(scrn->conn, destroy_cookie));
> -   }
> -}
> -
> -static void
> -vl_dri2_set_drawable(struct vl_dri_screen *scrn, Drawable drawable)
> -{
> -   assert(scrn);
> -   assert(drawable);
> -
> -   if (scrn->drawable == drawable)
> -      return;
> -
> -   vl_dri2_destroy_drawable(scrn);
> -
> -   xcb_dri2_create_drawable(scrn->conn, drawable);
> -   scrn->current_buffer = false;
> -   vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> -   vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> -   scrn->drawable = drawable;
> -}
> -
> -struct pipe_resource*
> -vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable)
> -{
> -   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> -
> -   struct winsys_handle dri2_handle;
> -   struct pipe_resource template, *tex;
> -
> -   xcb_dri2_get_buffers_reply_t *reply;
> -   xcb_dri2_dri2_buffer_t *buffers, *back_left;
> -
> -   unsigned i;
> -
> -   assert(scrn);
> -
> -   vl_dri2_set_drawable(scrn, drawable);
> -   reply = vl_dri2_get_flush_reply(scrn);
> -   if (!reply) {
> -      xcb_dri2_get_buffers_cookie_t cookie;
> -      cookie = xcb_dri2_get_buffers_unchecked(scrn->conn, drawable,
> 1, 1, attachments);
> -      reply = xcb_dri2_get_buffers_reply(scrn->conn, cookie, NULL);
> -   }
> -   if (!reply)
> -      return NULL;
> -
> -   buffers = xcb_dri2_get_buffers_buffers(reply);
> -   if (!buffers)  {
> -      free(reply);
> -      return NULL;
> -   }
> -
> -   for (i = 0; i < reply->count; ++i) {
> -      if (buffers[i].attachment ==
> XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT) {
> -         back_left = &buffers[i];
> -         break;
> -      }
> -   }
> -
> -   if (i == reply->count) {
> -      free(reply);
> -      return NULL;
> -   }
> -
> -   if (reply->width != scrn->width || reply->height != scrn->height)
> {
> -      vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> -      vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> -      scrn->width = reply->width;
> -      scrn->height = reply->height;
> -
> -   } else if (back_left->name !=
> scrn->buffer_names[scrn->current_buffer]) {
> -
>      vl_compositor_reset_dirty_area(&scrn->dirty_areas[scrn->current_buffer]);
> -      scrn->buffer_names[scrn->current_buffer] = back_left->name;
> -   }
> -
> -   memset(&dri2_handle, 0, sizeof(dri2_handle));
> -   dri2_handle.type = DRM_API_HANDLE_TYPE_SHARED;
> -   dri2_handle.handle = back_left->name;
> -   dri2_handle.stride = back_left->pitch;
> -
> -   memset(&template, 0, sizeof(template));
> -   template.target = PIPE_TEXTURE_2D;
> -   template.format = PIPE_FORMAT_B8G8R8X8_UNORM;
> -   template.last_level = 0;
> -   template.width0 = reply->width;
> -   template.height0 = reply->height;
> -   template.depth0 = 1;
> -   template.array_size = 1;
> -   template.usage = PIPE_USAGE_STATIC;
> -   template.bind = PIPE_BIND_RENDER_TARGET;
> -   template.flags = 0;
> -
> -   tex =
> scrn->base.pscreen->resource_from_handle(scrn->base.pscreen,
> &template, &dri2_handle);
> -   free(reply);
> -
> -   return tex;
> -}
> -
> -struct u_rect *
> -vl_screen_get_dirty_area(struct vl_screen *vscreen)
> -{
> -   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> -   assert(scrn);
> -   return &scrn->dirty_areas[scrn->current_buffer];
> -}
> -
> -uint64_t
> -vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable)
> -{
> -   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> -   xcb_dri2_get_msc_cookie_t cookie;
> -   xcb_dri2_get_msc_reply_t *reply;
> -
> -   assert(scrn);
> -
> -   vl_dri2_set_drawable(scrn, drawable);
> -   if (!scrn->last_ust) {
> -      cookie = xcb_dri2_get_msc_unchecked(scrn->conn, drawable);
> -      reply = xcb_dri2_get_msc_reply(scrn->conn, cookie, NULL);
> -
> -      if (reply) {
> -         vl_dri2_handle_stamps(scrn, reply->ust_hi, reply->ust_lo,
> -                               reply->msc_hi, reply->msc_lo);
> -         free(reply);
> -      }
> -   }
> -   return scrn->last_ust;
> -}
> -
> -void
> -vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp)
> -{
> -   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> -   assert(scrn);
> -   if (stamp && scrn->last_ust && scrn->ns_frame && scrn->last_msc)
> -      scrn->next_msc = ((int64_t)stamp - scrn->last_ust) /
> scrn->ns_frame + scrn->last_msc + scrn->skew_msc;
> -   else
> -      scrn->next_msc = 0;
> -}
> -
> -void*
> -vl_screen_get_private(struct vl_screen *vscreen)
> -{
> -   return vscreen;
> -}
> -
> -struct vl_screen*
> -vl_screen_create(Display *display, int screen)
> -{
> -   struct vl_dri_screen *scrn;
> -   const xcb_query_extension_reply_t *extension;
> -   xcb_dri2_query_version_cookie_t dri2_query_cookie;
> -   xcb_dri2_query_version_reply_t *dri2_query = NULL;
> -   xcb_dri2_connect_cookie_t connect_cookie;
> -   xcb_dri2_connect_reply_t *connect = NULL;
> -   xcb_dri2_authenticate_cookie_t authenticate_cookie;
> -   xcb_dri2_authenticate_reply_t *authenticate = NULL;
> -   xcb_screen_iterator_t s;
> -   xcb_generic_error_t *error = NULL;
> -   char *device_name;
> -   int fd;
> -
> -   drm_magic_t magic;
> -
> -   assert(display);
> -
> -   scrn = CALLOC_STRUCT(vl_dri_screen);
> -   if (!scrn)
> -      return NULL;
> -
> -   scrn->conn = XGetXCBConnection(display);
> -   if (!scrn->conn)
> -      goto free_screen;
> -
> -   xcb_prefetch_extension_data(scrn->conn, &xcb_dri2_id);
> -
> -   extension = xcb_get_extension_data(scrn->conn, &xcb_dri2_id);
> -   if (!(extension && extension->present))
> -      goto free_screen;
> -
> -   dri2_query_cookie = xcb_dri2_query_version (scrn->conn,
> XCB_DRI2_MAJOR_VERSION, XCB_DRI2_MINOR_VERSION);
> -   dri2_query = xcb_dri2_query_version_reply (scrn->conn,
> dri2_query_cookie, &error);
> -   if (dri2_query == NULL || error != NULL ||
> dri2_query->minor_version < 2)
> -      goto free_screen;
> -
> -   s = xcb_setup_roots_iterator(xcb_get_setup(scrn->conn));
> -   connect_cookie = xcb_dri2_connect_unchecked(scrn->conn,
> s.data->root, XCB_DRI2_DRIVER_TYPE_DRI);
> -   connect = xcb_dri2_connect_reply(scrn->conn, connect_cookie,
> NULL);
> -   if (connect == NULL || connect->driver_name_length +
> connect->device_name_length == 0)
> -      goto free_screen;
> -
> -   device_name = xcb_dri2_connect_device_name(connect);
> -   device_name = strndup(device_name,
> xcb_dri2_connect_device_name_length(connect));
> -   fd = open(device_name, O_RDWR);
> -   free(device_name);
> -
> -   if (fd < 0)
> -      goto free_screen;
> -
> -   if (drmGetMagic(fd, &magic))
> -      goto free_screen;
> -
> -   authenticate_cookie = xcb_dri2_authenticate_unchecked(scrn->conn,
> s.data->root, magic);
> -   authenticate = xcb_dri2_authenticate_reply(scrn->conn,
> authenticate_cookie, NULL);
> -
> -   if (authenticate == NULL || !authenticate->authenticated)
> -      goto free_screen;
> -
> -   scrn->base.pscreen = driver_descriptor.create_screen(fd);
> -   if (!scrn->base.pscreen)
> -      goto free_screen;
> -
> -   scrn->base.pscreen->flush_frontbuffer =
> vl_dri2_flush_frontbuffer;
> -   vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
> -   vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
> -
> -   free(dri2_query);
> -   free(connect);
> -   free(authenticate);
> -
> -   return &scrn->base;
> -
> -free_screen:
> -   FREE(scrn);
> -
> -   free(dri2_query);
> -   free(connect);
> -   free(authenticate);
> -   free(error);
> -
> -   return NULL;
> -}
> -
> -void vl_screen_destroy(struct vl_screen *vscreen)
> -{
> -   struct vl_dri_screen *scrn = (struct vl_dri_screen*)vscreen;
> -
> -   assert(vscreen);
> -
> -   if (scrn->flushed) {
> -      free(xcb_dri2_swap_buffers_reply(scrn->conn,
> scrn->swap_cookie, NULL));
> -      free(xcb_dri2_wait_sbc_reply(scrn->conn, scrn->wait_cookie,
> NULL));
> -      free(xcb_dri2_get_buffers_reply(scrn->conn,
> scrn->buffers_cookie, NULL));
> -   }
> -
> -   vl_dri2_destroy_drawable(scrn);
> -   scrn->base.pscreen->destroy(scrn->base.pscreen);
> -   FREE(scrn);
> -}
> diff --git a/src/gallium/winsys/g3dvl/vl_winsys.h
> b/src/gallium/winsys/g3dvl/vl_winsys.h
> deleted file mode 100644
> index 174f780..0000000
> --- a/src/gallium/winsys/g3dvl/vl_winsys.h
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -/**************************************************************************
> - *
> - * Copyright 2009 Younes Manton.
> - * All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person
> obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction,
> including
> - * without limitation the rights to use, copy, modify, merge,
> publish,
> - * distribute, sub license, and/or sell copies of the Software, and
> to
> - * permit persons to whom the Software is furnished to do so,
> subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including
> the
> - * next paragraph) shall be included in all copies or substantial
> portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> -
> **************************************************************************/
> -
> -#ifndef vl_winsys_h
> -#define vl_winsys_h
> -
> -#include <X11/Xlib.h>
> -#include "pipe/p_defines.h"
> -#include "pipe/p_format.h"
> -
> -struct pipe_screen;
> -struct pipe_surface;
> -
> -struct vl_screen
> -{
> -   struct pipe_screen *pscreen;
> -};
> -
> -struct vl_screen*
> -vl_screen_create(Display *display, int screen);
> -
> -void vl_screen_destroy(struct vl_screen *vscreen);
> -
> -struct pipe_resource*
> -vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable);
> -
> -struct u_rect *
> -vl_screen_get_dirty_area(struct vl_screen *vscreen);
> -
> -uint64_t
> -vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable);
> -
> -void
> -vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp);
> -
> -void*
> -vl_screen_get_private(struct vl_screen *vscreen);
> -
> -#endif
> diff --git a/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> b/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> deleted file mode 100644
> index 1d5d1ea..0000000
> --- a/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/**************************************************************************
> - *
> - * Copyright 2009 Younes Manton.
> - * All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person
> obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction,
> including
> - * without limitation the rights to use, copy, modify, merge,
> publish,
> - * distribute, sub license, and/or sell copies of the Software, and
> to
> - * permit persons to whom the Software is furnished to do so,
> subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including
> the
> - * next paragraph) shall be included in all copies or substantial
> portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NON-INFRINGEMENT.
> - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE
> LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> -
> **************************************************************************/
> -
> -#include <sys/time.h>
> -
> -#include "pipe/p_state.h"
> -
> -#include "util/u_memory.h"
> -#include "util/u_format.h"
> -#include "util/u_inlines.h"
> -
> -#include "state_tracker/xlib_sw_winsys.h"
> -#include "softpipe/sp_public.h"
> -
> -#include "vl/vl_compositor.h"
> -#include "vl_winsys.h"
> -
> -struct vl_xsp_screen
> -{
> -   struct vl_screen base;
> -   Display *display;
> -   int screen;
> -   Visual visual;
> -   struct xlib_drawable xdraw;
> -   struct pipe_resource *tex;
> -   struct u_rect dirty_area;
> -};
> -
> -struct pipe_resource*
> -vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable
> drawable)
> -{
> -   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> -   Window root;
> -   int x, y;
> -   unsigned int width, height;
> -   unsigned int border_width;
> -   unsigned int depth;
> -   struct pipe_resource templat;
> -
> -   assert(vscreen);
> -   assert(drawable != None);
> -
> -   if (XGetGeometry(xsp_screen->display, drawable, &root, &x, &y,
> &width, &height, &border_width, &depth) == BadDrawable)
> -      return NULL;
> -
> -   xsp_screen->xdraw.drawable = drawable;
> -
> -   if (xsp_screen->tex) {
> -      if (xsp_screen->tex->width0 == width &&
> xsp_screen->tex->height0 == height)
> -         return xsp_screen->tex;
> -      pipe_resource_reference(&xsp_screen->tex, NULL);
> -      vl_compositor_reset_dirty_area(&xsp_screen->dirty_area);
> -   }
> -
> -   memset(&templat, 0, sizeof(struct pipe_resource));
> -   templat.target = PIPE_TEXTURE_2D;
> -   /* XXX: Need to figure out drawable's format */
> -   templat.format = PIPE_FORMAT_B8G8R8X8_UNORM;
> -   templat.last_level = 0;
> -   templat.width0 = width;
> -   templat.height0 = height;
> -   templat.depth0 = 1;
> -   templat.usage = PIPE_USAGE_DEFAULT;
> -   templat.bind = PIPE_BIND_RENDER_TARGET |
> PIPE_BIND_DISPLAY_TARGET;
> -   templat.flags = 0;
> -
> -   xsp_screen->xdraw.depth =
> 24/*util_format_get_blocksizebits(templat.format) /
> -
>                             util_format_get_blockwidth(templat.format)*/;
> -
> -   pipe_resource_reference(&xsp_screen->tex,
> vscreen->pscreen->resource_create(vscreen->pscreen, &templat));
> -   return xsp_screen->tex;
> -}
> -
> -struct u_rect *
> -vl_screen_get_dirty_area(struct vl_screen *vscreen)
> -{
> -   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> -   return &xsp_screen->dirty_area;
> -}
> -
> -uint64_t
> -vl_screen_get_timestamp(struct vl_screen *vscreen, Drawable
> drawable)
> -{
> -   struct timeval tv;
> -   gettimeofday(&tv, NULL);
> -   return (uint64_t)tv.tv_sec * 1000000000LL + (uint64_t)tv.tv_usec
> * 1000LL;
> -}
> -
> -void
> -vl_screen_set_next_timestamp(struct vl_screen *vscreen, uint64_t
> stamp)
> -{
> -   /* not supported on softpipe and so only a dummy */
> -}
> -
> -void*
> -vl_screen_get_private(struct vl_screen *vscreen)
> -{
> -   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> -   return &xsp_screen->xdraw;
> -}
> -
> -struct vl_screen*
> -vl_screen_create(Display *display, int screen)
> -{
> -   struct vl_xsp_screen *xsp_screen;
> -   struct sw_winsys *winsys;
> -
> -   assert(display);
> -
> -   xsp_screen = CALLOC_STRUCT(vl_xsp_screen);
> -   if (!xsp_screen)
> -      return NULL;
> -
> -   winsys = xlib_create_sw_winsys(display);
> -   if (!winsys) {
> -      FREE(xsp_screen);
> -      return NULL;
> -   }
> -
> -   xsp_screen->base.pscreen = softpipe_create_screen(winsys);
> -   if (!xsp_screen->base.pscreen) {
> -      winsys->destroy(winsys);
> -      FREE(xsp_screen);
> -      return NULL;
> -   }
> -
> -   xsp_screen->display = display;
> -   xsp_screen->screen = screen;
> -   xsp_screen->xdraw.visual = XDefaultVisual(display, screen);
> -   vl_compositor_reset_dirty_area(&xsp_screen->dirty_area);
> -
> -   return &xsp_screen->base;
> -}
> -
> -void vl_screen_destroy(struct vl_screen *vscreen)
> -{
> -   struct vl_xsp_screen *xsp_screen = (struct
> vl_xsp_screen*)vscreen;
> -
> -   assert(vscreen);
> -
> -   pipe_resource_reference(&xsp_screen->tex, NULL);
> -   vscreen->pscreen->destroy(vscreen->pscreen);
> -   FREE(vscreen);
> -}
> --
> 1.7.5.4
> 
> 


More information about the mesa-dev mailing list