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

Christian König deathsimple at vodafone.de
Tue Mar 27 01:43:24 PDT 2012


They aren't winsys of their own,
just help dealing with them.

Signed-off-by: Christian König <deathsimple at vodafone.de>
---
 configure.ac                                     |    7 -
 src/gallium/auxiliary/vl/vl_winsys.h             |   65 ++++
 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, 670 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..d2a49ea
--- /dev/null
+++ b/src/gallium/auxiliary/vl/vl_winsys.h
@@ -0,0 +1,65 @@
+/**************************************************************************
+ *
+ * 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 */
+
+#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