summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2013-12-16 06:21:09 -0800
committerThomas Hellstrom <thellstrom@vmware.com>2013-12-19 07:47:17 -0800
commitfd636e39a3f32a6dcd107c370513d8cb9aae26c2 (patch)
treea45503cf52acaaae1551ea8c28716fee63911de2
parentc020923597d3bc30dffa89ba0a47f3b9517dd5fb (diff)
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>
-rw-r--r--vmwgfx/Makefile.am1
-rw-r--r--vmwgfx/vmwgfx_hosted.c4
-rw-r--r--vmwgfx/vmwgfx_hosted_priv.h3
-rw-r--r--vmwgfx/vmwgfx_xwayland.c186
4 files changed, 194 insertions, 0 deletions
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