summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-09-24 15:01:09 -0400
committerKristian Høgsberg <krh@bitplanet.net>2013-08-21 23:36:15 -0700
commitd9769c193765ac303ad4d4760e57ff368df1f663 (patch)
tree52457ffab4f931f190201583c19fe4e0a9f10214
parentf57ce6ef9ca735d5cb428b2f12f1f9413a70506a (diff)
xwayland: Add xwayland support
-rw-r--r--src/intel_device.c18
-rw-r--r--src/intel_driver.h6
-rw-r--r--src/intel_module.c8
-rw-r--r--src/uxa/intel.h2
-rw-r--r--src/uxa/intel_dri.c38
-rw-r--r--src/uxa/intel_driver.c89
6 files changed, 140 insertions, 21 deletions
diff --git a/src/intel_device.c b/src/intel_device.c
index d9ff8bcc..370b03c1 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -178,20 +178,24 @@ int intel_open_device(int entity_num,
return -1;
dev = xf86GetEntityPrivate(entity_num, intel_device_key)->ptr;
if (dev)
return dev->fd;
- local_path = path ? strdup(path) : NULL;
+ if (!xorgWayland) {
+ local_path = path ? strdup(path) : NULL;
- fd = __intel_open_device(pci, &local_path);
- if (fd == -1)
- goto err_path;
+ fd = __intel_open_device(pci, &local_path);
+ if (fd == -1)
+ goto err_path;
- if (!__intel_check_device(fd))
- goto err_close;
+ if (!__intel_check_device(fd))
+ goto err_close;
+ } else {
+ fd = -1;
+ }
dev = malloc(sizeof(*dev));
if (dev == NULL)
goto err_close;
dev->path = local_path;
@@ -204,13 +208,13 @@ int intel_open_device(int entity_num,
dev->open_count++;
dev->master_count++;
}
xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
- return fd;
+ return xorgWayland ? 0 : fd;
err_close:
close(fd);
err_path:
free(local_path);
return -1;
diff --git a/src/intel_driver.h b/src/intel_driver.h
index 47685364..103d31e7 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -126,9 +126,13 @@ const char *intel_get_device_name(ScrnInfoPtr scrn);
int intel_get_master(ScrnInfoPtr scrn);
int intel_put_master(ScrnInfoPtr scrn);
void intel_put_device(ScrnInfoPtr scrn);
void __intel_uxa_release_device(ScrnInfoPtr scrn);
-#define hosted() (0)
+#include <xorg-server.h>
+#ifdef XORG_WAYLAND
+#include <xf86Priv.h>
+#define hosted() (xorgWayland)
+#endif
#endif /* INTEL_DRIVER_H */
diff --git a/src/intel_module.c b/src/intel_module.c
index b91152e8..ec6d8b84 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -27,12 +27,13 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <xf86.h>
#include <xf86Parser.h>
+#include <xf86Priv.h>
#include <xorgVersion.h>
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,6,99,0,0)
#include <xf86Resources.h>
#endif
@@ -384,12 +385,16 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
#endif
#ifdef HW_SKIP_CONSOLE
if (hosted())
(*flag) = HW_SKIP_CONSOLE;
#endif
+#ifdef HW_WAYLAND
+ if (xorgWayland)
+ (*flag) = HW_WAYLAND;
+#endif
return TRUE;
default:
/* Unknown or deprecated function */
return FALSE;
}
}
@@ -412,12 +417,15 @@ _xf86findDriver(const char *ident, XF86ConfDevicePtr p)
static enum accel_method { UXA, SNA } get_accel_method(void)
{
enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
XF86ConfDevicePtr dev;
+ if (xorgWayland)
+ return UXA;
+
if (hosted())
return SNA;
dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
if (dev && dev->dev_option_lst) {
const char *s;
diff --git a/src/uxa/intel.h b/src/uxa/intel.h
index 9b696cd8..0b3b95c5 100644
--- a/src/uxa/intel.h
+++ b/src/uxa/intel.h
@@ -347,12 +347,14 @@ typedef struct intel_screen_private {
unsigned debug_flush;
#if HAVE_UDEV
struct udev_monitor *uevent_monitor;
InputHandlerProc uevent_handler;
#endif
Bool has_prime_vmap_flush;
+
+ struct xwl_screen *xwl_screen;
} intel_screen_private;
#define INTEL_INFO(intel) ((intel)->info)
#define IS_GENx(intel, X) (INTEL_INFO(intel)->gen >= 8*(X) && INTEL_INFO(intel)->gen < 8*((X)+1))
#define IS_GEN1(intel) IS_GENx(intel, 1)
#define IS_GEN2(intel) IS_GENx(intel, 2)
diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c
index 03700343..74dabe60 100644
--- a/src/uxa/intel_dri.c
+++ b/src/uxa/intel_dri.c
@@ -47,20 +47,25 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <sys/time.h>
#include <time.h>
#include <errno.h>
#include "xf86.h"
#include "xf86_OSproc.h"
+#include "xf86Priv.h"
#include "xf86Pci.h"
#include "xf86drm.h"
#include "windowstr.h"
#include "shadow.h"
#include "fb.h"
+#ifdef XORG_WAYLAND
+#include <xwayland.h>
+#endif
+
#include "intel.h"
#include "i830_reg.h"
#include "i915_drm.h"
#include "dri2.h"
@@ -1517,12 +1522,28 @@ out_free:
i830_dri2_del_frame_event(draw, wait_info);
out_complete:
DRI2WaitMSCComplete(client, draw, target_msc, 0, 0);
return TRUE;
}
+#if DRI2INFOREC_VERSION >= 10
+static int intel_auth_magic3(ClientPtr client, ScreenPtr screen, uint32_t magic)
+
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ /* Not wayland, go stragight to drm */
+ if (!xorgWayland)
+ return drmAuthMagic(intel->drmSubFD, magic);
+
+ /* Forward the request to our host */
+ return xwl_drm_authenticate(client, intel->xwl_screen, magic);
+}
+#endif
+
static int dri2_server_generation;
#endif
static int has_i830_dri(void)
{
return access(DRI_DRIVER_PATH "/i830_dri.so", R_OK) == 0;
@@ -1614,20 +1635,31 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
info.DestroyBuffer = I830DRI2DestroyBuffer;
#endif
info.CopyRegion = I830DRI2CopyRegion;
#if DRI2INFOREC_VERSION >= 4
info.version = 4;
- info.ScheduleSwap = I830DRI2ScheduleSwap;
- info.GetMSC = I830DRI2GetMSC;
- info.ScheduleWaitMSC = I830DRI2ScheduleWaitMSC;
+ if (!xorgWayland) {
+ info.ScheduleSwap = I830DRI2ScheduleSwap;
+ info.GetMSC = I830DRI2GetMSC;
+ info.ScheduleWaitMSC = I830DRI2ScheduleWaitMSC;
+ } else {
+ info.ScheduleSwap = NULL;
+ info.GetMSC = NULL;
+ info.ScheduleWaitMSC = NULL;
+ }
info.numDrivers = 1;
info.driverNames = driverNames;
driverNames[0] = info.driverName;
#endif
+#if DRI2INFOREC_VERSION >= 10
+ info.version = 10;
+ info.AuthMagic3 = intel_auth_magic3;
+#endif
+
return DRI2ScreenInit(screen, &info);
}
void I830DRI2CloseScreen(ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 675408da..e74ba600 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -67,18 +67,23 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#ifdef INTEL_XVMC
#define _INTEL_XVMC_SERVER_
#include "intel_xvmc.h"
#endif
+#ifdef XORG_WAYLAND
+#include <xwayland.h>
+#endif
+
#include "legacy/legacy.h"
#include "uxa.h"
#include <sys/ioctl.h>
#include "i915_drm.h"
#include <xf86drmMode.h>
+#include <xf86Priv.h>
#include "intel_glamor.h"
#include "intel_options.h"
static void i830AdjustFrame(ADJUST_FRAME_ARGS_DECL);
static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL);
@@ -164,16 +169,22 @@ static Bool i830CreateScreenResources(ScreenPtr screen)
intel_screen_private *intel = intel_get_screen_private(scrn);
screen->CreateScreenResources = intel->CreateScreenResources;
if (!(*screen->CreateScreenResources) (screen))
return FALSE;
+#ifdef XORG_WAYLAND
+ if (intel->xwl_screen)
+ xwl_screen_init(intel->xwl_screen, screen);
+#endif
+
if (!intel_uxa_create_screen_resources(screen))
return FALSE;
- intel_copy_fb(scrn);
+ if (!intel->xwl_screen)
+ intel_copy_fb(scrn);
return TRUE;
}
static void PreInitCleanup(ScrnInfoPtr scrn)
{
if (!scrn || !scrn->driverPrivate)
@@ -460,12 +471,33 @@ static void intel_setup_capabilities(ScrnInfoPtr scrn)
if (value & DRM_PRIME_CAP_IMPORT)
scrn->capabilities |= RR_Capability_SinkOutput;
}
#endif
}
+#ifdef XORG_WAYLAND
+static int intel_create_window_buffer(struct xwl_window *xwl_window,
+ PixmapPtr pixmap)
+{
+ uint32_t name;
+ dri_bo *bo;
+
+ bo = intel_get_pixmap_bo(pixmap);
+ if (bo == NULL || dri_bo_flink(bo, &name) != 0)
+ return BadDrawable;
+
+ return xwl_create_window_buffer_drm(xwl_window, pixmap, name);
+}
+
+static struct xwl_driver xwl_driver = {
+ .version = 1,
+ .use_drm = 1,
+ .create_window_buffer = intel_create_window_buffer
+};
+#endif
+
/**
* This is called before ScreenInit to do any require probing of screen
* configuration.
*
* This code generally covers probing, module loading, option handling
* card mapping, and RandR setup.
@@ -514,18 +546,12 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
intel->pEnt = pEnt;
scrn->displayWidth = 640; /* default it */
intel->PciInfo = xf86GetPciInfoForEntity(intel->pEnt->index);
- if (!intel_open_drm_master(scrn)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Failed to become DRM master.\n");
- return FALSE;
- }
-
scrn->monitor = scrn->confScreen->monitor;
scrn->progClock = TRUE;
scrn->rgbBits = 8;
flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32;
@@ -558,12 +584,37 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
return FALSE;
intel_setup_capabilities(scrn);
intel_check_chipset_option(scrn);
intel_check_dri_option(scrn);
+#ifdef XORG_WAYLAND
+ if (xorgWayland) {
+ intel->xwl_screen = xwl_screen_create();
+ if (!intel->xwl_screen) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to initialize xwayland.\n");
+ return FALSE;
+ }
+
+ if (!xwl_screen_pre_init(scrn, intel->xwl_screen,
+ 0, &xwl_driver)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to pre-init xwayland screen\n");
+ xwl_screen_destroy(intel->xwl_screen);
+ }
+
+ intel->drmSubFD = xwl_screen_get_drm_fd(intel->xwl_screen);
+ }
+#endif
+
+ if (!intel->xwl_screen && !intel_open_drm_master(scrn))
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to become DRM master.\n");
+
+
if (!intel_init_bufmgr(intel)) {
PreInitCleanup(scrn);
return FALSE;
}
intel->force_fallback =
@@ -596,12 +647,15 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
intel->has_relaxed_fencing ? "enabled" : "disabled");
/* SwapBuffers delays to avoid tearing */
intel->swapbuffers_wait = xf86ReturnOptValBool(intel->Options,
OPTION_SWAPBUFFERS_WAIT,
TRUE);
+ if (!intel->xwl_screen)
+ intel->swapbuffers_wait = TRUE;
+
xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Wait on SwapBuffers? %s\n",
intel->swapbuffers_wait ? "enabled" : "disabled");
intel->use_triple_buffer =
xf86ReturnOptValBool(intel->Options,
OPTION_TRIPLE_BUFFER,
@@ -617,13 +671,14 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
intel->tiling & INTEL_TILING_3D ? "tiled" : "linear");
xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "SwapBuffers wait %sabled\n",
intel->swapbuffers_wait ? "en" : "dis");
I830XvInit(scrn);
- if (!intel_mode_pre_init(scrn, intel->drmSubFD, intel->cpp)) {
+ if (!intel->xwl_screen &&
+ !intel_mode_pre_init(scrn, intel->drmSubFD, intel->cpp)) {
PreInitCleanup(scrn);
return FALSE;
}
if (!xf86SetGamma(scrn, zeros)) {
PreInitCleanup(scrn);
@@ -754,12 +809,17 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
intel_uxa_block_handler(intel);
intel_video_block_handler(intel);
#ifdef INTEL_PIXMAP_SHARING
intel_dirty_update(screen);
#endif
+
+#ifdef XORG_WAYLAND
+ if (intel->xwl_screen)
+ xwl_screen_post_damage(intel->xwl_screen);
+#endif
}
static Bool
intel_init_initial_framebuffer(ScrnInfoPtr scrn)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
@@ -789,15 +849,22 @@ intel_init_initial_framebuffer(ScrnInfoPtr scrn)
static void
intel_flush_callback(CallbackListPtr *list,
pointer user_data, pointer call_data)
{
ScrnInfoPtr scrn = user_data;
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
if (scrn->vtSema) {
intel_batch_submit(scrn);
intel_glamor_flush(intel_get_screen_private(scrn));
+
+#ifdef XORG_WAYLAND
+ if (intel->xwl_screen)
+ xwl_screen_post_damage(intel->xwl_screen);
+#endif
}
}
#if HAVE_UDEV
static void
I830HandleUEvents(int fd, void *closure)
@@ -1064,13 +1131,14 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
"direct rendering: Not available\n");
#endif
if (serverGeneration == 1)
xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options);
- intel_mode_init(intel);
+ if (!intel->xwl_screen)
+ intel_mode_init(intel);
intel->suspended = FALSE;
#if HAVE_UDEV
I830UeventInit(scrn);
#endif
@@ -1179,13 +1247,14 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL)
if (intel->back_buffer) {
drm_intel_bo_unreference(intel->back_buffer);
intel->back_buffer = NULL;
}
if (intel->front_buffer) {
- intel_mode_remove_fb(intel);
+ if (!intel->xwl_screen)
+ intel_mode_remove_fb(intel);
drm_intel_bo_unreference(intel->front_buffer);
intel->front_buffer = NULL;
}
if (scrn->vtSema == TRUE) {
I830LeaveVT(VT_FUNC_ARGS(0));