xenocara/driver/xf86-video-vmware/vmwgfx/vmwgfx_xwayland.c
2014-09-27 17:39:03 +00:00

187 lines
4.5 KiB
C

/*
* 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