From fd636e39a3f32a6dcd107c370513d8cb9aae26c2 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 16 Dec 2013 06:21:09 -0800 Subject: vmwgfx: Add support for XWayland Signed-off-by: Thomas Hellstrom Reviewed-by: Brian Paul Reviewed-by: Jakob Bornecrantz --- 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 + * Author: Jakob Bornecrantz + */ + +#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 +#include + +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 -- cgit v1.2.3