diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2012-09-24 15:01:09 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-08-21 23:36:15 -0700 |
commit | d9769c193765ac303ad4d4760e57ff368df1f663 (patch) | |
tree | 52457ffab4f931f190201583c19fe4e0a9f10214 | |
parent | f57ce6ef9ca735d5cb428b2f12f1f9413a70506a (diff) |
xwayland: Add xwayland support
-rw-r--r-- | src/intel_device.c | 18 | ||||
-rw-r--r-- | src/intel_driver.h | 6 | ||||
-rw-r--r-- | src/intel_module.c | 8 | ||||
-rw-r--r-- | src/uxa/intel.h | 2 | ||||
-rw-r--r-- | src/uxa/intel_dri.c | 38 | ||||
-rw-r--r-- | src/uxa/intel_driver.c | 89 |
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)); |