mirror of
https://github.com/X11Libre/xf86-video-vmware.git
synced 2026-03-24 01:24:37 +00:00
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>
This commit is contained in:
@@ -29,5 +29,6 @@ libvmwgfx_la_SOURCES = \
|
||||
vmwgfx_hosted.h \
|
||||
vmwgfx_hosted_priv.h \
|
||||
vmwgfx_xmir.c \
|
||||
vmwgfx_xwayland.c \
|
||||
wsbm_util.h
|
||||
endif
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
186
vmwgfx/vmwgfx_xwayland.c
Normal file
186
vmwgfx/vmwgfx_xwayland.c
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user