[x11-drivers/xf86-video-vmware] drop, no longer needed

This commit is contained in:
Fabio Erculiani
2014-04-04 17:55:53 +02:00
parent 0faaaf3dfe
commit 0ea487fdff
23 changed files with 0 additions and 5568 deletions
-1
View File
@@ -1 +0,0 @@
DIST xf86-video-vmware-13.0.1.tar.bz2 432401 SHA256 802dda415c22412edad6c3df44fe18a06e91d0f8456d9a58bac0d340fdf8fe3d SHA512 2faf5fd524dffd2cd89a8b5a06b5470acbc51c3ee4f48bafc425b8e9c7c76d294201651cfb8c1d104c313885108e22abb6da736de1f3dbcf134a0926158ed147 WHIRLPOOL c52cb2a65f243a3cbe70da5f007aa0af97cf32e576b8bb6a400374d775edaab78ccf9ac341f94fc4bd95a2cf58672adce4462b079d889338f0b5ea93a8cd4252
@@ -1,187 +0,0 @@
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/19] 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, &reg, &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.3
@@ -1,240 +0,0 @@
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/19] 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.3
@@ -1,196 +0,0 @@
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/19] 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, &reg, &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, &reg, &box);
- }
-
- if (xa_surface_handle(srf, xa_handle_type_shared,
- &handle, &stride) != 0) {
- ret = BadAlloc;
- break;
- }
-
- if (vmwgfx_dma(0, 0, &reg, buf, w, handle, 1) != 0) {
- ret = BadAlloc;
- break;
- }
- }
- REGION_UNINIT(pScrn->pScreen, &reg);
- }
+ 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.3
@@ -1,240 +0,0 @@
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/19] 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.3
@@ -1,43 +0,0 @@
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/19] 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.3
@@ -1,165 +0,0 @@
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/19] 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.3
@@ -1,170 +0,0 @@
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/19] 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.3
@@ -1,27 +0,0 @@
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/19] 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.3
@@ -1,245 +0,0 @@
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/19] 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.3
@@ -1,30 +0,0 @@
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/19] 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.3
@@ -1,30 +0,0 @@
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/19] 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.3
@@ -1,672 +0,0 @@
From c020923597d3bc30dffa89ba0a47f3b9517dd5fb Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Mon, 16 Dec 2013 06:13:25 -0800
Subject: [PATCH 13/19] vmwgfx: Add support for XMir v2.
Use the hosted infrastructure to add support for XMir.
Helpers go in vmwgfx_saa.c.
v2: Added comments for the helpers, and added a
vmwgfx_flush_dri2 to be executed when coming back from vt switch.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
vmwgfx/Makefile.am | 1 +
vmwgfx/vmwgfx_drmi.c | 39 +++++++-
vmwgfx/vmwgfx_drmi.h | 8 +-
vmwgfx/vmwgfx_hosted.c | 5 +-
vmwgfx/vmwgfx_hosted.h | 1 +
vmwgfx/vmwgfx_hosted_priv.h | 3 +
vmwgfx/vmwgfx_saa.c | 213 ++++++++++++++++++++++++++++++++++++++++----
vmwgfx/vmwgfx_saa.h | 5 ++
vmwgfx/vmwgfx_xmir.c | 178 ++++++++++++++++++++++++++++++++++++
9 files changed, 433 insertions(+), 20 deletions(-)
create mode 100644 vmwgfx/vmwgfx_xmir.c
diff --git a/vmwgfx/Makefile.am b/vmwgfx/Makefile.am
index 2b0380b..41833a1 100644
--- a/vmwgfx/Makefile.am
+++ b/vmwgfx/Makefile.am
@@ -28,5 +28,6 @@ libvmwgfx_la_SOURCES = \
vmwgfx_hosted.c \
vmwgfx_hosted.h \
vmwgfx_hosted_priv.h \
+ vmwgfx_xmir.c \
wsbm_util.h
endif
diff --git a/vmwgfx/vmwgfx_drmi.c b/vmwgfx/vmwgfx_drmi.c
index 496a16b..d926019 100644
--- a/vmwgfx/vmwgfx_drmi.c
+++ b/vmwgfx/vmwgfx_drmi.c
@@ -284,7 +284,7 @@ vmwgfx_dmabuf_destroy(struct vmwgfx_dmabuf *buf)
}
int
-vmwgfx_dma(unsigned int host_x, unsigned int host_y,
+vmwgfx_dma(int host_x, int host_y,
RegionPtr region, struct vmwgfx_dmabuf *buf,
uint32_t buf_pitch, uint32_t surface_handle, int to_surface)
{
@@ -500,3 +500,40 @@ vmwgfx_max_fb_size(int drm_fd, size_t *size)
return 0;
}
+
+/**
+ * vmwgfx_prime_fd_to_handle - Return a TTM handle to a prime object
+ *
+ * @drm_fd: File descriptor for the drm connection.
+ * @prime_fd: File descriptor identifying the prime object.
+ * @handle: Pointer to returned TTM handle.
+ *
+ * Takes a reference on the underlying object and returns a TTM handle to it.
+ */
+int
+vmwgfx_prime_fd_to_handle(int drm_fd, int prime_fd, uint32_t *handle)
+{
+ *handle = 0;
+
+ return drmPrimeFDToHandle(drm_fd, prime_fd, handle);
+}
+
+/**
+ * vmwgfx_prime_release_handle - Release a reference on a TTM object
+ *
+ * @drm_fd: File descriptor for the drm connection.
+ * @handle: TTM handle as returned by vmwgfx_prime_fd_to_handle.
+ *
+ * Releases the reference obtained by vmwgfx_prime_fd_to_handle().
+ */
+void
+vmwgfx_prime_release_handle(int drm_fd, uint32_t handle)
+{
+ struct drm_vmw_surface_arg s_arg;
+
+ memset(&s_arg, 0, sizeof(s_arg));
+ s_arg.sid = handle;
+
+ (void) drmCommandWrite(drm_fd, DRM_VMW_UNREF_SURFACE, &s_arg,
+ sizeof(s_arg));
+}
diff --git a/vmwgfx/vmwgfx_drmi.h b/vmwgfx/vmwgfx_drmi.h
index 2435009..1494485 100644
--- a/vmwgfx/vmwgfx_drmi.h
+++ b/vmwgfx/vmwgfx_drmi.h
@@ -60,7 +60,7 @@ extern void
vmwgfx_dmabuf_unmap(struct vmwgfx_dmabuf *buf);
extern int
-vmwgfx_dma(unsigned int host_x, unsigned int host_y,
+vmwgfx_dma(int host_x, int host_y,
RegionPtr region, struct vmwgfx_dmabuf *buf,
uint32_t buf_pitch, uint32_t surface_handle, int to_surface);
@@ -84,4 +84,10 @@ vmwgfx_update_gui_layout(int drm_fd, unsigned int num_rects,
struct drm_vmw_rect *rects);
int
vmwgfx_get_param(int drm_fd, uint32_t param, uint64_t *out);
+
+int
+vmwgfx_prime_fd_to_handle(int drm_fd, int prime_fd, uint32_t *handle);
+
+void
+vmwgfx_prime_release_handle(int drm_fd, uint32_t handle);
#endif
diff --git a/vmwgfx/vmwgfx_hosted.c b/vmwgfx/vmwgfx_hosted.c
index b42d962..018b88b 100644
--- a/vmwgfx/vmwgfx_hosted.c
+++ b/vmwgfx/vmwgfx_hosted.c
@@ -46,7 +46,9 @@
const struct vmwgfx_hosted_driver *
vmwgfx_hosted_detect(void)
{
- return NULL;
+ const struct vmwgfx_hosted_driver *tmp = vmwgfx_xmir_detect();
+
+ return tmp;
}
/**
@@ -61,4 +63,5 @@ vmwgfx_hosted_detect(void)
void
vmwgfx_hosted_modify_flags(uint32_t *flags)
{
+ vmwgfx_xmir_modify_flags(flags);
}
diff --git a/vmwgfx/vmwgfx_hosted.h b/vmwgfx/vmwgfx_hosted.h
index 8f3b243..78dc7cd 100644
--- a/vmwgfx/vmwgfx_hosted.h
+++ b/vmwgfx/vmwgfx_hosted.h
@@ -23,6 +23,7 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Author: Thomas Hellstrom <thellstrom@vmware.com>
+ * Note: "Hosted" is a term stolen from the xf86-video-intel driver.
*/
#ifndef _VMWGFX_HOSTED_H
diff --git a/vmwgfx/vmwgfx_hosted_priv.h b/vmwgfx/vmwgfx_hosted_priv.h
index 05ded25..c81f5ee 100644
--- a/vmwgfx/vmwgfx_hosted_priv.h
+++ b/vmwgfx/vmwgfx_hosted_priv.h
@@ -31,4 +31,7 @@
#include <stdint.h>
#include "vmwgfx_hosted.h"
+extern const struct vmwgfx_hosted_driver *vmwgfx_xmir_detect(void);
+extern void vmwgfx_xmir_modify_flags(uint32_t *flags);
+
#endif
diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c
index e76bd09..c8b4df1 100644
--- a/vmwgfx/vmwgfx_saa.c
+++ b/vmwgfx/vmwgfx_saa.c
@@ -282,32 +282,44 @@ static Bool
vmwgfx_saa_dma(struct vmwgfx_saa *vsaa,
PixmapPtr pixmap,
RegionPtr reg,
- Bool to_hw)
+ Bool to_hw,
+ int dx,
+ int dy,
+ struct xa_surface *srf)
{
struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap);
- if (!vpix->hw || (!vpix->gmr && !vpix->malloc))
+ if (!srf)
+ srf = vpix->hw;
+
+ if (!srf || (!vpix->gmr && !vpix->malloc))
return TRUE;
if (vpix->gmr && vsaa->can_optimize_dma) {
uint32_t handle, dummy;
- if (_xa_surface_handle(vpix->hw, &handle, &dummy) != 0)
+ if (_xa_surface_handle(srf, &handle, &dummy) != 0)
goto out_err;
- if (vmwgfx_dma(0, 0, reg, vpix->gmr, pixmap->devKind, handle,
+ if (vmwgfx_dma(dx, dy, reg, vpix->gmr, pixmap->devKind, handle,
to_hw) != 0)
goto out_err;
} else {
- void *data = vpix->malloc;
+ uint8_t *data = (uint8_t *) vpix->malloc;
int ret;
if (vpix->gmr) {
- data = vmwgfx_dmabuf_map(vpix->gmr);
+ data = (uint8_t *) vmwgfx_dmabuf_map(vpix->gmr);
if (!data)
goto out_err;
}
- ret = xa_surface_dma(vsaa->xa_ctx, vpix->hw, data, pixmap->devKind,
+ if (dx || dy) {
+ REGION_TRANSLATE(pScreen, reg, dx, dy);
+ data -= ((dx * pixmap->drawable.bitsPerPixel + 7)/8 +
+ dy * pixmap->devKind);
+ }
+
+ ret = xa_surface_dma(vsaa->xa_ctx, srf, data, pixmap->devKind,
(int) to_hw,
(struct xa_box *) REGION_RECTS(reg),
REGION_NUM_RECTS(reg));
@@ -315,6 +327,8 @@ vmwgfx_saa_dma(struct vmwgfx_saa *vsaa,
xa_context_flush(vsaa->xa_ctx);
if (vpix->gmr)
vmwgfx_dmabuf_unmap(vpix->gmr);
+ if (dx || dy)
+ REGION_TRANSLATE(pScreen, reg, -dx, -dy);
if (ret)
goto out_err;
}
@@ -353,7 +367,7 @@ vmwgfx_download_from_hw(struct saa_driver *driver, PixmapPtr pixmap,
if (!vmwgfx_pixmap_create_sw(vsaa, pixmap))
goto out_err;
- if (!vmwgfx_saa_dma(vsaa, pixmap, readback, FALSE))
+ if (!vmwgfx_saa_dma(vsaa, pixmap, readback, FALSE, 0, 0, NULL))
goto out_err;
REGION_SUBTRACT(vsaa->pScreen, &spix->dirty_hw, &spix->dirty_hw, readback);
REGION_UNINIT(vsaa->pScreen, &intersection);
@@ -368,7 +382,8 @@ static Bool
vmwgfx_upload_to_hw(struct saa_driver *driver, PixmapPtr pixmap,
RegionPtr upload)
{
- return vmwgfx_saa_dma(to_vmwgfx_saa(driver), pixmap, upload, TRUE);
+ return vmwgfx_saa_dma(to_vmwgfx_saa(driver), pixmap, upload, TRUE,
+ 0, 0, NULL);
}
static void
@@ -753,6 +768,33 @@ vmwgfx_check_hw_contents(struct vmwgfx_saa *vsaa,
REGION_UNINIT(vsaa->pScreen, &intersection);
}
+/**
+ * vmwgfx_prefer_gmr: Prefer a dma buffer over malloced memory for software
+ * rendered storage
+ *
+ * @vsaa: Pointer to a struct vmwgfx_saa accelerator.
+ * @pixmap: Pointer to pixmap whose storage preference we want to alter.
+ *
+ * If possible, alter the storage or future storage of the software contents
+ * of this pixmap to be in a DMA buffer rather than in malloced memory.
+ * This function should be called when it's likely that frequent DMA operations
+ * will occur between a surface and the memory holding the software
+ * contents.
+ */
+static void
+vmwgfx_prefer_gmr(struct vmwgfx_saa *vsaa, PixmapPtr pixmap)
+{
+ struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap);
+
+ if (vsaa->can_optimize_dma) {
+ if (vpix->malloc) {
+ (void) vmwgfx_pixmap_create_gmr(vsaa, pixmap);
+ } else if (vpix->backing & VMWGFX_PIX_MALLOC) {
+ vpix->backing |= VMWGFX_PIX_GMR;
+ vpix->backing &= ~VMWGFX_PIX_MALLOC;
+ }
+ }
+}
Bool
vmwgfx_create_hw(struct vmwgfx_saa *vsaa,
@@ -786,15 +828,16 @@ vmwgfx_create_hw(struct vmwgfx_saa *vsaa,
if (!vmwgfx_pixmap_add_damage(pixmap))
goto out_no_damage;
- /*
- * Even if we don't have a GMR yet, indicate that when needed it
- * should be created.
- */
-
vpix->hw = hw;
vpix->backing |= VMWGFX_PIX_SURFACE;
vmwgfx_pixmap_free_storage(vpix);
+ /*
+ * If there is a HW surface, make sure that the shadow is
+ * (or will be) a GMR, provided we can do fast DMAs from / to it.
+ */
+ vmwgfx_prefer_gmr(vsaa, pixmap);
+
return TRUE;
out_no_damage:
@@ -1226,10 +1269,14 @@ vmwgfx_operation_complete(struct saa_driver *driver,
* executed at glxWaitX(). Currently glxWaitX() is broken, so
* we flush immediately, unless we're VT-switched away, in which
* case a flush would deadlock in the kernel.
+ *
+ * For pixmaps for which vpix->hw_is_hosted is true, we can explicitly
+ * inform the compositor when contents has changed, so for those pixmaps
+ * we defer the upload until the compositor is informed, by putting
+ * them on the sync_x_list. Note that hw_is_dri2_fronts take precedence.
*/
-
- if (vpix->hw && vpix->hw_is_dri2_fronts) {
- if (pScrn->vtSema &&
+ if (vpix->hw && (vpix->hw_is_dri2_fronts || vpix->hw_is_hosted)) {
+ if (pScrn->vtSema && vpix->hw_is_dri2_fronts &&
vmwgfx_upload_to_hw(driver, pixmap, &spix->dirty_shadow)) {
REGION_EMPTY(vsaa->pScreen, &spix->dirty_shadow);
@@ -1539,6 +1586,7 @@ vmwgfx_saa_set_master(ScreenPtr pScreen)
struct vmwgfx_saa *vsaa = to_vmwgfx_saa(saa_get_driver(pScreen));
vsaa->is_master = TRUE;
+ vmwgfx_flush_dri2(pScreen);
}
void
@@ -1563,3 +1611,134 @@ vmwgfx_saa_drop_master(ScreenPtr pScreen)
vsaa->is_master = FALSE;
}
+
+/*
+ * *************************************************************************
+ * Helpers for hosted.
+ */
+
+#if (XA_TRACKER_VERSION_MAJOR >= 2)
+
+/**
+ * vmwgfx_saa_copy_to_surface - Copy Drawable contents to an external surface.
+ *
+ * @pDraw: Pointer to source drawable.
+ * @surface_fd: Prime file descriptor of external surface to copy to.
+ * @dst_box: BoxRec describing the destination bounding box.
+ * @region: Region of drawable to copy. Note: The code assumes that the
+ * region is relative to the drawable origin, not the underlying pixmap
+ * origin.
+ *
+ * Copies the contents (both software- and accelerated contents) to an
+ * external surface.
+ */
+Bool
+vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
+ const BoxRec *dst_box, RegionPtr region)
+{
+ ScreenPtr pScreen = pDraw->pScreen;
+ struct vmwgfx_saa *vsaa = to_vmwgfx_saa(saa_get_driver(pScreen));
+ PixmapPtr src;
+ struct saa_pixmap *spix;
+ struct vmwgfx_saa_pixmap *vpix;
+ const BoxRec *box;
+ int n;
+ int sx, sy, dx, dy;
+ struct xa_surface *dst;
+ uint32_t handle;
+ Bool ret = TRUE;
+ RegionRec intersection;
+ RegionPtr copy_region = region;
+
+ if (vmwgfx_prime_fd_to_handle(vsaa->drm_fd, surface_fd, &handle) < 0)
+ return FALSE;
+
+ dst = xa_surface_from_handle(vsaa->xat, pDraw->width, pDraw->height,
+ pDraw->depth, xa_type_argb,
+ xa_format_unknown,
+ XA_FLAG_SHARED | XA_FLAG_RENDER_TARGET,
+ handle,
+ (pDraw->width * pDraw->bitsPerPixel + 7) / 8);
+
+ if (!dst) {
+ ret = FALSE;
+ goto out_no_surface;
+ }
+
+ /*
+ * Assume damage region is relative to the source window.
+ */
+ src = saa_get_pixmap(pDraw, &sx, &sy);
+ sx += pDraw->x;
+ sy += pDraw->y;
+ if (sx || sy)
+ REGION_TRANSLATE(pScreen, region, sx, sy);
+
+ dx = dst_box->x1 - sx;
+ dy = dst_box->y1 - sy;
+
+ spix = saa_get_saa_pixmap(src);
+ vpix = to_vmwgfx_saa_pixmap(spix);
+
+ /*
+ * Make sure software contents of the source pixmap is henceforth put
+ * in a GMR to avoid the extra copy in the xa DMA.
+ */
+ vmwgfx_prefer_gmr(vsaa, src);
+
+ /*
+ * Determine the intersection between software contents and region to copy.
+ * XXX: First check that the software contents is compatible with the
+ * external surface format, before applying this optimization.
+ */
+ REGION_NULL(pScreen, &intersection);
+ if (!vpix->hw)
+ REGION_COPY(pScreen, &intersection, region);
+ else if (spix->damage && REGION_NOTEMPTY(pScreen, &spix->dirty_shadow))
+ REGION_INTERSECT(pScreen, &intersection, region, &spix->dirty_shadow);
+
+ /*
+ * DMA software contents directly into the destination. Then subtract
+ * the region we've DMA'd from the region to copy.
+ */
+ if (REGION_NOTEMPTY(pScreen, &intersection)) {
+ if (vmwgfx_saa_dma(vsaa, src, &intersection, TRUE, dx, dy, dst)) {
+ REGION_SUBTRACT(pScreen, &intersection, region, &intersection);
+ copy_region = &intersection;
+ }
+ }
+
+ if (!REGION_NOTEMPTY(pScreen, copy_region))
+ goto out_no_copy;
+
+ /*
+ * Copy Hardware contents to the destination
+ */
+ box = REGION_RECTS(copy_region);
+ n = REGION_NUM_RECTS(copy_region);
+
+ if (xa_copy_prepare(vsaa->xa_ctx, dst, vpix->hw) != XA_ERR_NONE) {
+ ret = FALSE;
+ goto out_no_copy;
+ }
+
+ while(n--) {
+ xa_copy(vsaa->xa_ctx, box->x1 + dx, box->y1 + dy, box->x1, box->y1,
+ box->x2 - box->x1, box->y2 - box->y1);
+ box++;
+ }
+
+ xa_copy_done(vsaa->xa_ctx);
+ xa_context_flush(vsaa->xa_ctx);
+
+ out_no_copy:
+ REGION_UNINIT(pScreen, &intersection);
+ if (sx || sy)
+ REGION_TRANSLATE(pScreen, region, -sx, -sy);
+ xa_surface_unref(dst);
+ out_no_surface:
+ vmwgfx_prime_release_handle(vsaa->drm_fd, handle);
+
+ return ret;
+}
+#endif
diff --git a/vmwgfx/vmwgfx_saa.h b/vmwgfx/vmwgfx_saa.h
index 5e1f40c..55f0ded 100644
--- a/vmwgfx/vmwgfx_saa.h
+++ b/vmwgfx/vmwgfx_saa.h
@@ -52,6 +52,7 @@ struct vmwgfx_saa_pixmap {
struct xa_surface *hw;
uint32_t fb_id;
int hw_is_dri2_fronts;
+ Bool hw_is_hosted;
struct _WsbmListHead sync_x_head;
struct _WsbmListHead scanout_list;
struct _WsbmListHead pixmap_list;
@@ -115,6 +116,10 @@ vmwgfx_saa_set_master(ScreenPtr pScreen);
void
vmwgfx_saa_drop_master(ScreenPtr pScreen);
+Bool
+vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
+ const BoxRec *dst_box, RegionPtr region);
+
#if (XA_TRACKER_VERSION_MAJOR <= 1) && !defined(HAVE_XA_2)
#define _xa_surface_handle(_a, _b, _c) xa_surface_handle(_a, _b, _c)
diff --git a/vmwgfx/vmwgfx_xmir.c b/vmwgfx/vmwgfx_xmir.c
new file mode 100644
index 0000000..e0ff6a4
--- /dev/null
+++ b/vmwgfx/vmwgfx_xmir.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2013 VMWare, Inc.
+ * 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.
+ *
+ * Author: Thomas Hellstrom <thellstrom@vmware.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "vmwgfx_hosted_priv.h"
+#include <xa_tracker.h>
+
+#if XMIR && (XA_TRACKER_VERSION_MAJOR >= 2)
+
+#include "vmwgfx_hosted.h"
+#include "vmwgfx_saa.h"
+#include <xf86Priv.h>
+#include <xmir.h>
+
+struct vmwgfx_hosted {
+ xmir_screen *xmir;
+ ScrnInfoPtr pScrn;
+ ScreenPtr pScreen;
+};
+
+static void
+vmwgfx_xmir_copy_to_mir(xmir_window *xmir_win, RegionPtr region);
+
+static xmir_driver vmwgfx_xmir_driver = {
+ XMIR_DRIVER_VERSION,
+ vmwgfx_xmir_copy_to_mir
+};
+
+static struct vmwgfx_hosted *
+vmwgfx_xmir_create(ScrnInfoPtr pScrn)
+{
+ struct vmwgfx_hosted *hosted;
+
+ hosted = calloc(1, sizeof(*hosted));
+ if (!hosted)
+ return NULL;
+
+ hosted->xmir = xmir_screen_create(pScrn);
+ if (!hosted->xmir) {
+ free(hosted);
+ return NULL;
+ }
+
+ hosted->pScrn = pScrn;
+ return hosted;
+}
+
+static void
+vmwgfx_xmir_destroy(struct vmwgfx_hosted *hosted)
+{
+ xmir_screen_destroy(hosted->xmir);
+ free(hosted);
+}
+
+static Bool
+vmwgfx_xmir_pre_init(struct vmwgfx_hosted *hosted, int flags)
+{
+ return xmir_screen_pre_init(hosted->pScrn, hosted->xmir,
+ &vmwgfx_xmir_driver);
+}
+
+static int
+vmwgfx_xmir_drm_fd(struct vmwgfx_hosted *hosted, const struct pci_device *pci)
+{
+ char bus_id[20];
+
+ snprintf(bus_id, sizeof(bus_id), "pci:%04x:%02x:%02x.%d",
+ pci->domain, pci->bus, pci->dev, pci->func);
+ return xmir_get_drm_fd(bus_id);
+}
+
+static Bool
+vmwgfx_xmir_screen_init(struct vmwgfx_hosted *hosted, ScreenPtr pScreen)
+{
+ if (!xmir_screen_init(pScreen, hosted->xmir))
+ return FALSE;
+
+ hosted->pScreen = pScreen;
+
+ return TRUE;
+}
+
+static void
+vmwgfx_xmir_screen_close(struct vmwgfx_hosted *hosted)
+{
+ if (hosted->pScreen)
+ xmir_screen_close(hosted->pScreen, hosted->xmir);
+
+ hosted->pScreen = NULL;
+}
+
+static void
+vmwgfx_xmir_post_damage(struct vmwgfx_hosted *hosted)
+{
+ xmir_screen_for_each_damaged_window(hosted->xmir, vmwgfx_xmir_copy_to_mir);
+}
+
+static int
+vmwgfx_xmir_dri_auth(struct vmwgfx_hosted *hosted, ClientPtr client,
+ uint32_t magic)
+{
+ return xmir_auth_drm_magic(hosted->xmir, magic);
+}
+
+static void
+vmwgfx_xmir_copy_to_mir(xmir_window *xmir_win, RegionPtr region)
+{
+ DrawablePtr pDraw = (DrawablePtr) xmir_window_to_windowptr(xmir_win);
+ const BoxRec *dst_box = xmir_window_get_drawable_region(xmir_win);
+
+ if (vmwgfx_saa_copy_to_surface(pDraw, xmir_window_get_fd(xmir_win),
+ dst_box, region))
+ xmir_submit_rendering_for_window(xmir_win, region);
+}
+
+static const struct vmwgfx_hosted_driver vmwgfx_hosted_xmir_driver = {
+ .create = vmwgfx_xmir_create,
+ .destroy = vmwgfx_xmir_destroy,
+ .drm_fd = vmwgfx_xmir_drm_fd,
+ .pre_init = vmwgfx_xmir_pre_init,
+ .screen_init = vmwgfx_xmir_screen_init,
+ .screen_close = vmwgfx_xmir_screen_close,
+ .post_damage = vmwgfx_xmir_post_damage,
+ .dri_auth = vmwgfx_xmir_dri_auth
+};
+
+const struct vmwgfx_hosted_driver *
+vmwgfx_xmir_detect(void)
+{
+ return (xorgMir) ? &vmwgfx_hosted_xmir_driver : NULL;
+}
+
+void vmwgfx_xmir_modify_flags(uint32_t *flags)
+{
+ if (xorgMir)
+ *flags |= HW_SKIP_CONSOLE;
+}
+
+#else
+
+const struct vmwgfx_hosted_driver *
+vmwgfx_xmir_detect(void)
+{
+ return NULL;
+}
+
+void
+vmwgfx_xmir_modify_flags(uint32_t *flags)
+{
+}
+#endif
--
1.8.5.3
@@ -1,254 +0,0 @@
From fd636e39a3f32a6dcd107c370513d8cb9aae26c2 Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Mon, 16 Dec 2013 06:21:09 -0800
Subject: [PATCH 14/19] vmwgfx: Add support for XWayland
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
vmwgfx/Makefile.am | 1 +
vmwgfx/vmwgfx_hosted.c | 4 +
vmwgfx/vmwgfx_hosted_priv.h | 3 +
vmwgfx/vmwgfx_xwayland.c | 186 ++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 194 insertions(+)
create mode 100644 vmwgfx/vmwgfx_xwayland.c
diff --git a/vmwgfx/Makefile.am b/vmwgfx/Makefile.am
index 41833a1..81b9e08 100644
--- a/vmwgfx/Makefile.am
+++ b/vmwgfx/Makefile.am
@@ -29,5 +29,6 @@ libvmwgfx_la_SOURCES = \
vmwgfx_hosted.h \
vmwgfx_hosted_priv.h \
vmwgfx_xmir.c \
+ vmwgfx_xwayland.c \
wsbm_util.h
endif
diff --git a/vmwgfx/vmwgfx_hosted.c b/vmwgfx/vmwgfx_hosted.c
index 018b88b..9b41f3e 100644
--- a/vmwgfx/vmwgfx_hosted.c
+++ b/vmwgfx/vmwgfx_hosted.c
@@ -48,6 +48,9 @@ vmwgfx_hosted_detect(void)
{
const struct vmwgfx_hosted_driver *tmp = vmwgfx_xmir_detect();
+ if (!tmp)
+ tmp = vmwgfx_xwl_detect();
+
return tmp;
}
@@ -64,4 +67,5 @@ void
vmwgfx_hosted_modify_flags(uint32_t *flags)
{
vmwgfx_xmir_modify_flags(flags);
+ vmwgfx_xwl_modify_flags(flags);
}
diff --git a/vmwgfx/vmwgfx_hosted_priv.h b/vmwgfx/vmwgfx_hosted_priv.h
index c81f5ee..2668e55 100644
--- a/vmwgfx/vmwgfx_hosted_priv.h
+++ b/vmwgfx/vmwgfx_hosted_priv.h
@@ -34,4 +34,7 @@
extern const struct vmwgfx_hosted_driver *vmwgfx_xmir_detect(void);
extern void vmwgfx_xmir_modify_flags(uint32_t *flags);
+extern const struct vmwgfx_hosted_driver *vmwgfx_xwl_detect(void);
+extern void vmwgfx_xwl_modify_flags(uint32_t *flags);
+
#endif
diff --git a/vmwgfx/vmwgfx_xwayland.c b/vmwgfx/vmwgfx_xwayland.c
new file mode 100644
index 0000000..a16a7c4
--- /dev/null
+++ b/vmwgfx/vmwgfx_xwayland.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2013 VMWare, Inc.
+ * 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.
+ *
+ * Author: Thomas Hellstrom <thellstrom@vmware.com>
+ * Author: Jakob Bornecrantz <jakob@vmware.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "vmwgfx_hosted_priv.h"
+
+#ifdef XORG_WAYLAND
+
+#include "vmwgfx_hosted.h"
+#include "vmwgfx_saa.h"
+#include <xf86Priv.h>
+#include <xwayland.h>
+
+struct vmwgfx_hosted {
+ struct xwl_screen *xwl;
+ ScrnInfoPtr pScrn;
+ ScreenPtr pScreen;
+};
+
+static int
+vmwgfx_create_window_buffer(struct xwl_window *xwl_window,
+ PixmapPtr pixmap)
+{
+ struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap);
+ uint32_t name, pitch;
+
+ if (!vmwgfx_hw_dri2_validate(pixmap, 0))
+ return BadDrawable;
+
+ /*
+ * Pixmaps with hw_is_hosted == TRUE are put on a flush list when
+ * they've seen software rendering. When vmwgfx_flush_dri2 is called
+ * on these pixmaps, software contents are flushed to the hardware
+ * surface.
+ */
+ vpix->hw_is_hosted = TRUE;
+ if (xa_surface_handle(vpix->hw, &name, &pitch) != XA_ERR_NONE)
+ return BadDrawable;
+
+ return xwl_create_window_buffer_drm(xwl_window, pixmap, name);
+}
+
+static struct xwl_driver vmwgfx_xwl_driver = {
+ .version = 2,
+ .use_drm = 1,
+ .create_window_buffer = vmwgfx_create_window_buffer
+};
+
+static struct vmwgfx_hosted *
+vmwgfx_xwl_create(ScrnInfoPtr pScrn)
+{
+ struct vmwgfx_hosted *hosted;
+
+ hosted = calloc(1, sizeof(*hosted));
+ if (!hosted)
+ return NULL;
+
+ hosted->xwl = xwl_screen_create();
+ if (!hosted->xwl) {
+ free(hosted);
+ return NULL;
+ }
+
+ hosted->pScrn = pScrn;
+ return hosted;
+}
+
+static void
+vmwgfx_xwl_destroy(struct vmwgfx_hosted *hosted)
+{
+ xwl_screen_destroy(hosted->xwl);
+ free(hosted);
+}
+
+static Bool
+vmwgfx_xwl_pre_init(struct vmwgfx_hosted *hosted, int flags)
+{
+ return xwl_screen_pre_init(hosted->pScrn, hosted->xwl, 0,
+ &vmwgfx_xwl_driver);
+}
+
+static int
+vmwgfx_xwl_drm_fd(struct vmwgfx_hosted *hosted, const struct pci_device *pci)
+{
+ return xwl_screen_get_drm_fd(hosted->xwl);
+}
+
+static Bool
+vmwgfx_xwl_screen_init(struct vmwgfx_hosted *hosted, ScreenPtr pScreen)
+{
+ if (xwl_screen_init(hosted->xwl, pScreen))
+ return FALSE;
+
+ hosted->pScreen = pScreen;
+
+ return TRUE;
+}
+
+static void
+vmwgfx_xwl_screen_close(struct vmwgfx_hosted *hosted)
+{
+ if (hosted->pScreen)
+ xwl_screen_close(hosted->xwl);
+
+ hosted->pScreen = NULL;
+}
+
+static void
+vmwgfx_xwl_post_damage(struct vmwgfx_hosted *hosted)
+{
+ vmwgfx_flush_dri2(hosted->pScreen);
+ xwl_screen_post_damage(hosted->xwl);
+}
+
+static int
+vmwgfx_xwl_dri_auth(struct vmwgfx_hosted *hosted, ClientPtr client,
+ uint32_t magic)
+{
+ return xwl_drm_authenticate(client, hosted->xwl, magic);
+}
+
+static const struct vmwgfx_hosted_driver vmwgfx_hosted_xwl_driver = {
+ .create = vmwgfx_xwl_create,
+ .destroy = vmwgfx_xwl_destroy,
+ .drm_fd = vmwgfx_xwl_drm_fd,
+ .pre_init = vmwgfx_xwl_pre_init,
+ .screen_init = vmwgfx_xwl_screen_init,
+ .screen_close = vmwgfx_xwl_screen_close,
+ .post_damage = vmwgfx_xwl_post_damage,
+ .dri_auth = vmwgfx_xwl_dri_auth
+};
+
+const struct vmwgfx_hosted_driver *
+vmwgfx_xwl_detect(void)
+{
+ return (xorgWayland) ? &vmwgfx_hosted_xwl_driver : NULL;
+}
+
+void
+vmwgfx_xwl_modify_flags(uint32_t *flags)
+{
+ if (xorgWayland)
+ *flags |= HW_SKIP_CONSOLE | HW_WAYLAND;
+}
+
+#else
+
+const struct vmwgfx_hosted_driver *
+vmwgfx_xwl_detect(void)
+{
+ return NULL;
+}
+
+void
+vmwgfx_xwl_modify_flags(uint32_t *flags)
+{
+}
+#endif
--
1.8.5.3
@@ -1,33 +0,0 @@
From 97ce302ddd6e86397ea56ea9089b9549af73c3ac Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Mon, 6 Jan 2014 12:37:36 +0100
Subject: [PATCH 15/19] vmwgfx: Enable direct dmas
Enable direct dmas instead of using the xa-provided dma functionality.
This saves a bounce-buffer software copy of all dma'd contents.
This also implies that all drawables with mixed software / hardware contents
will use a kernel buffer for software rendering.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@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 c8b4df1..c323c5f 100644
--- a/vmwgfx/vmwgfx_saa.c
+++ b/vmwgfx/vmwgfx_saa.c
@@ -1423,7 +1423,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->can_optimize_dma = TRUE;
vsaa->use_present_opt = direct_presents;
vsaa->only_hw_presents = only_hw_presents;
vsaa->rendercheck = rendercheck;
--
1.8.5.3
@@ -1,109 +0,0 @@
From f37684e7169b9c0ab23ff748d5acacb65fad82f7 Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Tue, 7 Jan 2014 17:55:49 +0100
Subject: [PATCH 16/19] vmwgfx: Block DMA to prime surfaces for now
Since there is currently no _good_ way to get the surface format of a
prime surface, we block DMA to these surfaces; we don't know if our
software data is compatible with the surface format.
This patch also makes sure that there is a hardware surface backing the
drawable we copy from.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
vmwgfx/vmwgfx_saa.c | 40 ++++++++++++++++++++++++----------------
vmwgfx/vmwgfx_saa_priv.h | 1 +
2 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c
index c323c5f..cb55849 100644
--- a/vmwgfx/vmwgfx_saa.c
+++ b/vmwgfx/vmwgfx_saa.c
@@ -1428,6 +1428,7 @@ vmwgfx_saa_init(ScreenPtr pScreen, int drm_fd, struct xa_tracker *xat,
vsaa->only_hw_presents = only_hw_presents;
vsaa->rendercheck = rendercheck;
vsaa->is_master = TRUE;
+ vsaa->known_prime_format = FALSE;
WSBMINITLISTHEAD(&vsaa->sync_x_list);
WSBMINITLISTHEAD(&vsaa->pixmaps);
@@ -1688,23 +1689,24 @@ vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
/*
* Determine the intersection between software contents and region to copy.
- * XXX: First check that the software contents is compatible with the
- * external surface format, before applying this optimization.
*/
- REGION_NULL(pScreen, &intersection);
- if (!vpix->hw)
- REGION_COPY(pScreen, &intersection, region);
- else if (spix->damage && REGION_NOTEMPTY(pScreen, &spix->dirty_shadow))
- REGION_INTERSECT(pScreen, &intersection, region, &spix->dirty_shadow);
- /*
- * DMA software contents directly into the destination. Then subtract
- * the region we've DMA'd from the region to copy.
- */
- if (REGION_NOTEMPTY(pScreen, &intersection)) {
- if (vmwgfx_saa_dma(vsaa, src, &intersection, TRUE, dx, dy, dst)) {
- REGION_SUBTRACT(pScreen, &intersection, region, &intersection);
- copy_region = &intersection;
+ if (vsaa->known_prime_format) {
+ REGION_NULL(pScreen, &intersection);
+ if (!vpix->hw)
+ REGION_COPY(pScreen, &intersection, region);
+ else if (spix->damage && REGION_NOTEMPTY(pScreen, &spix->dirty_shadow))
+ REGION_INTERSECT(pScreen, &intersection, region, &spix->dirty_shadow);
+
+ /*
+ * DMA software contents directly into the destination. Then subtract
+ * the region we've DMA'd from the region to copy.
+ */
+ if (REGION_NOTEMPTY(pScreen, &intersection)) {
+ if (vmwgfx_saa_dma(vsaa, src, &intersection, TRUE, dx, dy, dst)) {
+ REGION_SUBTRACT(pScreen, &intersection, region, &intersection);
+ copy_region = &intersection;
+ }
}
}
@@ -1717,6 +1719,11 @@ vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
box = REGION_RECTS(copy_region);
n = REGION_NUM_RECTS(copy_region);
+ if (!vmwgfx_hw_accel_validate(src, 0, 0, 0, copy_region)) {
+ ret = FALSE;
+ goto out_no_copy;
+ }
+
if (xa_copy_prepare(vsaa->xa_ctx, dst, vpix->hw) != XA_ERR_NONE) {
ret = FALSE;
goto out_no_copy;
@@ -1732,7 +1739,8 @@ vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
xa_context_flush(vsaa->xa_ctx);
out_no_copy:
- REGION_UNINIT(pScreen, &intersection);
+ if (vsaa->known_prime_format)
+ REGION_UNINIT(pScreen, &intersection);
if (sx || sy)
REGION_TRANSLATE(pScreen, region, -sx, -sy);
xa_surface_unref(dst);
diff --git a/vmwgfx/vmwgfx_saa_priv.h b/vmwgfx/vmwgfx_saa_priv.h
index 16583b0..c84827b 100644
--- a/vmwgfx/vmwgfx_saa_priv.h
+++ b/vmwgfx/vmwgfx_saa_priv.h
@@ -55,6 +55,7 @@ struct vmwgfx_saa {
Bool only_hw_presents;
Bool rendercheck;
Bool is_master;
+ Bool known_prime_format;
void (*present_flush) (ScreenPtr pScreen);
struct _WsbmListHead sync_x_list;
struct _WsbmListHead pixmaps;
--
1.8.5.3
@@ -1,103 +0,0 @@
From d6b179a5addef6456325adf241eb8dcaf8e4c3d6 Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Thu, 9 Jan 2014 13:28:22 +0100
Subject: [PATCH 17/19] vmware: Fix build errors and warnings
A previous commit and the hosted merge unfortunately brought in some build
errors / warnings on early X servers.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
src/vmware_bootstrap.c | 1 +
src/vmwarevideo.c | 4 ++--
vmwgfx/vmwgfx_driver.c | 2 +-
vmwgfx/vmwgfx_overlay.c | 4 ++--
vmwgfx/vmwgfx_tex_video.c | 2 +-
5 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/vmware_bootstrap.c b/src/vmware_bootstrap.c
index 57f8ae9..ed6c740 100644
--- a/src/vmware_bootstrap.c
+++ b/src/vmware_bootstrap.c
@@ -34,6 +34,7 @@
#include "xf86Pci.h" /* pci */
#include "vm_device_version.h"
#include "vmware_bootstrap.h"
+#include <stdint.h>
#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
#include "xf86Resources.h"
diff --git a/src/vmwarevideo.c b/src/vmwarevideo.c
index 8d7d171..745c71f 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 const XF86VideoEncodingRec vmwareVideoEncodings[] =
+static XF86VideoEncodingRec vmwareVideoEncodings[] =
{
{
0,
@@ -108,7 +108,7 @@ static XF86ImageRec vmwareVideoImages[] =
};
#define VMWARE_VID_NUM_ATTRIBUTES 2
-static const XF86AttributeRec vmwareVideoAttributes[] =
+static XF86AttributeRec vmwareVideoAttributes[] =
{
{
XvGettable | XvSettable,
diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c
index dc05b86..2d38d2a 100644
--- a/vmwgfx/vmwgfx_driver.c
+++ b/vmwgfx/vmwgfx_driver.c
@@ -130,7 +130,7 @@ vmwgfx_hookup(ScrnInfoPtr pScrn)
}
void
-vmwgfx_modify_flags(CARD32 *flags)
+vmwgfx_modify_flags(uint32_t *flags)
{
*flags &= ~(HW_IO);
vmwgfx_hosted_modify_flags(flags);
diff --git a/vmwgfx/vmwgfx_overlay.c b/vmwgfx/vmwgfx_overlay.c
index c8c6bb9..2c0d7fa 100644
--- a/vmwgfx/vmwgfx_overlay.c
+++ b/vmwgfx/vmwgfx_overlay.c
@@ -85,7 +85,7 @@ typedef uint8_t uint8;
#define VMWARE_VID_MAX_HEIGHT 2048
#define VMWARE_VID_NUM_ENCODINGS 1
-static const XF86VideoEncodingRec vmwareVideoEncodings[] =
+static XF86VideoEncodingRec vmwareVideoEncodings[] =
{
{
0,
@@ -111,7 +111,7 @@ static XF86ImageRec vmwareVideoImages[] =
};
#define VMWARE_VID_NUM_ATTRIBUTES 2
-static const XF86AttributeRec vmwareVideoAttributes[] =
+static XF86AttributeRec vmwareVideoAttributes[] =
{
{
XvGettable | XvSettable,
diff --git a/vmwgfx/vmwgfx_tex_video.c b/vmwgfx/vmwgfx_tex_video.c
index 9fd8f22..0803a99 100644
--- a/vmwgfx/vmwgfx_tex_video.c
+++ b/vmwgfx/vmwgfx_tex_video.c
@@ -82,7 +82,7 @@ static XF86VideoFormatRec Formats[NUM_FORMATS] = {
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
};
-static const XF86VideoEncodingRec DummyEncoding[1] = {
+static XF86VideoEncodingRec DummyEncoding[1] = {
{
0,
"XV_IMAGE",
--
1.8.5.3
@@ -1,111 +0,0 @@
From 31bff9f7f3d9a68fd1449532e8ab50065de63857 Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Thu, 9 Jan 2014 13:53:59 +0100
Subject: [PATCH 18/19] vmware: Require libdrm 2.4.38 to build XMir.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
configure.ac | 6 ++++++
vmwgfx/vmwgfx_drmi.c | 2 ++
vmwgfx/vmwgfx_drmi.h | 2 ++
vmwgfx/vmwgfx_saa.c | 2 +-
vmwgfx/vmwgfx_saa.h | 2 ++
vmwgfx/vmwgfx_xmir.c | 2 +-
6 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 123356c..3e8d541 100644
--- a/configure.ac
+++ b/configure.ac
@@ -127,6 +127,12 @@ if test x$BUILD_VMWGFX = xyes; then
[AC_DEFINE([HAVE_XA_2], 1,
[Has version 2 of XA])])],
[],[BUILD_VMWGFX=no])
+#
+# Check for prime.
+#
+ PKG_CHECK_EXISTS([libdrm >= 2.4.38],
+ [AC_DEFINE([HAVE_LIBDRM_2_4_38], 1,
+ [Has version 2.4.38 or greater of libdrm])])
fi
DRIVER_NAME=vmware
diff --git a/vmwgfx/vmwgfx_drmi.c b/vmwgfx/vmwgfx_drmi.c
index d926019..b6fb56d 100644
--- a/vmwgfx/vmwgfx_drmi.c
+++ b/vmwgfx/vmwgfx_drmi.c
@@ -501,6 +501,7 @@ vmwgfx_max_fb_size(int drm_fd, size_t *size)
return 0;
}
+#ifdef HAVE_LIBDRM_2_4_38
/**
* vmwgfx_prime_fd_to_handle - Return a TTM handle to a prime object
*
@@ -537,3 +538,4 @@ vmwgfx_prime_release_handle(int drm_fd, uint32_t handle)
(void) drmCommandWrite(drm_fd, DRM_VMW_UNREF_SURFACE, &s_arg,
sizeof(s_arg));
}
+#endif /* HAVE_LIBDRM_2_4_38 */
diff --git a/vmwgfx/vmwgfx_drmi.h b/vmwgfx/vmwgfx_drmi.h
index 1494485..3168088 100644
--- a/vmwgfx/vmwgfx_drmi.h
+++ b/vmwgfx/vmwgfx_drmi.h
@@ -85,9 +85,11 @@ vmwgfx_update_gui_layout(int drm_fd, unsigned int num_rects,
int
vmwgfx_get_param(int drm_fd, uint32_t param, uint64_t *out);
+#ifdef HAVE_LIBDRM_2_4_38
int
vmwgfx_prime_fd_to_handle(int drm_fd, int prime_fd, uint32_t *handle);
void
vmwgfx_prime_release_handle(int drm_fd, uint32_t handle);
+#endif /* HAVE_LIBDRM_2_4_38 */
#endif
diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c
index cb55849..8c97618 100644
--- a/vmwgfx/vmwgfx_saa.c
+++ b/vmwgfx/vmwgfx_saa.c
@@ -1618,7 +1618,7 @@ vmwgfx_saa_drop_master(ScreenPtr pScreen)
* Helpers for hosted.
*/
-#if (XA_TRACKER_VERSION_MAJOR >= 2)
+#if (XA_TRACKER_VERSION_MAJOR >= 2) && defined(HAVE_LIBDRM_2_4_38)
/**
* vmwgfx_saa_copy_to_surface - Copy Drawable contents to an external surface.
diff --git a/vmwgfx/vmwgfx_saa.h b/vmwgfx/vmwgfx_saa.h
index 55f0ded..921fabd 100644
--- a/vmwgfx/vmwgfx_saa.h
+++ b/vmwgfx/vmwgfx_saa.h
@@ -116,9 +116,11 @@ vmwgfx_saa_set_master(ScreenPtr pScreen);
void
vmwgfx_saa_drop_master(ScreenPtr pScreen);
+#if (XA_TRACKER_VERSION_MAJOR >= 2) && defined(HAVE_LIBDRM_2_4_38)
Bool
vmwgfx_saa_copy_to_surface(DrawablePtr pDraw, uint32_t surface_fd,
const BoxRec *dst_box, RegionPtr region);
+#endif /* (XA_TRACKER_VERSION_MAJOR >= 2) && defined(HAVE_LIBDRM_2_4_38) */
#if (XA_TRACKER_VERSION_MAJOR <= 1) && !defined(HAVE_XA_2)
diff --git a/vmwgfx/vmwgfx_xmir.c b/vmwgfx/vmwgfx_xmir.c
index e0ff6a4..ede6753 100644
--- a/vmwgfx/vmwgfx_xmir.c
+++ b/vmwgfx/vmwgfx_xmir.c
@@ -32,7 +32,7 @@
#include "vmwgfx_hosted_priv.h"
#include <xa_tracker.h>
-#if XMIR && (XA_TRACKER_VERSION_MAJOR >= 2)
+#if XMIR && (XA_TRACKER_VERSION_MAJOR >= 2) && defined(HAVE_LIBDRM_2_4_38)
#include "vmwgfx_hosted.h"
#include "vmwgfx_saa.h"
--
1.8.5.3
@@ -1,45 +0,0 @@
From 8da981712f62050076cff53e1b40ed1e307fcca8 Mon Sep 17 00:00:00 2001
From: Thomas Hellstrom <thellstrom@vmware.com>
Date: Wed, 15 Jan 2014 11:04:05 +0100
Subject: [PATCH 19/19] vmware/vmwgfx: Always allocate shared hardware
surfaces.
Hardware surfaces are all likely to be shared at some point, and we *really*
don't want to change a hardware surface that is bound as a drm framebuffer.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
---
vmwgfx/vmwgfx_saa.c | 2 +-
vmwgfx/vmwgfx_xa_surface.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c
index 8c97618..b56b05f 100644
--- a/vmwgfx/vmwgfx_saa.c
+++ b/vmwgfx/vmwgfx_saa.c
@@ -811,7 +811,7 @@ vmwgfx_create_hw(struct vmwgfx_saa *vsaa,
return TRUE;
new_flags = (vpix->xa_flags & ~vpix->staging_remove_flags) |
- vpix->staging_add_flags;
+ vpix->staging_add_flags | XA_FLAG_SHARED;
hw = xa_surface_create(vsaa->xat,
pixmap->drawable.width,
diff --git a/vmwgfx/vmwgfx_xa_surface.c b/vmwgfx/vmwgfx_xa_surface.c
index 2f23c57..189bfdc 100644
--- a/vmwgfx/vmwgfx_xa_surface.c
+++ b/vmwgfx/vmwgfx_xa_surface.c
@@ -318,7 +318,7 @@ vmwgfx_hw_commit(PixmapPtr pixmap)
uint32_t new_flags;
new_flags = (vpix->xa_flags & ~vpix->staging_remove_flags) |
- vpix->staging_add_flags;
+ vpix->staging_add_flags | XA_FLAG_SHARED;
if (vpix->staging_format != xa_surface_format(vpix->hw))
LogMessage(X_INFO, "Changing hardware format.\n");
--
1.8.5.3
File diff suppressed because it is too large Load Diff
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<herd>x11</herd>
<maintainer>
<email>dev-zero@gentoo.org</email>
<name>Tiziano Müller</name>
</maintainer>
</pkgmetadata>
@@ -1,20 +0,0 @@
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
EAPI=5
XORG_DRI=always
inherit xorg-2
DESCRIPTION="VMware SVGA video driver"
KEYWORDS="~amd64 ~x86 ~x86-fbsd"
IUSE=""
RDEPEND="x11-libs/libdrm[libkms,video_cards_vmware]
>=media-libs/mesa-10[xa]"
DEPEND="${RDEPEND}"
PATCHES=(
"${FILESDIR}"/0*.patch
)