diff options
| author | James Meyer <james.meyer@operamail.com> | 2014-08-16 19:51:12 (GMT) | 
|---|---|---|
| committer | James Meyer <james.meyer@operamail.com> | 2014-08-16 19:51:12 (GMT) | 
| commit | 4bcecbbe9042ee7b2d002525e53b4af86abb8139 (patch) | |
| tree | 793c257dcf6419d40639d9eb8b360d079775c13b | |
| parent | b89c550af6853616fbc83bd61744b2b2b04c6875 (diff) | |
| download | linhes_pkgbuild-4bcecbbe9042ee7b2d002525e53b4af86abb8139.zip linhes_pkgbuild-4bcecbbe9042ee7b2d002525e53b4af86abb8139.tar.gz linhes_pkgbuild-4bcecbbe9042ee7b2d002525e53b4af86abb8139.tar.bz2 | |
xf86-video-vmware: 13.0.1  updated due to mesa update to 10
| -rw-r--r-- | abs/core/xf86-video-vmware/PKGBUILD | 30 | ||||
| -rw-r--r-- | abs/core/xf86-video-vmware/git_fixes.diff | 894 | ||||
| -rw-r--r-- | abs/core/xf86-video-vmware/xatracker-v2-fixes.patch | 1583 | 
3 files changed, 1601 insertions, 906 deletions
| diff --git a/abs/core/xf86-video-vmware/PKGBUILD b/abs/core/xf86-video-vmware/PKGBUILD index fe55462..488d62a 100644 --- a/abs/core/xf86-video-vmware/PKGBUILD +++ b/abs/core/xf86-video-vmware/PKGBUILD @@ -1,31 +1,37 @@ -# $Id: PKGBUILD 168595 2012-10-13 11:46:27Z andyrtr $ +# $Id: PKGBUILD 202951 2013-12-29 08:00:15Z andyrtr $  # Maintainer: Jan de Groot <jgc@archlinux.org>  pkgname=xf86-video-vmware -pkgver=12.0.2 -pkgrel=2 +pkgver=13.0.1 +pkgrel=3  pkgdesc="X.org vmware video driver"  arch=(i686 x86_64)  url="http://xorg.freedesktop.org/"  license=('custom') -depends=('libdrm' 'svga-dri' 'mesa') -makedepends=('xorg-server-devel' 'X-ABI-VIDEODRV_VERSION=13' 'resourceproto' 'scrnsaverproto') +depends=('libdrm' 'svga-dri' 'mesa>=10.0') +makedepends=('xorg-server-devel' 'X-ABI-VIDEODRV_VERSION=13')  conflicts=('xorg-server<1.13.0' 'X-ABI-VIDEODRV_VERSION<13' 'X-ABI-VIDEODRV_VERSION>=14')  groups=('xorg-drivers' 'xorg') -options=('!libtool' '!emptydirs') -source=(${url}/releases/individual/driver/${pkgname}-${pkgver}.tar.bz2 git_fixes.diff) -sha1sums=('efa47f365d88da245804a9934719ff860ed04f95' -          'ad475b37e2614f365533a40da0fb5b9e2709e3c6') +options=('!emptydirs') +source=(${url}/releases/individual/driver/${pkgname}-${pkgver}.tar.bz2 +	xatracker-v2-fixes.patch) +sha256sums=('802dda415c22412edad6c3df44fe18a06e91d0f8456d9a58bac0d340fdf8fe3d' +            '7ab392cbc6258dc36df14ef60072c655d850bcfb6885111b41bcfe25dc1faacc') + +prepare() { +  cd ${pkgname}-${pkgver} +  # grab from upstream git repo, needed for mesa>10.0 +  patch -Np1 -i ../xatracker-v2-fixes.patch +}  build() { -  cd "${srcdir}/${pkgname}-${pkgver}" -  patch -Np1 -i ${srcdir}/git_fixes.diff +  cd ${pkgname}-${pkgver}    ./configure --prefix=/usr --enable-vmwarectrl-client    make  }  package() { -  cd "${srcdir}/${pkgname}-${pkgver}" +  cd ${pkgname}-${pkgver}    make DESTDIR="${pkgdir}" install    install -m755 -d "${pkgdir}/usr/share/licenses/${pkgname}" diff --git a/abs/core/xf86-video-vmware/git_fixes.diff b/abs/core/xf86-video-vmware/git_fixes.diff deleted file mode 100644 index 8589416..0000000 --- a/abs/core/xf86-video-vmware/git_fixes.diff +++ /dev/null @@ -1,894 +0,0 @@ -From 46cdf0ed0ad9df66f36f95e27b209d454f67d526 Mon Sep 17 00:00:00 2001 -From: Brian Paul <brianp@vmware.com> -Date: Fri, 20 Apr 2012 20:24:26 +0000 -Subject: vmwgfx: set the XA_FLAG_SHARED flag for composite dest surfaces - -This fixes a failed assertion in the gallium/svga driver in the -svga_texture_get_handle() function.  The texture resource wasn't -getting created with the PIPE_BIND_SHARED flag so the !cachable -assertion would fail and the X session would abort.  This didn't -happen with release builds. - -Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> ---- -diff --git a/vmwgfx/vmwgfx_xa_surface.c b/vmwgfx/vmwgfx_xa_surface.c -index 2a18762..8b30e45 100644 ---- a/vmwgfx/vmwgfx_xa_surface.c -+++ b/vmwgfx/vmwgfx_xa_surface.c -@@ -148,7 +148,7 @@ vmwgfx_hw_composite_dst_stage(PixmapPtr pixmap, -  -     vpix->staging_format = format; -     vpix->staging_remove_flags = 0; --    vpix->staging_add_flags = XA_FLAG_RENDER_TARGET; -+    vpix->staging_add_flags = XA_FLAG_RENDER_TARGET | XA_FLAG_SHARED; -  -     return TRUE; - } --- -cgit v0.9.0.2-2-gbebe -From 61df95a86f4997e342d50d7779b00aba2e8849a6 Mon Sep 17 00:00:00 2001 -From: Dave Airlie <airlied@redhat.com> -Date: Wed, 06 Jun 2012 08:58:01 +0000 -Subject: vmware: port vmware driver to new compat API - -This is a port of the vmware driver to the new compat API. - -Tested-by: Jakob Bornecrantz <jakob@vmware.com> -Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> -Signed-off-by: Dave Airlie <airlied@redhat.com> -Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> ---- -diff --git a/saa/saa.c b/saa/saa.c -index 173c090..f2d68e9 100644 ---- a/saa/saa.c -+++ b/saa/saa.c -@@ -594,7 +594,7 @@ saa_set_fallback_debug(ScreenPtr screen, Bool enable) -  * screen private, before calling down to the next CloseScreen. -  */ - Bool --saa_close_screen(int i, ScreenPtr pScreen) -+saa_close_screen(CLOSE_SCREEN_ARGS_DECL) - { -     struct saa_screen_priv *sscreen = saa_screen(pScreen); -     struct saa_driver *driver = sscreen->driver; -@@ -624,7 +624,7 @@ saa_close_screen(int i, ScreenPtr pScreen) -  -     free(sscreen); -  --    return (*pScreen->CloseScreen) (i, pScreen); -+    return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); - } -  - struct saa_driver * -diff --git a/saa/saa.h b/saa/saa.h -index c7aa3b6..4e5ced5 100644 ---- a/saa/saa.h -+++ b/saa/saa.h -@@ -44,6 +44,8 @@ - #include <damage.h> - #include <picturestr.h> -  -+#include "../src/compat-api.h" -+ - #define SAA_VERSION_MAJOR 0 - #define SAA_VERSION_MINOR 1 -  -@@ -173,7 +175,7 @@ extern _X_EXPORT RegionPtr - saa_bitmap_to_region(PixmapPtr pPix); -  - extern _X_EXPORT Bool --saa_close_screen(int i, ScreenPtr pScreen); -+saa_close_screen(CLOSE_SCREEN_ARGS_DECL); -  - extern _X_EXPORT Bool - saa_gc_reads_destination(DrawablePtr pDrawable, GCPtr pGC); -diff --git a/src/Makefile.am b/src/Makefile.am -index 04c9e0d..b0dd147 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -37,6 +37,7 @@ endif - vmware_drv_la_SOURCES = \ - 	bits2pixels.c \ - 	bits2pixels.h \ -+	compat-api.h \ - 	guest_os.h \ - 	includeCheck.h \ - 	svga_escape.h \ -diff --git a/src/compat-api.h b/src/compat-api.h -new file mode 100644 -index 0000000..6bc946f ---- a/dev/null -+++ b/src/compat-api.h -@@ -0,0 +1,99 @@ -+/* -+ * Copyright 2012 Red Hat, Inc. -+ * -+ * 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, sublicense, -+ * 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 NONINFRINGEMENT.  IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS 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. -+ * -+ * Author: Dave Airlie <airlied@redhat.com> -+ */ -+ -+/* this file provides API compat between server post 1.13 and pre it, -+   it should be reused inside as many drivers as possible */ -+#ifndef COMPAT_API_H -+#define COMPAT_API_H -+ -+#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR -+#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum] -+#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p -+#endif -+ -+#ifndef XF86_HAS_SCRN_CONV -+#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum] -+#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex] -+#endif -+ -+#ifndef XF86_SCRN_INTERFACE -+ -+#define SCRN_ARG_TYPE int -+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)] -+ -+#define SCREEN_ARG_TYPE int -+#define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)] -+ -+#define SCREEN_INIT_ARGS_DECL int i, ScreenPtr pScreen, int argc, char **argv -+ -+#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask -+#define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask -+ -+#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen -+#define CLOSE_SCREEN_ARGS scrnIndex, pScreen -+ -+#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags -+#define ADJUST_FRAME_ARGS(arg, x, y) (arg)->scrnIndex, x, y, 0 -+ -+#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags -+#define SWITCH_MODE_ARGS(arg, m) (arg)->scrnIndex, m, 0 -+ -+#define FREE_SCREEN_ARGS_DECL int arg, int flags -+ -+#define VT_FUNC_ARGS_DECL int arg, int flags -+#define VT_FUNC_ARGS pScrn->scrnIndex, 0 -+ -+#define XF86_SCRN_ARG(x) ((x)->scrnIndex) -+#else -+#define SCRN_ARG_TYPE ScrnInfoPtr -+#define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1) -+ -+#define SCREEN_ARG_TYPE ScreenPtr -+#define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1) -+ -+#define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv -+ -+#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask -+#define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask -+ -+#define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen -+#define CLOSE_SCREEN_ARGS pScreen -+ -+#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y -+#define ADJUST_FRAME_ARGS(arg, x, y) arg, x, y -+ -+#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode -+#define SWITCH_MODE_ARGS(arg, m) arg, m -+ -+#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg -+ -+#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg -+#define VT_FUNC_ARGS pScrn -+ -+#define XF86_SCRN_ARG(x) (x) -+ -+#endif -+ -+#endif -diff --git a/src/vmware.c b/src/vmware.c -index e3892f1..41201f1 100644 ---- a/src/vmware.c -+++ b/src/vmware.c -@@ -901,8 +901,8 @@ VMWAREModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool rebuildPixmap) -                                                          pScrn->pScreen->rootDepth), -                                            (pointer)(pVMWARE->FbBase + pScrn->fbOffset)); -  --        (*pScrn->EnableDisableFBAccess)(pScrn->pScreen->myNum, FALSE); --        (*pScrn->EnableDisableFBAccess)(pScrn->pScreen->myNum, TRUE); -+        (*pScrn->EnableDisableFBAccess)(XF86_SCRN_ARG(pScrn), FALSE); -+        (*pScrn->EnableDisableFBAccess)(XF86_SCRN_ARG(pScrn), TRUE); -     } -  -     vgaHWProtect(pScrn, FALSE); -@@ -1018,7 +1018,7 @@ vmwareNextXineramaState(VMWAREPtr pVMWARE) - } -  - static void --VMWAREAdjustFrame(int scrnIndex, int x, int y, int flags) -+VMWAREAdjustFrame(ADJUST_FRAME_ARGS_DECL) - { -     /* FIXME */ - } -@@ -1089,9 +1089,9 @@ VMWAREStopFIFO(ScrnInfoPtr pScrn) - } -  - static Bool --VMWARECloseScreen(int scrnIndex, ScreenPtr pScreen) -+VMWARECloseScreen(CLOSE_SCREEN_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -     ScreenPtr save = &pVMWARE->ScrnFuncs; -  -@@ -1119,7 +1119,7 @@ VMWARECloseScreen(int scrnIndex, ScreenPtr pScreen) -     pScrn->DriverFunc = NULL; - #endif -  --    return (*pScreen->CloseScreen)(scrnIndex, pScreen); -+    return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS); - } -  - static Bool -@@ -1296,16 +1296,14 @@ vmwareIsRegionEqual(const RegionPtr reg1, - } -  - static Bool --VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) -+VMWAREScreenInit(SCREEN_INIT_ARGS_DECL) - { --    ScrnInfoPtr pScrn; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     vgaHWPtr hwp; -     VMWAREPtr pVMWARE; -     OptionInfoPtr options; -     Bool useXinerama = TRUE; -  --    /* Get the ScrnInfoRec */ --    pScrn = xf86Screens[pScreen->myNum]; -     pVMWARE = VMWAREPTR(pScrn); -  -  -@@ -1381,7 +1379,7 @@ VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) -     VMWAREModeInit(pScrn, pScrn->currentMode, FALSE); -  -     /* Set the viewport if supported */ --    VMWAREAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -+    VMWAREAdjustFrame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0)); -  -     /* -      * Setup the screen's visuals, and initialise the framebuffer -@@ -1582,10 +1580,9 @@ VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) - } -  - static Bool --VMWARESwitchMode(int scrnIndex, DisplayModePtr mode, int flags) -- -+VMWARESwitchMode(SWITCH_MODE_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -     ScreenPtr pScreen = pScrn->pScreen; -  -     pScreen->mmWidth = (pScreen->width * VMWARE_INCHTOMM + -@@ -1597,9 +1594,9 @@ VMWARESwitchMode(int scrnIndex, DisplayModePtr mode, int flags) - } -  - static Bool --VMWAREEnterVT(int scrnIndex, int flags) -+VMWAREEnterVT(VT_FUNC_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -  -     /* -@@ -1616,9 +1613,9 @@ VMWAREEnterVT(int scrnIndex, int flags) - } -  - static void --VMWARELeaveVT(int scrnIndex, int flags) -+VMWARELeaveVT(VT_FUNC_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -  -     /* -@@ -1631,17 +1628,18 @@ VMWARELeaveVT(int scrnIndex, int flags) - } -  - static void --VMWAREFreeScreen(int scrnIndex, int flags) -+VMWAREFreeScreen(FREE_SCREEN_ARGS_DECL) - { -+    SCRN_INFO_PTR(arg); -     /* -      * If the vgahw module is used vgaHWFreeHWRec() would be called -      * here. -      */ --   VMWAREFreeRec(xf86Screens[scrnIndex]); -+   VMWAREFreeRec(pScrn); - } -  - static ModeStatus --VMWAREValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) -+VMWAREValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags) - { -     return MODE_OK; - } -diff --git a/src/vmware.h b/src/vmware.h -index 458390a..4818e16 100644 ---- a/src/vmware.h -+++ b/src/vmware.h -@@ -177,7 +177,7 @@ typedef struct { - #define VMWAREPTR(p) ((VMWAREPtr)((p)->driverPrivate)) -  - static __inline ScrnInfoPtr infoFromScreen(ScreenPtr s) { --    return xf86Screens[s->myNum]; -+    return xf86ScreenToScrn(s); - } -  - #define MIN(a,b) ((a)<(b)?(a):(b)) -diff --git a/src/vmware_common.h b/src/vmware_common.h -index 9cd7194..5629c10 100644 ---- a/src/vmware_common.h -+++ b/src/vmware_common.h -@@ -32,6 +32,8 @@ - #include <X11/extensions/panoramiXproto.h> - #include <xf86.h> -  -+#include "compat-api.h" -+ - xXineramaScreenInfo * - VMWAREParseTopologyString(ScrnInfoPtr pScrn, -                           const char *topology, -diff --git a/vmwgfx/vmwgfx_dri2.c b/vmwgfx/vmwgfx_dri2.c -index 1b82ac4..7de0772 100644 ---- a/vmwgfx/vmwgfx_dri2.c -+++ b/vmwgfx/vmwgfx_dri2.c -@@ -83,7 +83,7 @@ static Bool - dri2_do_create_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer, unsigned int format) - { -     ScreenPtr pScreen = pDraw->pScreen; --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -     BufferPrivatePtr private = buffer->driverPrivate; -     PixmapPtr pPixmap; -@@ -371,7 +371,7 @@ dri2_copy_region(DrawablePtr pDraw, RegionPtr pRegion, - Bool - xorg_dri2_init(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -     DRI2InfoRec dri2info; -     int major, minor; -diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c -index ed1eb8c..9959ffb 100644 ---- a/vmwgfx/vmwgfx_driver.c -+++ b/vmwgfx/vmwgfx_driver.c -@@ -107,14 +107,13 @@ typedef uint8_t uint8; -  */ -  - static Bool drv_pre_init(ScrnInfoPtr pScrn, int flags); --static Bool drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, --			    char **argv); --static Bool drv_switch_mode(int scrnIndex, DisplayModePtr mode, int flags); --static void drv_adjust_frame(int scrnIndex, int x, int y, int flags); --static Bool drv_enter_vt(int scrnIndex, int flags); --static void drv_leave_vt(int scrnIndex, int flags); --static void drv_free_screen(int scrnIndex, int flags); --static ModeStatus drv_valid_mode(int scrnIndex, DisplayModePtr mode, Bool verbose, -+static Bool drv_screen_init(SCREEN_INIT_ARGS_DECL); -+static Bool drv_switch_mode(SWITCH_MODE_ARGS_DECL); -+static void drv_adjust_frame(ADJUST_FRAME_ARGS_DECL); -+static Bool drv_enter_vt(VT_FUNC_ARGS_DECL); -+static void drv_leave_vt(VT_FUNC_ARGS_DECL); -+static void drv_free_screen(FREE_SCREEN_ARGS_DECL); -+static ModeStatus drv_valid_mode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, - 			         int flags); -  - extern void xorg_tracker_set_functions(ScrnInfoPtr scrn); -@@ -133,7 +132,7 @@ vmwgfx_hookup(ScrnInfoPtr pScrn) -  * Internal function definitions -  */ -  --static Bool drv_close_screen(int scrnIndex, ScreenPtr pScreen); -+static Bool drv_close_screen(CLOSE_SCREEN_ARGS_DECL); -  - /* -  * Internal functions -@@ -633,7 +632,7 @@ vmwgfx_scanout_present(ScreenPtr pScreen, int drm_fd, -  - void xorg_flush(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); -     PixmapPtr pixmap = NULL; -@@ -708,14 +707,13 @@ void xorg_flush(ScreenPtr pScreen) -     free(pixmaps); - } -  --static void drv_block_handler(int i, pointer blockData, pointer pTimeout, --                              pointer pReadmask) -+static void drv_block_handler(BLOCKHANDLER_ARGS_DECL) - { --    ScreenPtr pScreen = screenInfo.screens[i]; --    modesettingPtr ms = modesettingPTR(xf86Screens[pScreen->myNum]); -+    SCREEN_PTR(arg); -+    modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen)); -  -     vmwgfx_swap(ms, pScreen, BlockHandler); --    pScreen->BlockHandler(i, blockData, pTimeout, pReadmask); -+    pScreen->BlockHandler(BLOCKHANDLER_ARGS); -     vmwgfx_swap(ms, pScreen, BlockHandler); -  -     vmwgfx_flush_dri2(pScreen); -@@ -725,7 +723,7 @@ static void drv_block_handler(int i, pointer blockData, pointer pTimeout, - static Bool - drv_create_screen_resources(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -     Bool ret; -  -@@ -735,9 +733,9 @@ drv_create_screen_resources(ScreenPtr pScreen) -     if (!ret) - 	return ret; -  --    drv_adjust_frame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); -+    drv_adjust_frame(ADJUST_FRAME_ARGS(pScrn, pScrn->frameX0, pScrn->frameY0)); -  --    return drv_enter_vt(pScreen->myNum, 1); -+    return drv_enter_vt(VT_FUNC_ARGS); - } -  - static Bool -@@ -773,7 +771,7 @@ drv_set_master(ScrnInfoPtr pScrn) - static Bool - vmwgfx_use_hw_cursor_argb(ScreenPtr screen, CursorPtr cursor) - { --    ScrnInfoPtr pScrn = xf86Screens[screen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(screen); -     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); -     xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; -     modesettingPtr ms = modesettingPTR(pScrn); -@@ -804,7 +802,7 @@ vmwgfx_use_hw_cursor_argb(ScreenPtr screen, CursorPtr cursor) - static Bool - vmwgfx_use_hw_cursor(ScreenPtr screen, CursorPtr cursor) - { --    ScrnInfoPtr pScrn = xf86Screens[screen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(screen); -     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); -     xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; -     modesettingPtr ms = modesettingPTR(pScrn); -@@ -902,9 +900,9 @@ static void drv_load_palette(ScrnInfoPtr pScrn, int numColors, -  -  - static Bool --drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) -+drv_screen_init(SCREEN_INIT_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -     VisualPtr visual; -  -@@ -1088,9 +1086,9 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) - } -  - static void --drv_adjust_frame(int scrnIndex, int x, int y, int flags) -+drv_adjust_frame(ADJUST_FRAME_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); -     xf86OutputPtr output = config->output[config->compat_output]; -     xf86CrtcPtr crtc = output->crtc; -@@ -1104,15 +1102,16 @@ drv_adjust_frame(int scrnIndex, int x, int y, int flags) - } -  - static void --drv_free_screen(int scrnIndex, int flags) -+drv_free_screen(FREE_SCREEN_ARGS_DECL) - { --    drv_free_rec(xf86Screens[scrnIndex]); -+    SCRN_INFO_PTR(arg); -+    drv_free_rec(pScrn); - } -  - static void --drv_leave_vt(int scrnIndex, int flags) -+drv_leave_vt(VT_FUNC_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -     modesettingPtr ms = modesettingPTR(pScrn); -  -     vmwgfx_cursor_bypass(ms->fd, 0, 0); -@@ -1130,9 +1129,9 @@ drv_leave_vt(int scrnIndex, int flags) -  * This gets called when gaining control of the VT, and from ScreenInit(). -  */ - static Bool --drv_enter_vt(int scrnIndex, int flags) -+drv_enter_vt(VT_FUNC_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -  -     if (!drv_set_master(pScrn)) - 	return FALSE; -@@ -1144,17 +1143,17 @@ drv_enter_vt(int scrnIndex, int flags) - } -  - static Bool --drv_switch_mode(int scrnIndex, DisplayModePtr mode, int flags) -+drv_switch_mode(SWITCH_MODE_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    SCRN_INFO_PTR(arg); -  -     return xf86SetSingleMode(pScrn, mode, RR_Rotate_0); - } -  - static Bool --drv_close_screen(int scrnIndex, ScreenPtr pScreen) -+drv_close_screen(CLOSE_SCREEN_ARGS_DECL) - { --    ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     modesettingPtr ms = modesettingPTR(pScrn); -  -     if (ms->cursor) { -@@ -1166,7 +1165,7 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen) - 	xorg_dri2_close(pScreen); -  -     if (pScrn->vtSema) --	pScrn->LeaveVT(scrnIndex, 0); -+        pScrn->LeaveVT(VT_FUNC_ARGS); -  -     pScrn->vtSema = FALSE; -  -@@ -1180,11 +1179,11 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen) -     if (ms->xat) - 	xa_tracker_destroy(ms->xat); -  --    return (*pScreen->CloseScreen) (scrnIndex, pScreen); -+    return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); - } -  - static ModeStatus --drv_valid_mode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) -+drv_valid_mode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags) - { -     return MODE_OK; - } -diff --git a/vmwgfx/vmwgfx_driver.h b/vmwgfx/vmwgfx_driver.h -index 4fcfed6..f78a85f 100644 ---- a/vmwgfx/vmwgfx_driver.h -+++ b/vmwgfx/vmwgfx_driver.h -@@ -46,6 +46,7 @@ - #include <xa_tracker.h> - #include <xf86Module.h> -  -+#include "../src/compat-api.h" - #ifdef DRI2 - #include <dri2.h> - #if (!defined(DRI2INFOREC_VERSION) || (DRI2INFOREC_VERSION < 3)) -@@ -118,9 +119,9 @@ typedef struct _modesettingRec -     ScreenBlockHandlerProcPtr saved_BlockHandler; -     CreateScreenResourcesProcPtr saved_CreateScreenResources; -     CloseScreenProcPtr saved_CloseScreen; --    Bool (*saved_EnterVT)(int, int); --    void (*saved_LeaveVT)(int, int); --    void (*saved_AdjustFrame)(int, int, int, int); -+    Bool (*saved_EnterVT)(VT_FUNC_ARGS_DECL); -+    void (*saved_LeaveVT)(VT_FUNC_ARGS_DECL); -+    void (*saved_AdjustFrame)(ADJUST_FRAME_ARGS_DECL); -     Bool (*saved_UseHWCursor)(ScreenPtr, CursorPtr); -     Bool (*saved_UseHWCursorARGB)(ScreenPtr, CursorPtr); -  -diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c -index 469598a..63df3a1 100644 ---- a/vmwgfx/vmwgfx_saa.c -+++ b/vmwgfx/vmwgfx_saa.c -@@ -460,7 +460,7 @@ vmwgfx_flush_dri2(ScreenPtr pScreen) -     struct vmwgfx_saa *vsaa = - 	to_vmwgfx_saa(saa_get_driver(pScreen)); -     struct _WsbmListHead *list, *next; --    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -  -     if (!pScrn->vtSema) - 	return; -@@ -1199,7 +1199,7 @@ vmwgfx_operation_complete(struct saa_driver *driver, -     struct vmwgfx_saa *vsaa = to_vmwgfx_saa(driver); -     struct saa_pixmap *spix = saa_get_saa_pixmap(pixmap); -     struct vmwgfx_saa_pixmap *vpix = to_vmwgfx_saa_pixmap(spix); --    ScrnInfoPtr pScrn = xf86Screens[vsaa->pScreen->myNum]; -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(vsaa->pScreen); -  -     /* -      * Make dri2 drawables up to date, or add them to the flush list -diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c -index af53379..449266b 100644 ---- a/vmwgfx/vmwgfx_tex_video.c -+++ b/vmwgfx/vmwgfx_tex_video.c -@@ -638,7 +638,7 @@ put_image(ScrnInfoPtr pScrn, -           DrawablePtr pDraw) - { -    struct xorg_xv_port_priv *pPriv = (struct xorg_xv_port_priv *) data; --   ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; -+   ScreenPtr pScreen = xf86ScrnToScreen(pScrn); -    PixmapPtr pPixmap; -    INT32 x1, x2, y1, y2; -    BoxRec dstBox; -@@ -732,7 +732,7 @@ vmwgfx_free_textured_adaptor(XF86VideoAdaptorPtr adaptor, Bool free_ports) - static XF86VideoAdaptorPtr - xorg_setup_textured_adapter(ScreenPtr pScreen) - { --   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -    modesettingPtr ms = modesettingPTR(pScrn); -    XF86VideoAdaptorPtr adapt; -    XF86AttributePtr attrs; -@@ -799,7 +799,7 @@ xorg_setup_textured_adapter(ScreenPtr pScreen) - void - xorg_xv_init(ScreenPtr pScreen) - { --   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+   ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -    modesettingPtr ms = modesettingPTR(pScrn); -    XF86VideoAdaptorPtr *adaptors, *new_adaptors = NULL; -    XF86VideoAdaptorPtr textured_adapter = NULL, overlay_adaptor = NULL; --- -cgit v0.9.0.2-2-gbebe -From 50c01998c7800bc02fd6656cc14efa715bf63e08 Mon Sep 17 00:00:00 2001 -From: Robert Hooker <sarvatt@ubuntu.com> -Date: Fri, 15 Jun 2012 15:56:59 +0000 -Subject: vmware: Fix up some warnings after new compat API change. - -Fixes multiple instances of these warnings on x86_64: -../../src/vmware.h:180:5: warning: implicit declaration of function 'xf86ScreenToScrn' [-Wimplicit-function-declaration] -../../src/vmware.h:180:5: warning: nested extern declaration of 'xf86ScreenToScrn' [-Wnested-externs] -../../src/vmware.h:180:5: warning: return makes pointer from integer without a cast [enabled by default] -Function `xf86ScreenToScrn' implicitly converted to pointer at ../../src/vmware.h:180 - -Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> -Signed-off-by: Robert Hooker <sarvatt@ubuntu.com> -Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> ---- -diff --git a/src/vmware.h b/src/vmware.h -index 4818e16..be113bb 100644 ---- a/src/vmware.h -+++ b/src/vmware.h -@@ -18,6 +18,7 @@ - #include "xf86.h" - #include "xf86_OSproc.h" -  -+#include "compat-api.h" -  - #include <X11/extensions/panoramiXproto.h> -  --- -cgit v0.9.0.2-2-gbebe -From 46c0862d205eefa985e36a74391ca392640cb898 Mon Sep 17 00:00:00 2001 -From: Dave Airlie <airlied@redhat.com> -Date: Sat, 16 Jun 2012 13:43:52 +0000 -Subject: vmware: drop infoFromScreen inline in favour of new interface - -This also should fix the build regression introduced with the fix -for this macro. - -Signed-off-by: Dave Airlie <airlied@redhat.com> ---- -diff --git a/src/vmware.h b/src/vmware.h -index be113bb..028dff3 100644 ---- a/src/vmware.h -+++ b/src/vmware.h -@@ -18,8 +18,6 @@ - #include "xf86.h" - #include "xf86_OSproc.h" -  --#include "compat-api.h" -- - #include <X11/extensions/panoramiXproto.h> -  - #ifdef XSERVER_LIBPCIACCESS -@@ -177,10 +175,6 @@ typedef struct { -  - #define VMWAREPTR(p) ((VMWAREPtr)((p)->driverPrivate)) -  --static __inline ScrnInfoPtr infoFromScreen(ScreenPtr s) { --    return xf86ScreenToScrn(s); --} -- - #define MIN(a,b) ((a)<(b)?(a):(b)) - #define MAX(a,b) ((a)>(b)?(a):(b)) - #define ABS(x) (((x) >= 0) ? (x) : -(x)) -diff --git a/src/vmwarecurs.c b/src/vmwarecurs.c -index 2e2effb..93dacc0 100644 ---- a/src/vmwarecurs.c -+++ b/src/vmwarecurs.c -@@ -12,6 +12,7 @@ char rcsId_vmwarecurs[] = - #endif -  - #include "vmware.h" -+#include "vmware_common.h" - #include "bits2pixels.h" -  - static void VMWAREGetImage(DrawablePtr src, int x, int y, int w, int h, -@@ -110,7 +111,7 @@ vmwareSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) - static Bool - vmwareUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) - { --    ScrnInfoPtr pScrn = infoFromScreen(pScreen); -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -     VmwareLog(("UseHWCursor new cursor %p refcnt %i old cursor %p refcnt %i\n", -               pCurs, pCurs->refcnt, pVMWARE->oldCurs, pVMWARE->oldCurs ? pVMWARE->oldCurs->refcnt : 0)); -@@ -145,7 +146,7 @@ vmwareLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src ) - static Bool - vmwareUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs) - { --    ScrnInfoPtr pScrn = infoFromScreen(pScreen); -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -     VmwareLog(("UseHWCursorARGB new cursor %p refcnt %i old cursor %p refcnt %i\n", -               pCurs, pCurs->refcnt, pVMWARE->oldCurs, pVMWARE->oldCurs ? pVMWARE->oldCurs->refcnt : 0)); -@@ -283,7 +284,7 @@ Bool - vmwareCursorInit(ScreenPtr pScreen) - { -     xf86CursorInfoPtr infoPtr; --    VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); -+    VMWAREPtr pVMWARE = VMWAREPTR(xf86ScreenToScrn(pScreen)); -     Bool ret; -  -     TRACEPOINT -@@ -330,7 +331,7 @@ vmwareCursorInit(ScreenPtr pScreen) - void - vmwareCursorCloseScreen(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = infoFromScreen(pScreen); -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); - #ifdef RENDER -     PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); -@@ -356,7 +357,7 @@ vmwareCursorCloseScreen(ScreenPtr pScreen) - void - vmwareCursorHookWrappers(ScreenPtr pScreen) - { --    VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); -+    VMWAREPtr pVMWARE = VMWAREPTR(xf86ScreenToScrn(pScreen)); - #ifdef RENDER -     PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); - #endif -@@ -382,7 +383,7 @@ VMWAREGetImage(DrawablePtr src, int x, int y, int w, int h, -                unsigned int format, unsigned long planeMask, char *pBinImage) - { -     ScreenPtr pScreen = src->pScreen; --    VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(src->pScreen)); -+    VMWAREPtr pVMWARE = VMWAREPTR(xf86ScreenToScrn(src->pScreen)); -     BoxRec box; -     Bool hidden = FALSE; -      -@@ -412,7 +413,7 @@ static void - VMWARECopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) - { -     ScreenPtr pScreen = pWin->drawable.pScreen; --    VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pWin->drawable.pScreen)); -+    VMWAREPtr pVMWARE = VMWAREPTR(xf86ScreenToScrn(pWin->drawable.pScreen)); -     BoxPtr pBB; -     Bool hidden = FALSE; -      -@@ -448,7 +449,7 @@ VMWAREComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, - 		CARD16 width, CARD16 height) - { -     ScreenPtr pScreen = pDst->pDrawable->pScreen; --    VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); -+    VMWAREPtr pVMWARE = VMWAREPTR(xf86ScreenToScrn(pScreen)); -     PictureScreenPtr ps = GetPictureScreen(pScreen); -     BoxRec box; -     Bool hidden = FALSE; -diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c -index 71f21fe..745c71f 100644 ---- a/src/vmwarevideo.c -+++ b/src/vmwarevideo.c -@@ -39,6 +39,7 @@ - #endif -  - #include "vmware.h" -+#include "vmware_common.h" - #include "xf86xv.h" - #include "fourcc.h" - #include "svga_escape.h" -@@ -435,7 +436,7 @@ vmwareVideoEnabled(VMWAREPtr pVMWARE) - Bool - vmwareVideoInit(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = infoFromScreen(pScreen); -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL; -     XF86VideoAdaptorPtr newAdaptor = NULL; -     int numAdaptors; -@@ -504,7 +505,7 @@ vmwareVideoInit(ScreenPtr pScreen) - void - vmwareVideoEnd(ScreenPtr pScreen) - { --    ScrnInfoPtr pScrn = infoFromScreen(pScreen); -+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); -     VMWAREPtr pVMWARE = VMWAREPTR(pScrn); -     VMWAREVideoPtr pVid; -     int i; --- -cgit v0.9.0.2-2-gbebe -From e5ac80d8f72963313358e31cfb1ab98583e26f23 Mon Sep 17 00:00:00 2001 -From: Dave Airlie <airlied@redhat.com> -Date: Tue, 03 Jul 2012 12:50:30 +0000 -Subject: vmware: avoid warnings about shadowing 'i' - -Signed-off-by: Dave Airlie <airlied@redhat.com> ---- -diff --git a/src/compat-api.h b/src/compat-api.h -index 6bc946f..205ac59 100644 ---- a/src/compat-api.h -+++ b/src/compat-api.h -@@ -46,7 +46,7 @@ - #define SCREEN_ARG_TYPE int - #define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)] -  --#define SCREEN_INIT_ARGS_DECL int i, ScreenPtr pScreen, int argc, char **argv -+#define SCREEN_INIT_ARGS_DECL int scrnIndex, ScreenPtr pScreen, int argc, char **argv -  - #define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask - #define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask --- -cgit v0.9.0.2-2-gbebe -From 007bed30270ca9548dfe6e359972b56cbb8e2f13 Mon Sep 17 00:00:00 2001 -From: Jakob Bornecrantz <jakob@vmware.com> -Date: Tue, 29 May 2012 21:01:14 +0000 -Subject: vmwgfx: Guard against null rotate pixmap in shadow destroy - -Reviewed-by: Thomas Hellström <thellstrom@vmware.com> -Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> ---- -diff --git a/vmwgfx/vmwgfx_crtc.c b/vmwgfx/vmwgfx_crtc.c -index eaf87b2..fec04c0 100644 ---- a/vmwgfx/vmwgfx_crtc.c -+++ b/vmwgfx/vmwgfx_crtc.c -@@ -250,8 +250,12 @@ crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) - static void - crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) - { --    ScreenPtr pScreen = rotate_pixmap->drawable.pScreen; -+    ScreenPtr pScreen; -  -+    if (rotate_pixmap == NULL) -+        return; -+ -+    pScreen = rotate_pixmap->drawable.pScreen; -     pScreen->DestroyPixmap(rotate_pixmap); - } -  --- -cgit v0.9.0.2-2-gbebe diff --git a/abs/core/xf86-video-vmware/xatracker-v2-fixes.patch b/abs/core/xf86-video-vmware/xatracker-v2-fixes.patch new file mode 100644 index 0000000..9b8ed54 --- /dev/null +++ b/abs/core/xf86-video-vmware/xatracker-v2-fixes.patch @@ -0,0 +1,1583 @@ +From 0945bea5fc32eacb7bf42639efbd45dcd43e7ab5 Mon Sep 17 00:00:00 2001 +From: Rob Clark <robdclark@gmail.com> +Date: Mon, 10 Jun 2013 13:31:31 -0400 +Subject: [PATCH 01/11] vmwgfx: update for XA API changes + +Signed-off-by: Rob Clark <robdclark@gmail.com> +Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +Tested-by: Jakob Bornecrantz <jakob@vmware.com> +--- + configure.ac              |  2 +- + vmwgfx/vmwgfx_dri2.c      |  5 +++-- + vmwgfx/vmwgfx_driver.c    |  3 ++- + vmwgfx/vmwgfx_saa.c       | 20 ++++++++++++++------ + vmwgfx/vmwgfx_tex_video.c |  5 +++-- + 5 files changed, 23 insertions(+), 12 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 0631bcc..dccfb27 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -118,7 +118,7 @@ if test x$BUILD_VMWGFX = xyes; then + 	PKG_CHECK_MODULES([LIBDRM], [libdrm],[],[BUILD_VMWGFX=no]) + fi + if test x$BUILD_VMWGFX = xyes; then +-	PKG_CHECK_MODULES([XATRACKER], [xatracker >= 0.4.0],[],[BUILD_VMWGFX=no]) ++	PKG_CHECK_MODULES([XATRACKER], [xatracker >= 2.0.0],[],[BUILD_VMWGFX=no]) + fi +  + DRIVER_NAME=vmware +diff --git a/vmwgfx/vmwgfx_dri2.c b/vmwgfx/vmwgfx_dri2.c +index 7de0772..2f007f0 100644 +--- a/vmwgfx/vmwgfx_dri2.c ++++ b/vmwgfx/vmwgfx_dri2.c +@@ -201,7 +201,8 @@ dri2_do_create_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer, unsigned int for +     } +  +     private->srf = srf; +-    if (xa_surface_handle(srf, &buffer->name, &buffer->pitch) != 0) ++    if (xa_surface_handle(srf, xa_handle_type_shared, ++	    &buffer->name, &buffer->pitch) != 0) + 	return FALSE; +  +     buffer->cpp = xa_format_depth(xa_surface_format(srf)) / 8; +@@ -222,7 +223,7 @@ dri2_do_destroy_buffer(DrawablePtr pDraw, DRI2BufferPtr buffer) +     struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(private->pPixmap); +  +     if (--private->refcount == 0 && srf) { +-	xa_surface_destroy(srf); ++	xa_surface_unref(srf); +     } +  +     /* +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index 7863ba2..3002285 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -617,7 +617,8 @@ vmwgfx_scanout_present(ScreenPtr pScreen, int drm_fd, + 	return FALSE; +     } +  +-    if (xa_surface_handle(vpix->hw, &handle, &dummy) != 0) { ++    if (xa_surface_handle(vpix->hw, xa_handle_type_shared, ++	    &handle, &dummy) != 0) { + 	LogMessage(X_ERROR, "Could not get present surface handle.\n"); + 	return FALSE; +     } +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 63df3a1..ed3c1ee 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -140,7 +140,7 @@ vmwgfx_pixmap_free_storage(struct vmwgfx_saa_pixmap *vpix) + 	vpix->malloc = NULL; +     } +     if (!(vpix->backing & VMWGFX_PIX_SURFACE) && vpix->hw) { +-	xa_surface_destroy(vpix->hw); ++	xa_surface_unref(vpix->hw); + 	vpix->hw = NULL; +     } +     if (!(vpix->backing & VMWGFX_PIX_GMR) && vpix->gmr) { +@@ -286,7 +286,8 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa, +     if (vpix->gmr && vsaa->can_optimize_dma) { + 	uint32_t handle, dummy; +  +-	if (xa_surface_handle(vpix->hw, &handle, &dummy) != 0) ++	if (xa_surface_handle(vpix->hw, xa_handle_type_shared, ++		 &handle, &dummy) != 0) + 	    goto out_err; + 	if (vmwgfx_dma(0, 0, reg, vpix->gmr, pixmap->devKind, handle, + 		       to_hw) != 0) +@@ -305,6 +306,8 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa, + 			     (int) to_hw, + 			     (struct xa_box *) REGION_RECTS(reg), + 			     REGION_NUM_RECTS(reg)); ++	if (to_hw) ++	    xa_context_flush(vsaa->xa_ctx); + 	if (vpix->gmr) + 	    vmwgfx_dmabuf_unmap(vpix->gmr); + 	if (ret) +@@ -441,7 +444,7 @@ vmwgfx_hw_kill(struct vmwgfx_saa *vsaa, + 				 &spix->dirty_hw)) + 	return FALSE; +  +-    xa_surface_destroy(vpix->hw); ++    xa_surface_unref(vpix->hw); +     vpix->hw = NULL; +  +     /* +@@ -683,7 +686,8 @@ vmwgfx_present_prepare(struct vmwgfx_saa *vsaa, +  +     (void) pScreen; +     if (src_vpix == dst_vpix || !src_vpix->hw || +-	xa_surface_handle(src_vpix->hw, &vsaa->src_handle, &dummy) != 0) ++	xa_surface_handle(src_vpix->hw, xa_handle_type_shared, ++		&vsaa->src_handle, &dummy) != 0) + 	return FALSE; +  +     REGION_NULL(pScreen, &vsaa->present_region); +@@ -784,7 +788,7 @@ vmwgfx_create_hw(struct vmwgfx_saa *vsaa, +     return TRUE; +  + out_no_damage: +-    xa_surface_destroy(hw); ++    xa_surface_unref(hw); +     return FALSE; + } +  +@@ -929,6 +933,7 @@ vmwgfx_copy_prepare(struct saa_driver *driver, +  + 	if (!vmwgfx_hw_validate(src_pixmap, src_reg)) { + 	    xa_copy_done(vsaa->xa_ctx); ++	    xa_context_flush(vsaa->xa_ctx); + 	    return FALSE; + 	} +  +@@ -1029,6 +1034,7 @@ vmwgfx_copy_done(struct saa_driver *driver) + 	return; +     } +     xa_copy_done(vsaa->xa_ctx); ++    xa_context_flush(vsaa->xa_ctx); + } +  + static Bool +@@ -1175,6 +1181,7 @@ vmwgfx_composite_done(struct saa_driver *driver) +    struct vmwgfx_saa *vsaa = to_vmwgfx_saa(driver); +  +    xa_composite_done(vsaa->xa_ctx); ++   xa_context_flush(vsaa->xa_ctx); + } +  + static void +@@ -1436,7 +1443,8 @@ vmwgfx_scanout_ref(struct vmwgfx_screen_entry  *entry) + 	     */ + 	    if (!vmwgfx_hw_accel_validate(pixmap, 0, XA_FLAG_SCANOUT, 0, NULL)) + 		goto out_err; +-	    if (xa_surface_handle(vpix->hw, &handle, &dummy) != 0) ++	    if (xa_surface_handle(vpix->hw, xa_handle_type_shared, ++			 &handle, &dummy) != 0) + 		goto out_err; + 	    depth = xa_format_depth(xa_surface_format(vpix->hw)); +  +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index 449266b..2971ed7 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -199,7 +199,7 @@ stop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) +  +        for (i=0; i<3; ++i) { + 	   if (priv->yuv[i]) { +-	       xa_surface_destroy(priv->yuv[i]); ++	       xa_surface_unref(priv->yuv[i]); + 	       priv->yuv[i] = NULL; + 	   } + 	   for (j=0; j<2; ++j) { +@@ -539,7 +539,8 @@ copy_packed_data(ScrnInfoPtr pScrn, + 	       REGION_RESET(pScrn->pScreen, ®, &box); + 	   } +  +-	   if (xa_surface_handle(srf, &handle, &stride) != 0) { ++	   if (xa_surface_handle(srf, xa_handle_type_shared, ++			&handle, &stride) != 0) { + 	       ret = BadAlloc; + 	       break; + 	   } +--  +1.8.5.1 + + +From 835ce4698f916ba080f4132988fd4caf898e0b1e Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Thu, 26 Sep 2013 01:25:33 -0700 +Subject: [PATCH 02/11] vmwgfx: Avoid HW operations when not master + +Note that for DRI2, a dri2_copy_region becomes a NOP when not master. +Additionally, all dri2 operations that lead to a potential kernel +access will return FALSE. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + vmwgfx/vmwgfx_dri2.c       | 13 +++++++++++++ + vmwgfx/vmwgfx_driver.c     |  3 +++ + vmwgfx/vmwgfx_saa.c        | 44 +++++++++++++++++++++++++++++++++++++++++++- + vmwgfx/vmwgfx_saa.h        |  8 ++++++++ + vmwgfx/vmwgfx_saa_priv.h   |  2 ++ + vmwgfx/vmwgfx_xa_surface.c |  6 ++++++ + 6 files changed, 75 insertions(+), 1 deletion(-) + +diff --git a/vmwgfx/vmwgfx_dri2.c b/vmwgfx/vmwgfx_dri2.c +index 2f007f0..57f2d9d 100644 +--- a/vmwgfx/vmwgfx_dri2.c ++++ b/vmwgfx/vmwgfx_dri2.c +@@ -138,6 +138,8 @@ dri2_do_create_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer, unsigned int for +       return TRUE; +     case DRI2BufferStencil: +     case DRI2BufferDepthStencil: ++	if (!pScrn->vtSema) ++	    return FALSE; +  + 	depth = (format) ? vmwgfx_zs_format_to_depth(format) : 32; +  +@@ -155,6 +157,9 @@ dri2_do_create_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer, unsigned int for +  +        break; +     case DRI2BufferDepth: ++	if (!pScrn->vtSema) ++	    return FALSE; ++ + 	depth = (format) ? vmwgfx_z_format_to_depth(format) : + 	    pDraw->bitsPerPixel; +  +@@ -291,6 +296,14 @@ dri2_copy_region(DrawablePtr pDraw, RegionPtr pRegion, +     DrawablePtr dst_draw; +     RegionPtr myClip; +     GCPtr gc; ++    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ++ ++    /* ++     * This is a fragile protection against HW operations when not master. ++     * Needs to be blocked higher up in the dri2 code. ++     */ ++    if (!pScrn->vtSema) ++	return; +  +     /* +      * In driCreateBuffers we dewrap windows into the +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index 3002285..eeaea4b 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -1116,6 +1116,7 @@ drv_leave_vt(VT_FUNC_ARGS_DECL) +  +     vmwgfx_cursor_bypass(ms->fd, 0, 0); +     vmwgfx_disable_scanout(pScrn); ++    vmwgfx_saa_drop_master(pScrn->pScreen); +  +     if (drmDropMaster(ms->fd)) + 	xf86DrvMsg(pScrn->scrnIndex, X_WARNING, +@@ -1136,6 +1137,8 @@ drv_enter_vt(VT_FUNC_ARGS_DECL) +     if (!drv_set_master(pScrn)) + 	return FALSE; +  ++    vmwgfx_saa_set_master(pScrn->pScreen); ++ +     if (!xf86SetDesiredModes(pScrn)) + 	return FALSE; +  +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index ed3c1ee..5534ca3 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -423,6 +423,7 @@ vmwgfx_create_pixmap(struct saa_driver *driver, struct saa_pixmap *spix, +  +     WSBMINITLISTHEAD(&vpix->sync_x_head); +     WSBMINITLISTHEAD(&vpix->scanout_list); ++    WSBMINITLISTHEAD(&vpix->pixmap_list); +  +     return TRUE; + } +@@ -499,6 +500,7 @@ vmwgfx_destroy_pixmap(struct saa_driver *driver, PixmapPtr pixmap) +      */ +  +     vmwgfx_pixmap_remove_present(vpix); ++    WSBMLISTDELINIT(&vpix->pixmap_list); +     WSBMLISTDELINIT(&vpix->sync_x_head); +  +     if (vpix->hw_is_dri2_fronts) +@@ -627,6 +629,8 @@ vmwgfx_modify_pixmap_header (PixmapPtr pixmap, int w, int h, int depth, + 			     int bpp, int devkind, void *pixdata) + { +     struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); ++    ScreenPtr pScreen = pixmap->drawable.pScreen; ++    struct vmwgfx_saa *vsaa = to_vmwgfx_saa(saa_get_driver(pScreen)); +     unsigned int old_height; +     unsigned int old_width; +     unsigned int old_pitch; +@@ -670,6 +674,8 @@ vmwgfx_modify_pixmap_header (PixmapPtr pixmap, int w, int h, int depth, +  +     vmwgfx_pix_resize(pixmap, old_pitch, old_height, old_width); +     vmwgfx_pixmap_free_storage(vpix); ++    WSBMLISTADDTAIL(&vpix->pixmap_list, &vsaa->pixmaps); ++ +     return TRUE; +  +   out_no_modify: +@@ -860,7 +866,7 @@ vmwgfx_copy_prepare(struct saa_driver *driver, +     Bool has_valid_hw; +  +     if (!vsaa->xat || !SAA_PM_IS_SOLID(&dst_pixmap->drawable, plane_mask) || +-	alu != GXcopy) ++	alu != GXcopy || !vsaa->is_master) + 	return FALSE; +  +     src_vpix = vmwgfx_saa_pixmap(src_pixmap); +@@ -1057,6 +1063,9 @@ vmwgfx_composite_prepare(struct saa_driver *driver, CARD8 op, +     RegionRec empty; +     struct xa_composite *xa_comp; +  ++    if (!vsaa->is_master) ++	return FALSE; ++ +     REGION_NULL(pScreen, &empty); +  +     /* +@@ -1367,7 +1376,9 @@ vmwgfx_saa_init(ScreenPtr pScreen, int drm_fd, struct xa_tracker *xat, +     vsaa->use_present_opt = direct_presents; +     vsaa->only_hw_presents = only_hw_presents; +     vsaa->rendercheck = rendercheck; ++    vsaa->is_master = TRUE; +     WSBMINITLISTHEAD(&vsaa->sync_x_list); ++    WSBMINITLISTHEAD(&vsaa->pixmaps); +  +     vsaa->driver = vmwgfx_saa_driver; +     vsaa->vcomp = vmwgfx_alloc_composite(); +@@ -1518,3 +1529,34 @@ vmwgfx_scanout_unref(struct vmwgfx_screen_entry *entry) +     entry->pixmap = NULL; +     pixmap->drawable.pScreen->DestroyPixmap(pixmap); + } ++ ++void ++vmwgfx_saa_set_master(ScreenPtr pScreen) ++{ ++    struct vmwgfx_saa *vsaa = to_vmwgfx_saa(saa_get_driver(pScreen)); ++ ++    vsaa->is_master = TRUE; ++} ++ ++void ++vmwgfx_saa_drop_master(ScreenPtr pScreen) ++{ ++    struct vmwgfx_saa *vsaa = to_vmwgfx_saa(saa_get_driver(pScreen)); ++    struct _WsbmListHead *list; ++    struct vmwgfx_saa_pixmap *vpix; ++    struct saa_pixmap *spix; ++ ++    WSBMLISTFOREACH(list, &vsaa->pixmaps) { ++	vpix = WSBMLISTENTRY(list, struct vmwgfx_saa_pixmap, pixmap_list); ++	spix = &vpix->base; ++ ++	if (!vpix->hw) ++	    continue; ++ ++	(void) vmwgfx_download_from_hw(&vsaa->driver, spix->pixmap, ++				       &spix->dirty_hw); ++	REGION_EMPTY(draw->pScreen, &spix->dirty_hw); ++    } ++ ++    vsaa->is_master = FALSE; ++} +diff --git a/vmwgfx/vmwgfx_saa.h b/vmwgfx/vmwgfx_saa.h +index bb8ec96..d8aa3d3 100644 +--- a/vmwgfx/vmwgfx_saa.h ++++ b/vmwgfx/vmwgfx_saa.h +@@ -54,6 +54,7 @@ struct vmwgfx_saa_pixmap { +     int hw_is_dri2_fronts; +     struct _WsbmListHead sync_x_head; +     struct _WsbmListHead scanout_list; ++    struct _WsbmListHead pixmap_list; +  +     uint32_t xa_flags; +     uint32_t staging_add_flags; +@@ -107,4 +108,11 @@ Bool + vmwgfx_hw_accel_validate(PixmapPtr pixmap, unsigned int depth, + 			 uint32_t add_flags, uint32_t remove_flags, + 			 RegionPtr region); ++ ++void ++vmwgfx_saa_set_master(ScreenPtr pScreen); ++ ++void ++vmwgfx_saa_drop_master(ScreenPtr pScreen); ++ + #endif +diff --git a/vmwgfx/vmwgfx_saa_priv.h b/vmwgfx/vmwgfx_saa_priv.h +index 5f46dee..16583b0 100644 +--- a/vmwgfx/vmwgfx_saa_priv.h ++++ b/vmwgfx/vmwgfx_saa_priv.h +@@ -54,8 +54,10 @@ struct vmwgfx_saa { +     Bool use_present_opt; +     Bool only_hw_presents; +     Bool rendercheck; ++    Bool is_master; +     void (*present_flush) (ScreenPtr pScreen); +     struct _WsbmListHead sync_x_list; ++    struct _WsbmListHead pixmaps; +     struct vmwgfx_composite *vcomp; + }; +  +diff --git a/vmwgfx/vmwgfx_xa_surface.c b/vmwgfx/vmwgfx_xa_surface.c +index 8b30e45..2f23c57 100644 +--- a/vmwgfx/vmwgfx_xa_surface.c ++++ b/vmwgfx/vmwgfx_xa_surface.c +@@ -362,6 +362,12 @@ vmwgfx_hw_accel_validate(PixmapPtr pixmap, unsigned int depth, + Bool + vmwgfx_hw_dri2_validate(PixmapPtr pixmap, unsigned int depth) + { ++    struct vmwgfx_saa *vsaa = ++	to_vmwgfx_saa(saa_get_driver(pixmap->drawable.pScreen)); ++ ++    if (!vsaa->is_master) ++	    return FALSE; ++ +     return (vmwgfx_hw_dri2_stage(pixmap, depth) && + 	    vmwgfx_hw_commit(pixmap) && + 	    vmwgfx_hw_validate(pixmap, NULL)); +--  +1.8.5.1 + + +From 7192acf9f0bf8e7176ab0b803b861a858623f709 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Wed, 19 Sep 2012 20:36:57 +0200 +Subject: [PATCH 03/11] vmwgfx: Implement textured video completely on top of + XA. + +Remove device-specific hacks. This may increase resource usage a little +on old hardware revisions, but we don't need separate code paths on +different hardware revisions. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Zack Rusin <zackr@vmware.com> +--- + vmwgfx/vmwgfx_tex_video.c | 109 ++++++---------------------------------------- + 1 file changed, 14 insertions(+), 95 deletions(-) + +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index 2971ed7..a0a4f4a 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -111,8 +111,7 @@ struct xorg_xv_port_priv { +     int hue; +  +     int current_set; +-    struct vmwgfx_dmabuf *bounce[2][3]; +-    struct xa_surface *yuv[3]; ++    struct xa_surface *yuv[2][3]; +  +     int drm_fd; +  +@@ -198,14 +197,10 @@ stop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) +        priv->fence = NULL; +  +        for (i=0; i<3; ++i) { +-	   if (priv->yuv[i]) { +-	       xa_surface_unref(priv->yuv[i]); +-	       priv->yuv[i] = NULL; +-	   } + 	   for (j=0; j<2; ++j) { +-	       if (priv->bounce[j][i]) { +-		   vmwgfx_dmabuf_destroy(priv->bounce[j][i]); +-		   priv->bounce[0][i] = NULL; ++	       if (priv->yuv[i]) { ++		   xa_surface_unref(priv->yuv[j][i]); ++		   priv->yuv[j][i] = NULL; + 	       } + 	   } +        } +@@ -297,11 +292,9 @@ static int + check_yuv_surfaces(struct xorg_xv_port_priv *priv,  int id, + 		   int width, int height) + { +-    struct xa_surface **yuv = priv->yuv; +-    struct vmwgfx_dmabuf **bounce = priv->bounce[priv->current_set]; ++    struct xa_surface **yuv = priv->yuv[priv->current_set]; +     int ret = 0; +     int i; +-    size_t size; +  +     for (i=0; i<3; ++i) { +  +@@ -334,19 +327,6 @@ check_yuv_surfaces(struct xorg_xv_port_priv *priv,  int id, + 	if (ret || !yuv[i]) + 	    return BadAlloc; +  +-	size = width * height; +- +-	if (bounce[i] && (bounce[i]->size < size || +-			  bounce[i]->size > 2*size)) { +-	    vmwgfx_dmabuf_destroy(bounce[i]); +-	    bounce[i] = NULL; +-	} +- +-	if (!bounce[i]) { +-	    bounce[i] = vmwgfx_dmabuf_alloc(priv->drm_fd, size); +-	    if (!bounce[i]) +-		return BadAlloc; +-	} +     } +     return Success; + } +@@ -413,28 +393,20 @@ copy_packed_data(ScrnInfoPtr pScrn, +                  unsigned short w, unsigned short h) + { +     int i; +-   struct vmwgfx_dmabuf **bounce = port->bounce[port->current_set]; ++   struct xa_surface **yuv = port->yuv[port->current_set]; +    char *ymap, *vmap, *umap; +    unsigned char y1, y2, u, v; +    int yidx, uidx, vidx; +    int y_array_size = w * h; +    int ret = BadAlloc; +  +-   /* +-    * Here, we could use xa_surface_[map|unmap], but given the size of +-    * the yuv textures, that could stress the xa tracker dma buffer pool, +-    * particularaly with multiple videos rendering simultaneously. +-    * +-    * Instead, cheat and allocate vmwgfx dma buffers directly. +-    */ +- +-   ymap = (char *)vmwgfx_dmabuf_map(bounce[0]); ++   ymap = xa_surface_map(port->r, yuv[0], XA_MAP_WRITE); +    if (!ymap) +        return BadAlloc; +-   umap = (char *)vmwgfx_dmabuf_map(bounce[1]); ++   umap = xa_surface_map(port->r, yuv[1], XA_MAP_WRITE); +    if (!umap) +        goto out_no_umap; +-   vmap = (char *)vmwgfx_dmabuf_map(bounce[2]); ++   vmap = xa_surface_map(port->r, yuv[2], XA_MAP_WRITE); +    if (!vmap) +        goto out_no_vmap; +  +@@ -493,65 +465,11 @@ copy_packed_data(ScrnInfoPtr pScrn, +    } +  +    ret = Success; +-   vmwgfx_dmabuf_unmap(bounce[2]); ++   xa_surface_unmap(yuv[2]); +   out_no_vmap: +-   vmwgfx_dmabuf_unmap(bounce[1]); ++   xa_surface_unmap(yuv[1]); +   out_no_umap: +-   vmwgfx_dmabuf_unmap(bounce[0]); +- +-   if (ret == Success) { +-       struct xa_surface *srf; +-       struct vmwgfx_dmabuf *buf; +-       uint32_t handle; +-       unsigned int stride; +-       BoxRec box; +-       RegionRec reg; +- +-       box.x1 = 0; +-       box.x2 = w; +-       box.y1 = 0; +-       box.y2 = h; +- +-       REGION_INIT(pScrn->pScreen, ®, &box, 1); +- +-       for (i=0; i<3; ++i) { +-	   srf = port->yuv[i]; +-	   buf = bounce[i]; +- +-	   if (i == 1) { +-	       switch(id) { +-	       case FOURCC_YV12: +-		   h /= 2; +-		   /* Fall through */ +-	       case FOURCC_YUY2: +-	       case FOURCC_UYVY: +-		   w /= 2; +-		   break; +-	       default: +-		   break; +-	       } +- +-	       box.x1 = 0; +-	       box.x2 = w; +-	       box.y1 = 0; +-	       box.y2 = h; +- +-	       REGION_RESET(pScrn->pScreen, ®, &box); +-	   } +- +-	   if (xa_surface_handle(srf, xa_handle_type_shared, +-			&handle, &stride) != 0) { +-	       ret = BadAlloc; +-	       break; +-	   } +- +-	   if (vmwgfx_dma(0, 0, ®, buf, w, handle, 1) != 0) { +-	       ret = BadAlloc; +-	       break; +-	   } +-       } +-       REGION_UNINIT(pScrn->pScreen, ®); +-   } ++   xa_surface_unmap(yuv[0]); +  +    return ret; + } +@@ -610,7 +528,8 @@ display_video(ScreenPtr pScreen, struct xorg_xv_port_priv *pPriv, int id, + 				 (struct xa_box *)REGION_RECTS(dstRegion), + 				 REGION_NUM_RECTS(dstRegion), + 				 pPriv->cm, +-				 vpix->hw, pPriv->yuv); ++				 vpix->hw, ++				 pPriv->yuv[pPriv->current_set ]); +  +    saa_pixmap_dirty(pPixmap, TRUE, dstRegion); +    DamageRegionProcessPending(&pPixmap->drawable); +--  +1.8.5.1 + + +From 45b2457516a9db4bd1d60fbb24a1efbe2d9dd932 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Wed, 19 Sep 2012 21:50:40 +0200 +Subject: [PATCH 04/11] vmwgfx: Get rid of device-specific DMA code + +It's rarely used and things seem to work well enough on top of XA. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Zack Rusin <zackr@vmware.com> +--- + vmwgfx/vmwgfx_drmi.c     | 103 ----------------------------------------------- + vmwgfx/vmwgfx_drmi.h     |   5 --- + vmwgfx/vmwgfx_saa.c      |  53 ++++++++++++------------ + vmwgfx/vmwgfx_saa_priv.h |   1 - + 4 files changed, 26 insertions(+), 136 deletions(-) + +diff --git a/vmwgfx/vmwgfx_drmi.c b/vmwgfx/vmwgfx_drmi.c +index 496a16b..1e23f4a 100644 +--- a/vmwgfx/vmwgfx_drmi.c ++++ b/vmwgfx/vmwgfx_drmi.c +@@ -284,109 +284,6 @@ vmwgfx_dmabuf_destroy(struct vmwgfx_dmabuf *buf) + } +  + int +-vmwgfx_dma(unsigned int host_x, unsigned int host_y, +-	   RegionPtr region, struct vmwgfx_dmabuf *buf, +-	   uint32_t buf_pitch, uint32_t surface_handle, int to_surface) +-{ +-    BoxPtr clips = REGION_RECTS(region); +-    unsigned int num_clips = REGION_NUM_RECTS(region); +-    struct drm_vmw_execbuf_arg arg; +-    struct drm_vmw_fence_rep rep; +-    int ret; +-    unsigned int size; +-    unsigned i; +-    SVGA3dCopyBox *cb; +-    SVGA3dCmdSurfaceDMASuffix *suffix; +-    SVGA3dCmdSurfaceDMA *body; +-    struct vmwgfx_int_dmabuf *ibuf = vmwgfx_int_dmabuf(buf); +- +-    struct { +-	SVGA3dCmdHeader header; +-	SVGA3dCmdSurfaceDMA body; +-	SVGA3dCopyBox cb; +-    } *cmd; +- +-    if (num_clips == 0) +-	return 0; +- +-    size = sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cb) + +-	sizeof(*suffix); +-    cmd = malloc(size); +-    if (!cmd) +-	return -1; +- +-    cmd->header.id = SVGA_3D_CMD_SURFACE_DMA; +-    cmd->header.size = sizeof(cmd->body) + num_clips * sizeof(cmd->cb) + +-	sizeof(*suffix); +-    cb = &cmd->cb; +- +-    suffix = (SVGA3dCmdSurfaceDMASuffix *) &cb[num_clips]; +-    suffix->suffixSize = sizeof(*suffix); +-    suffix->maximumOffset = (uint32_t) -1; +-    suffix->flags.discard = 0; +-    suffix->flags.unsynchronized = 0; +-    suffix->flags.reserved = 0; +- +-    body = &cmd->body; +-    body->guest.ptr.gmrId = buf->gmr_id; +-    body->guest.ptr.offset = buf->gmr_offset; +-    body->guest.pitch = buf_pitch; +-    body->host.sid = surface_handle; +-    body->host.face = 0; +-    body->host.mipmap = 0; +- +-    body->transfer =  (to_surface ? SVGA3D_WRITE_HOST_VRAM : +-		       SVGA3D_READ_HOST_VRAM); +- +- +-    for (i=0; i < num_clips; i++, cb++, clips++) { +-	cb->x = (uint16_t) clips->x1 + host_x; +-	cb->y = (uint16_t) clips->y1 + host_y; +-	cb->z = 0; +-	cb->srcx = (uint16_t) clips->x1; +-	cb->srcy = (uint16_t) clips->y1; +-	cb->srcz = 0; +-	cb->w = (uint16_t) (clips->x2 - clips->x1); +-	cb->h = (uint16_t) (clips->y2 - clips->y1); +-	cb->d = 1; +-#if 0 +-	LogMessage(X_INFO, "DMA! x: %u y: %u srcx: %u srcy: %u w: %u h: %u %s\n", +-		   cb->x, cb->y, cb->srcx, cb->srcy, cb->w, cb->h, +-		   to_surface ? "to" : "from"); +-#endif +- +-    } +- +-    memset(&arg, 0, sizeof(arg)); +-    memset(&rep, 0, sizeof(rep)); +- +-    rep.error = -EFAULT; +-    arg.fence_rep = ((to_surface) ? 0UL : (unsigned long)&rep); +-    arg.commands = (unsigned long)cmd; +-    arg.command_size = size; +-    arg.throttle_us = 0; +-    arg.version = DRM_VMW_EXECBUF_VERSION; +- +-    ret = drmCommandWrite(ibuf->drm_fd, DRM_VMW_EXECBUF, &arg, sizeof(arg)); +-    if (ret) { +-	LogMessage(X_ERROR, "DMA error %s.\n", strerror(-ret)); +-    } +- +-    free(cmd); +- +-    if (rep.error == 0) { +-	ret = vmwgfx_fence_wait(ibuf->drm_fd, rep.handle, TRUE); +-	if (ret) { +-	    LogMessage(X_ERROR, "DMA from host fence wait error %s.\n", +-		       strerror(-ret)); +-	    vmwgfx_fence_unref(ibuf->drm_fd, rep.handle); +-	} +-    } +- +-    return 0; +-} +- +-int + vmwgfx_get_param(int drm_fd, uint32_t param, uint64_t *out) + { +     struct drm_vmw_getparam_arg gp_arg; +diff --git a/vmwgfx/vmwgfx_drmi.h b/vmwgfx/vmwgfx_drmi.h +index 2435009..fff728a 100644 +--- a/vmwgfx/vmwgfx_drmi.h ++++ b/vmwgfx/vmwgfx_drmi.h +@@ -60,11 +60,6 @@ extern void + vmwgfx_dmabuf_unmap(struct vmwgfx_dmabuf *buf); +  + extern int +-vmwgfx_dma(unsigned int host_x, unsigned int host_y, +-	   RegionPtr region, struct vmwgfx_dmabuf *buf, +-	   uint32_t buf_pitch, uint32_t surface_handle, int to_surface); +- +-extern int + vmwgfx_num_streams(int drm_fd, uint32_t *ntot, uint32_t *nfree); +  + extern int +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 5534ca3..fd80682 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -279,40 +279,40 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa, + 	       Bool to_hw) + { +     struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); ++    void *data = vpix->malloc; ++    int ret; +  +     if (!vpix->hw || (!vpix->gmr && !vpix->malloc)) + 	return TRUE; +  +-    if (vpix->gmr && vsaa->can_optimize_dma) { +-	uint32_t handle, dummy; +  +-	if (xa_surface_handle(vpix->hw, xa_handle_type_shared, +-		 &handle, &dummy) != 0) +-	    goto out_err; +-	if (vmwgfx_dma(0, 0, reg, vpix->gmr, pixmap->devKind, handle, +-		       to_hw) != 0) ++    if (vpix->gmr) { ++	data = vmwgfx_dmabuf_map(vpix->gmr); ++	if (!data) + 	    goto out_err; +-    } else { +-	void *data = vpix->malloc; +-	int ret; ++    } +  +-	if (vpix->gmr) { +-	    data = vmwgfx_dmabuf_map(vpix->gmr); +-	    if (!data) +-		goto out_err; +-	} ++    ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, ++			 (int) to_hw, ++			 (struct xa_box *) REGION_RECTS(reg), ++			 REGION_NUM_RECTS(reg)); ++    if (vpix->gmr) ++	vmwgfx_dmabuf_unmap(vpix->gmr); ++ ++    if (ret) ++	goto out_err; ++ ++    ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, ++			 (int) to_hw, ++			 (struct xa_box *) REGION_RECTS(reg), ++			 REGION_NUM_RECTS(reg)); ++    if (to_hw) ++	xa_context_flush(vsaa->xa_ctx); ++    if (vpix->gmr) ++	vmwgfx_dmabuf_unmap(vpix->gmr); ++    if (ret) ++	goto out_err; +  +-	ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, +-			     (int) to_hw, +-			     (struct xa_box *) REGION_RECTS(reg), +-			     REGION_NUM_RECTS(reg)); +-	if (to_hw) +-	    xa_context_flush(vsaa->xa_ctx); +-	if (vpix->gmr) +-	    vmwgfx_dmabuf_unmap(vpix->gmr); +-	if (ret) +-	    goto out_err; +-    } +     return TRUE; +   out_err: +     LogMessage(X_ERROR, "DMA %s surface failed.\n", +@@ -1372,7 +1372,6 @@ vmwgfx_saa_init(ScreenPtr pScreen, int drm_fd, struct xa_tracker *xat, + 	vsaa->xa_ctx = xa_context_default(xat); +     vsaa->drm_fd = drm_fd; +     vsaa->present_flush = present_flush; +-    vsaa->can_optimize_dma = FALSE; +     vsaa->use_present_opt = direct_presents; +     vsaa->only_hw_presents = only_hw_presents; +     vsaa->rendercheck = rendercheck; +diff --git a/vmwgfx/vmwgfx_saa_priv.h b/vmwgfx/vmwgfx_saa_priv.h +index 16583b0..f5f45ba 100644 +--- a/vmwgfx/vmwgfx_saa_priv.h ++++ b/vmwgfx/vmwgfx_saa_priv.h +@@ -50,7 +50,6 @@ struct vmwgfx_saa { +     int ydiff; +     RegionRec present_region; +     uint32_t src_handle; +-    Bool can_optimize_dma; +     Bool use_present_opt; +     Bool only_hw_presents; +     Bool rendercheck; +--  +1.8.5.1 + + +From e26dec8f5278df74a102493bf6d2d8444dab5d6d Mon Sep 17 00:00:00 2001 +From: Gaetan Nadon <memsize@videotron.ca> +Date: Mon, 28 Oct 2013 18:21:29 -0400 +Subject: [PATCH 05/11] vmwgfx: handle changes of DamageUnregister API in + 1.14.99.2 + +Fix is inspired from the intel driver. + +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +Signed-off-by: Gaetan Nadon <memsize@videotron.ca> +Signed-off-by: Jakob Bornecrantz <jakob@vmware.com> +--- + vmwgfx/vmwgfx_saa.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index fd80682..346e7f4 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -26,6 +26,7 @@ +  */ +  + #include <xorg-server.h> ++#include <xorgVersion.h> + #include <mi.h> + #include <fb.h> + #include <xf86drmMode.h> +@@ -76,7 +77,12 @@ vmwgfx_pixmap_remove_damage(PixmapPtr pixmap) +     if (!spix->damage || vpix->hw || vpix->gmr || vpix->malloc) + 	return; +  ++#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,14,99,2,0) ++    DamageUnregister(spix->damage); ++#else +     DamageUnregister(&pixmap->drawable, spix->damage); ++#endif ++ +     DamageDestroy(spix->damage); +     spix->damage = NULL; + } +--  +1.8.5.1 + + +From 7ac45326eccbf3bea9a4a8f95b9662a36ab58eb0 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Thu, 28 Nov 2013 02:02:20 -0800 +Subject: [PATCH 06/11] vmwgfx: Fix some compilation warnings and indentations + +Most of the compilation warnings we're seeing are due to bad xorg headers, +but fix the ones we can fix in the driver. Some indentation fixes as well. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + src/vmware_bootstrap.c    |  2 -- + src/vmwarevideo.c         |  4 ++-- + vmwgfx/vmwgfx_driver.c    |  1 - + vmwgfx/vmwgfx_output.c    |  2 +- + vmwgfx/vmwgfx_overlay.c   |  4 ++-- + vmwgfx/vmwgfx_tex_video.c | 26 +++++++++++++------------- + 6 files changed, 18 insertions(+), 21 deletions(-) + +diff --git a/src/vmware_bootstrap.c b/src/vmware_bootstrap.c +index ea5be19..bb58325 100644 +--- a/src/vmware_bootstrap.c ++++ b/src/vmware_bootstrap.c +@@ -256,7 +256,6 @@ VMwarePciProbe (DriverPtr           drv, +                 intptr_t            match_data) + { +     ScrnInfoPtr     scrn = NULL; +-    EntityInfoPtr   entity; +  +     scrn = xf86ConfigPciEntity(scrn, 0, entity_num, VMWAREPciChipsets, +                                NULL, NULL, NULL, NULL, NULL); +@@ -267,7 +266,6 @@ VMwarePciProbe (DriverPtr           drv, +         scrn->Probe = NULL; +     } +  +-    entity = xf86GetEntityInfo(entity_num); +     switch (DEVICE_ID(device)) { +     case PCI_DEVICE_ID_VMWARE_SVGA2: +     case PCI_DEVICE_ID_VMWARE_SVGA: +diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c +index 745c71f..8d7d171 100644 +--- a/src/vmwarevideo.c ++++ b/src/vmwarevideo.c +@@ -82,7 +82,7 @@ + #define VMWARE_VID_MAX_HEIGHT   2048 +  + #define VMWARE_VID_NUM_ENCODINGS 1 +-static XF86VideoEncodingRec vmwareVideoEncodings[] = ++static const XF86VideoEncodingRec vmwareVideoEncodings[] = + { +     { +        0, +@@ -108,7 +108,7 @@ static XF86ImageRec vmwareVideoImages[] = + }; +  + #define VMWARE_VID_NUM_ATTRIBUTES 2 +-static XF86AttributeRec vmwareVideoAttributes[] = ++static const XF86AttributeRec vmwareVideoAttributes[] = + { +     { +         XvGettable | XvSettable, +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index eeaea4b..bfc07f8 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -658,7 +658,6 @@ void xorg_flush(ScreenPtr pScreen) + 	if (crtc->enabled) { + 	    pixmap = crtc_get_scanout(crtc); + 	    if (pixmap) { +-		unsigned int j; +  + 		/* + 		 * Remove duplicates. +diff --git a/vmwgfx/vmwgfx_output.c b/vmwgfx/vmwgfx_output.c +index 4f52f1d..f9e4263 100644 +--- a/vmwgfx/vmwgfx_output.c ++++ b/vmwgfx/vmwgfx_output.c +@@ -60,7 +60,7 @@ struct output_private +     Bool is_implicit; + }; +  +-static char *output_enum_list[] = { ++static const char *output_enum_list[] = { +     "Unknown", +     "VGA", +     "DVI", +diff --git a/vmwgfx/vmwgfx_overlay.c b/vmwgfx/vmwgfx_overlay.c +index 6624a10..986dd06 100644 +--- a/vmwgfx/vmwgfx_overlay.c ++++ b/vmwgfx/vmwgfx_overlay.c +@@ -84,7 +84,7 @@ typedef uint8_t uint8; + #define VMWARE_VID_MAX_HEIGHT   2048 +  + #define VMWARE_VID_NUM_ENCODINGS 1 +-static XF86VideoEncodingRec vmwareVideoEncodings[] = ++static const XF86VideoEncodingRec vmwareVideoEncodings[] = + { +     { +        0, +@@ -110,7 +110,7 @@ static XF86ImageRec vmwareVideoImages[] = + }; +  + #define VMWARE_VID_NUM_ATTRIBUTES 2 +-static XF86AttributeRec vmwareVideoAttributes[] = ++static const XF86AttributeRec vmwareVideoAttributes[] = + { +     { +         XvGettable | XvSettable, +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index a0a4f4a..3ba40ef 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -70,11 +70,11 @@ static const float bt_709[] = { + static Atom xvBrightness, xvContrast, xvSaturation, xvHue; +  + #define NUM_TEXTURED_ATTRIBUTES 4 +-static XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = { +-   {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, +-   {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, +-   {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, +-   {XvSettable | XvGettable, -1000, 1000, "XV_HUE"} ++static const XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = { ++    {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, ++    {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, ++    {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, ++    {XvSettable | XvGettable, -1000, 1000, "XV_HUE"} + }; +  + #define NUM_FORMATS 3 +@@ -82,7 +82,7 @@ static XF86VideoFormatRec Formats[NUM_FORMATS] = { +    {15, TrueColor}, {16, TrueColor}, {24, TrueColor} + }; +  +-static XF86VideoEncodingRec DummyEncoding[1] = { ++static const XF86VideoEncodingRec DummyEncoding[1] = { +    { +       0, +       "XV_IMAGE", +@@ -416,16 +416,16 @@ copy_packed_data(ScrnInfoPtr pScrn, +    switch (id) { +    case FOURCC_YV12: { +       int pitches[3], offsets[3]; +-      unsigned char *y, *u, *v; ++      unsigned char *yp, *up, *vp; +       query_image_attributes(pScrn, FOURCC_YV12, +                              &w, &h, pitches, offsets); +  +-      y = buf + offsets[0]; +-      v = buf + offsets[1]; +-      u = buf + offsets[2]; +-      memcpy(ymap, y, w*h); +-      memcpy(vmap, v, w*h/4); +-      memcpy(umap, u, w*h/4); ++      yp = buf + offsets[0]; ++      vp = buf + offsets[1]; ++      up = buf + offsets[2]; ++      memcpy(ymap, yp, w*h); ++      memcpy(vmap, vp, w*h/4); ++      memcpy(umap, up, w*h/4); +       break; +    } +    case FOURCC_UYVY: +--  +1.8.5.1 + + +From a40cbd7b4fa19219849b4b0a48f07538772c3e22 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Thu, 5 Dec 2013 02:58:47 -0800 +Subject: [PATCH 07/11] vmwgfx: Support also XA version 1 v2 + +We need to support also XA version 1, since we want to be backwards +compatible with older mesa releases. +Unfortunately, the intended way of detecting XA major version at +compile-time was broken on mesa 10 so we need a workaround that tests +for XA version 2 at config time. + +v2: Update the test for XA version 2. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + configure.ac              | 10 +++++++++- + vmwgfx/vmwgfx_dri2.c      |  5 ++--- + vmwgfx/vmwgfx_driver.c    |  3 +-- + vmwgfx/vmwgfx_saa.c       | 12 +++++------- + vmwgfx/vmwgfx_saa.h       | 12 ++++++++++++ + vmwgfx/vmwgfx_tex_video.c |  2 +- + 6 files changed, 30 insertions(+), 14 deletions(-) + +diff --git a/configure.ac b/configure.ac +index dccfb27..123356c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -118,7 +118,15 @@ if test x$BUILD_VMWGFX = xyes; then + 	PKG_CHECK_MODULES([LIBDRM], [libdrm],[],[BUILD_VMWGFX=no]) + fi + if test x$BUILD_VMWGFX = xyes; then +-	PKG_CHECK_MODULES([XATRACKER], [xatracker >= 2.0.0],[],[BUILD_VMWGFX=no]) ++# ++# Early versions of mesa 10 forgot to bump the XA major version number in ++# the xa_tracker.h header ++# ++	PKG_CHECK_MODULES([XATRACKER], [xatracker >= 0.4.0], ++			  [PKG_CHECK_EXISTS([xatracker = 2.0.0], ++	                  [AC_DEFINE([HAVE_XA_2], 1, ++               		  [Has version 2 of XA])])], ++			  [],[BUILD_VMWGFX=no]) + fi +  + DRIVER_NAME=vmware +diff --git a/vmwgfx/vmwgfx_dri2.c b/vmwgfx/vmwgfx_dri2.c +index 57f2d9d..4c74a6b 100644 +--- a/vmwgfx/vmwgfx_dri2.c ++++ b/vmwgfx/vmwgfx_dri2.c +@@ -206,8 +206,7 @@ dri2_do_create_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer, unsigned int for +     } +  +     private->srf = srf; +-    if (xa_surface_handle(srf, xa_handle_type_shared, +-	    &buffer->name, &buffer->pitch) != 0) ++    if (_xa_surface_handle(srf, &buffer->name, &buffer->pitch) != 0) + 	return FALSE; +  +     buffer->cpp = xa_format_depth(xa_surface_format(srf)) / 8; +@@ -228,7 +227,7 @@ dri2_do_destroy_buffer(DrawablePtr pDraw, DRI2BufferPtr buffer) +     struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(private->pPixmap); +  +     if (--private->refcount == 0 && srf) { +-	xa_surface_unref(srf); ++	xa_surface_destroy(srf); +     } +  +     /* +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index bfc07f8..6301c29 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -617,8 +617,7 @@ vmwgfx_scanout_present(ScreenPtr pScreen, int drm_fd, + 	return FALSE; +     } +  +-    if (xa_surface_handle(vpix->hw, xa_handle_type_shared, +-	    &handle, &dummy) != 0) { ++    if (_xa_surface_handle(vpix->hw, &handle, &dummy) != 0) { + 	LogMessage(X_ERROR, "Could not get present surface handle.\n"); + 	return FALSE; +     } +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 346e7f4..1459933 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -146,7 +146,7 @@ vmwgfx_pixmap_free_storage(struct vmwgfx_saa_pixmap *vpix) + 	vpix->malloc = NULL; +     } +     if (!(vpix->backing & VMWGFX_PIX_SURFACE) && vpix->hw) { +-	xa_surface_unref(vpix->hw); ++	xa_surface_destroy(vpix->hw); + 	vpix->hw = NULL; +     } +     if (!(vpix->backing & VMWGFX_PIX_GMR) && vpix->gmr) { +@@ -451,7 +451,7 @@ vmwgfx_hw_kill(struct vmwgfx_saa *vsaa, + 				 &spix->dirty_hw)) + 	return FALSE; +  +-    xa_surface_unref(vpix->hw); ++    xa_surface_destroy(vpix->hw); +     vpix->hw = NULL; +  +     /* +@@ -698,8 +698,7 @@ vmwgfx_present_prepare(struct vmwgfx_saa *vsaa, +  +     (void) pScreen; +     if (src_vpix == dst_vpix || !src_vpix->hw || +-	xa_surface_handle(src_vpix->hw, xa_handle_type_shared, +-		&vsaa->src_handle, &dummy) != 0) ++	_xa_surface_handle(src_vpix->hw, &vsaa->src_handle, &dummy) != 0) + 	return FALSE; +  +     REGION_NULL(pScreen, &vsaa->present_region); +@@ -800,7 +799,7 @@ vmwgfx_create_hw(struct vmwgfx_saa *vsaa, +     return TRUE; +  + out_no_damage: +-    xa_surface_unref(hw); ++    xa_surface_destroy(hw); +     return FALSE; + } +  +@@ -1459,8 +1458,7 @@ vmwgfx_scanout_ref(struct vmwgfx_screen_entry  *entry) + 	     */ + 	    if (!vmwgfx_hw_accel_validate(pixmap, 0, XA_FLAG_SCANOUT, 0, NULL)) + 		goto out_err; +-	    if (xa_surface_handle(vpix->hw, xa_handle_type_shared, +-			 &handle, &dummy) != 0) ++	    if (_xa_surface_handle(vpix->hw, &handle, &dummy) != 0) + 		goto out_err; + 	    depth = xa_format_depth(xa_surface_format(vpix->hw)); +  +diff --git a/vmwgfx/vmwgfx_saa.h b/vmwgfx/vmwgfx_saa.h +index d8aa3d3..5e1f40c 100644 +--- a/vmwgfx/vmwgfx_saa.h ++++ b/vmwgfx/vmwgfx_saa.h +@@ -115,4 +115,16 @@ vmwgfx_saa_set_master(ScreenPtr pScreen); + void + vmwgfx_saa_drop_master(ScreenPtr pScreen); +  ++#if (XA_TRACKER_VERSION_MAJOR <= 1) && !defined(HAVE_XA_2) ++ ++#define _xa_surface_handle(_a, _b, _c) xa_surface_handle(_a, _b, _c) ++#define xa_context_flush(_a) ++ ++#else ++ ++#define xa_surface_destroy(_a) xa_surface_unref(_a) ++#define _xa_surface_handle(_a, _b, _c)		\ ++    xa_surface_handle(_a, xa_handle_type_shared, _b, _c) ++ ++#endif /*  (XA_TRACKER_VERSION_MAJOR <= 1) */ + #endif +diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c +index 3ba40ef..9fd8f22 100644 +--- a/vmwgfx/vmwgfx_tex_video.c ++++ b/vmwgfx/vmwgfx_tex_video.c +@@ -199,7 +199,7 @@ stop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) +        for (i=0; i<3; ++i) { + 	   for (j=0; j<2; ++j) { + 	       if (priv->yuv[i]) { +-		   xa_surface_unref(priv->yuv[j][i]); ++		   xa_surface_destroy(priv->yuv[j][i]); + 		   priv->yuv[j][i] = NULL; + 	       } + 	   } +--  +1.8.5.1 + + +From c36cbcefb8526944141eb431e1e736dc4485a36e Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Mon, 9 Dec 2013 00:19:55 -0800 +Subject: [PATCH 08/11] vmwgfx: Remove stray 1 + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + vmwgfx/vmwgfx_saa.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 1459933..28819c1 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -1230,7 +1230,7 @@ vmwgfx_operation_complete(struct saa_driver *driver, +      */ +  +     if (vpix->hw && vpix->hw_is_dri2_fronts) { +-	if (1 && pScrn->vtSema && ++	if (pScrn->vtSema && + 	    vmwgfx_upload_to_hw(driver, pixmap, &spix->dirty_shadow)) { +  + 	    REGION_EMPTY(vsaa->pScreen, &spix->dirty_shadow); +--  +1.8.5.1 + + +From 4af6062ce281a7f4aaa50985fe757e9569208ee1 Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Wed, 11 Dec 2013 04:59:49 -0800 +Subject: [PATCH 09/11] Revert "vmwgfx: Get rid of device-specific DMA code" + +This reverts commit 45b2457516a9db4bd1d60fbb24a1efbe2d9dd932. + +Reverting this because using direct DMA for shared pixmaps should +boost performance. It should be usable both in a composited environment +and when running hosted. Need to retest the DMA flaws I saw before disabling +this code. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + vmwgfx/vmwgfx_drmi.c     | 103 +++++++++++++++++++++++++++++++++++++++++++++++ + vmwgfx/vmwgfx_drmi.h     |   5 +++ + vmwgfx/vmwgfx_saa.c      |  53 ++++++++++++------------ + vmwgfx/vmwgfx_saa_priv.h |   1 + + 4 files changed, 136 insertions(+), 26 deletions(-) + +diff --git a/vmwgfx/vmwgfx_drmi.c b/vmwgfx/vmwgfx_drmi.c +index 1e23f4a..496a16b 100644 +--- a/vmwgfx/vmwgfx_drmi.c ++++ b/vmwgfx/vmwgfx_drmi.c +@@ -284,6 +284,109 @@ vmwgfx_dmabuf_destroy(struct vmwgfx_dmabuf *buf) + } +  + int ++vmwgfx_dma(unsigned int host_x, unsigned int host_y, ++	   RegionPtr region, struct vmwgfx_dmabuf *buf, ++	   uint32_t buf_pitch, uint32_t surface_handle, int to_surface) ++{ ++    BoxPtr clips = REGION_RECTS(region); ++    unsigned int num_clips = REGION_NUM_RECTS(region); ++    struct drm_vmw_execbuf_arg arg; ++    struct drm_vmw_fence_rep rep; ++    int ret; ++    unsigned int size; ++    unsigned i; ++    SVGA3dCopyBox *cb; ++    SVGA3dCmdSurfaceDMASuffix *suffix; ++    SVGA3dCmdSurfaceDMA *body; ++    struct vmwgfx_int_dmabuf *ibuf = vmwgfx_int_dmabuf(buf); ++ ++    struct { ++	SVGA3dCmdHeader header; ++	SVGA3dCmdSurfaceDMA body; ++	SVGA3dCopyBox cb; ++    } *cmd; ++ ++    if (num_clips == 0) ++	return 0; ++ ++    size = sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cb) + ++	sizeof(*suffix); ++    cmd = malloc(size); ++    if (!cmd) ++	return -1; ++ ++    cmd->header.id = SVGA_3D_CMD_SURFACE_DMA; ++    cmd->header.size = sizeof(cmd->body) + num_clips * sizeof(cmd->cb) + ++	sizeof(*suffix); ++    cb = &cmd->cb; ++ ++    suffix = (SVGA3dCmdSurfaceDMASuffix *) &cb[num_clips]; ++    suffix->suffixSize = sizeof(*suffix); ++    suffix->maximumOffset = (uint32_t) -1; ++    suffix->flags.discard = 0; ++    suffix->flags.unsynchronized = 0; ++    suffix->flags.reserved = 0; ++ ++    body = &cmd->body; ++    body->guest.ptr.gmrId = buf->gmr_id; ++    body->guest.ptr.offset = buf->gmr_offset; ++    body->guest.pitch = buf_pitch; ++    body->host.sid = surface_handle; ++    body->host.face = 0; ++    body->host.mipmap = 0; ++ ++    body->transfer =  (to_surface ? SVGA3D_WRITE_HOST_VRAM : ++		       SVGA3D_READ_HOST_VRAM); ++ ++ ++    for (i=0; i < num_clips; i++, cb++, clips++) { ++	cb->x = (uint16_t) clips->x1 + host_x; ++	cb->y = (uint16_t) clips->y1 + host_y; ++	cb->z = 0; ++	cb->srcx = (uint16_t) clips->x1; ++	cb->srcy = (uint16_t) clips->y1; ++	cb->srcz = 0; ++	cb->w = (uint16_t) (clips->x2 - clips->x1); ++	cb->h = (uint16_t) (clips->y2 - clips->y1); ++	cb->d = 1; ++#if 0 ++	LogMessage(X_INFO, "DMA! x: %u y: %u srcx: %u srcy: %u w: %u h: %u %s\n", ++		   cb->x, cb->y, cb->srcx, cb->srcy, cb->w, cb->h, ++		   to_surface ? "to" : "from"); ++#endif ++ ++    } ++ ++    memset(&arg, 0, sizeof(arg)); ++    memset(&rep, 0, sizeof(rep)); ++ ++    rep.error = -EFAULT; ++    arg.fence_rep = ((to_surface) ? 0UL : (unsigned long)&rep); ++    arg.commands = (unsigned long)cmd; ++    arg.command_size = size; ++    arg.throttle_us = 0; ++    arg.version = DRM_VMW_EXECBUF_VERSION; ++ ++    ret = drmCommandWrite(ibuf->drm_fd, DRM_VMW_EXECBUF, &arg, sizeof(arg)); ++    if (ret) { ++	LogMessage(X_ERROR, "DMA error %s.\n", strerror(-ret)); ++    } ++ ++    free(cmd); ++ ++    if (rep.error == 0) { ++	ret = vmwgfx_fence_wait(ibuf->drm_fd, rep.handle, TRUE); ++	if (ret) { ++	    LogMessage(X_ERROR, "DMA from host fence wait error %s.\n", ++		       strerror(-ret)); ++	    vmwgfx_fence_unref(ibuf->drm_fd, rep.handle); ++	} ++    } ++ ++    return 0; ++} ++ ++int + vmwgfx_get_param(int drm_fd, uint32_t param, uint64_t *out) + { +     struct drm_vmw_getparam_arg gp_arg; +diff --git a/vmwgfx/vmwgfx_drmi.h b/vmwgfx/vmwgfx_drmi.h +index fff728a..2435009 100644 +--- a/vmwgfx/vmwgfx_drmi.h ++++ b/vmwgfx/vmwgfx_drmi.h +@@ -60,6 +60,11 @@ extern void + vmwgfx_dmabuf_unmap(struct vmwgfx_dmabuf *buf); +  + extern int ++vmwgfx_dma(unsigned int host_x, unsigned int host_y, ++	   RegionPtr region, struct vmwgfx_dmabuf *buf, ++	   uint32_t buf_pitch, uint32_t surface_handle, int to_surface); ++ ++extern int + vmwgfx_num_streams(int drm_fd, uint32_t *ntot, uint32_t *nfree); +  + extern int +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 28819c1..96275a5 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -285,40 +285,40 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa, + 	       Bool to_hw) + { +     struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); +-    void *data = vpix->malloc; +-    int ret; +  +     if (!vpix->hw || (!vpix->gmr && !vpix->malloc)) + 	return TRUE; +  ++    if (vpix->gmr && vsaa->can_optimize_dma) { ++	uint32_t handle, dummy; +  +-    if (vpix->gmr) { +-	data = vmwgfx_dmabuf_map(vpix->gmr); +-	if (!data) ++	if (xa_surface_handle(vpix->hw, xa_handle_type_shared, ++		 &handle, &dummy) != 0) + 	    goto out_err; +-    } +- +-    ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, +-			 (int) to_hw, +-			 (struct xa_box *) REGION_RECTS(reg), +-			 REGION_NUM_RECTS(reg)); +-    if (vpix->gmr) +-	vmwgfx_dmabuf_unmap(vpix->gmr); +- +-    if (ret) +-	goto out_err; ++	if (vmwgfx_dma(0, 0, reg, vpix->gmr, pixmap->devKind, handle, ++		       to_hw) != 0) ++	    goto out_err; ++    } else { ++	void *data = vpix->malloc; ++	int ret; +  +-    ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, +-			 (int) to_hw, +-			 (struct xa_box *) REGION_RECTS(reg), +-			 REGION_NUM_RECTS(reg)); +-    if (to_hw) +-	xa_context_flush(vsaa->xa_ctx); +-    if (vpix->gmr) +-	vmwgfx_dmabuf_unmap(vpix->gmr); +-    if (ret) +-	goto out_err; ++	if (vpix->gmr) { ++	    data = vmwgfx_dmabuf_map(vpix->gmr); ++	    if (!data) ++		goto out_err; ++	} +  ++	ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind, ++			     (int) to_hw, ++			     (struct xa_box *) REGION_RECTS(reg), ++			     REGION_NUM_RECTS(reg)); ++	if (to_hw) ++	    xa_context_flush(vsaa->xa_ctx); ++	if (vpix->gmr) ++	    vmwgfx_dmabuf_unmap(vpix->gmr); ++	if (ret) ++	    goto out_err; ++    } +     return TRUE; +   out_err: +     LogMessage(X_ERROR, "DMA %s surface failed.\n", +@@ -1377,6 +1377,7 @@ vmwgfx_saa_init(ScreenPtr pScreen, int drm_fd, struct xa_tracker *xat, + 	vsaa->xa_ctx = xa_context_default(xat); +     vsaa->drm_fd = drm_fd; +     vsaa->present_flush = present_flush; ++    vsaa->can_optimize_dma = FALSE; +     vsaa->use_present_opt = direct_presents; +     vsaa->only_hw_presents = only_hw_presents; +     vsaa->rendercheck = rendercheck; +diff --git a/vmwgfx/vmwgfx_saa_priv.h b/vmwgfx/vmwgfx_saa_priv.h +index f5f45ba..16583b0 100644 +--- a/vmwgfx/vmwgfx_saa_priv.h ++++ b/vmwgfx/vmwgfx_saa_priv.h +@@ -50,6 +50,7 @@ struct vmwgfx_saa { +     int ydiff; +     RegionRec present_region; +     uint32_t src_handle; ++    Bool can_optimize_dma; +     Bool use_present_opt; +     Bool only_hw_presents; +     Bool rendercheck; +--  +1.8.5.1 + + +From 93228f3dd3355a25583d22dbb96791678b93be3e Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Wed, 11 Dec 2013 06:54:02 -0800 +Subject: [PATCH 10/11] vmwgfx: Really allow XA version 2. + +When XA starts to correctly advertise version 2, we didn't allow it. +Fix this. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> +--- + vmwgfx/vmwgfx_driver.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c +index 6301c29..4e28097 100644 +--- a/vmwgfx/vmwgfx_driver.c ++++ b/vmwgfx/vmwgfx_driver.c +@@ -79,7 +79,7 @@ typedef uint8_t uint8; +  + #define XA_VERSION_MINOR_REQUIRED 0 + #define XA_VERSION_MAJOR_REQUIRED 1 +-#define XA_VERSION_MAJOR_COMPAT 1 ++#define XA_VERSION_MAJOR_COMPAT 2 +  + #define DRM_VERSION_MAJOR_REQUIRED 2 + #define DRM_VERSION_MINOR_REQUIRED 3 +--  +1.8.5.1 + + +From f45a551e9b70ccec8f92df02747d4e2af299cf8c Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom <thellstrom@vmware.com> +Date: Mon, 16 Dec 2013 10:38:21 +0100 +Subject: [PATCH 11/11] vmwgfx: Fix compile breakage on XA version 1. + +A recent revert brought back code that assumed XA version 2. + +Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> +Reviewed-by: trivial +--- + vmwgfx/vmwgfx_saa.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c +index 96275a5..e76bd09 100644 +--- a/vmwgfx/vmwgfx_saa.c ++++ b/vmwgfx/vmwgfx_saa.c +@@ -292,8 +292,7 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa, +     if (vpix->gmr && vsaa->can_optimize_dma) { + 	uint32_t handle, dummy; +  +-	if (xa_surface_handle(vpix->hw, xa_handle_type_shared, +-		 &handle, &dummy) != 0) ++	if (_xa_surface_handle(vpix->hw, &handle, &dummy) != 0) + 	    goto out_err; + 	if (vmwgfx_dma(0, 0, reg, vpix->gmr, pixmap->devKind, handle, + 		       to_hw) != 0) +--  +1.8.5.1 + | 
