diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2010-10-15 17:58:14 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-03-27 10:11:44 -0400 |
commit | 3e52e42389918a39edaf0011e257809539ac6de9 (patch) | |
tree | a4b1d36e2ce355d3838ac07708d3076fd388542d | |
parent | 2e7b5f7eafbf452c781e50eba7dc8323260af59e (diff) |
Add xwayland supportxwayland-1.12
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | src/intel.h | 4 | ||||
-rw-r--r-- | src/intel_dri.c | 33 | ||||
-rw-r--r-- | src/intel_driver.c | 71 | ||||
-rw-r--r-- | src/intel_module.c | 6 |
5 files changed, 108 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac index b5919bf6..c8a75314 100644 --- a/configure.ac +++ b/configure.ac @@ -167,7 +167,6 @@ if test "x$VMAP" = xyes; then AC_DEFINE(USE_VMAP,1,[Assume VMAP support]) fi - AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [Enables internal debugging [default=no]]), diff --git a/src/intel.h b/src/intel.h index f806aea8..34ca6509 100644 --- a/src/intel.h +++ b/src/intel.h @@ -349,10 +349,14 @@ typedef struct intel_screen_private { */ Bool fallback_debug; unsigned debug_flush; + #if HAVE_UDEV struct udev_monitor *uevent_monitor; InputHandlerProc uevent_handler; #endif + + struct xwl_screen *xwl_screen; + } intel_screen_private; enum { diff --git a/src/intel_dri.c b/src/intel_dri.c index f6f0c863..c4e029d2 100644 --- a/src/intel_dri.c +++ b/src/intel_dri.c @@ -50,6 +50,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xf86.h" #include "xf86_OSproc.h" +#include "xf86Priv.h" #include "xf86Pci.h" #include "xf86drm.h" @@ -58,6 +59,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "shadow.h" #include "fb.h" +#ifdef XORG_WAYLAND +#include <xwayland.h> +#endif + #include "intel.h" #include "i830_reg.h" @@ -1610,6 +1615,29 @@ out_complete: return TRUE; } +#ifdef XORG_WAYLAND +static int intel_auth_magic(int fd, uint32_t magic) +{ + ScrnInfoPtr scrn; + intel_screen_private *intel; + int i; + + /* Not wayland, go stragight to drm */ + if (!xorgWayland) + return drmAuthMagic(fd, magic); + + for (i = 0; i < 1; i++) { + scrn = xf86Screens[i]; + intel = intel_get_screen_private(scrn); + if (xwl_screen_get_drm_fd(intel->xwl_screen) == fd) + break; + } + + /* Forward the request to our host */ + return xwl_drm_authenticate(intel->xwl_screen, magic); +} +#endif + static int dri2_server_generation; #endif @@ -1695,6 +1723,11 @@ Bool I830DRI2ScreenInit(ScreenPtr screen) } #endif +#if DRI2INFOREC_VERSION >= 5 && defined(XORG_WAYLAND) + info.version = 5; + info.AuthMagic = intel_auth_magic; +#endif + return DRI2ScreenInit(screen, &info); } diff --git a/src/intel_driver.c b/src/intel_driver.c index 4265de82..9124fdfc 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -49,6 +49,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xf86_OSproc.h" #include "xf86cmap.h" #include "xf86drm.h" +#include "xf86Priv.h" #include "compiler.h" #include "mibstore.h" #include "mipointer.h" @@ -65,6 +66,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "intel.h" #include "intel_video.h" +#ifdef XORG_WAYLAND +#include <xwayland.h> +#endif + #ifdef INTEL_XVMC #define _INTEL_XVMC_SERVER_ #include "intel_hwmc.h" @@ -224,6 +229,11 @@ static Bool i830CreateScreenResources(ScreenPtr screen) if (!(*screen->CreateScreenResources) (screen)) return FALSE; +#ifdef XORG_WAYLAND + if (intel->xwl_screen) + xwl_screen_init(intel->xwl_screen, screen); +#endif + return intel_uxa_create_screen_resources(screen); } @@ -514,6 +524,27 @@ static Bool can_accelerate_blt(struct intel_screen_private *intel) return TRUE; } +#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. @@ -561,10 +592,6 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) intel->PciInfo = xf86GetPciInfoForEntity(intel->pEnt->index); - if (!intel_open_drm_master(scrn)) - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Failed to become DRM master.\n"); - scrn->monitor = scrn->confScreen->monitor; scrn->progClock = TRUE; scrn->rgbBits = 8; @@ -602,6 +629,26 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) intel_check_chipset_option(scrn); intel_check_dri_option(scrn); +#ifdef XORG_WAYLAND + if (xorgWayland) { + xf86LoadSubModule(scrn, "xwayland"); + intel->xwl_screen = + xwl_screen_pre_init(scrn, 0, &xwl_driver); + if (!intel->xwl_screen) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Failed to initialize xwayland.\n"); + return FALSE; + } + + 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; @@ -662,6 +709,9 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Triple buffering? %s\n", intel->use_triple_buffer ? "enabled" : "disabled"); + if (!intel->xwl_screen) + intel->swapbuffers_wait = TRUE; + xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Framebuffer %s\n", intel->tiling & INTEL_TILING_FB ? "tiled" : "linear"); xf86DrvMsg(scrn->scrnIndex, X_CONFIG, "Pixmaps %s\n", @@ -673,7 +723,8 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) 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; } @@ -807,9 +858,16 @@ 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 } } @@ -1194,7 +1252,8 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen) if (!intel->use_shadow) intel_set_pixmap_bo(screen->GetScreenPixmap(screen), NULL); - 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; } diff --git a/src/intel_module.c b/src/intel_module.c index 2c0e5cc6..66343f25 100644 --- a/src/intel_module.c +++ b/src/intel_module.c @@ -32,6 +32,7 @@ #include <xf86_OSproc.h> #include <xf86cmap.h> #include <xf86drmMode.h> +#include "xf86Priv.h" #include <xorgVersion.h> @@ -263,6 +264,11 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn, #else (*flag) = HW_IO | HW_MMIO; #endif + +#ifdef XORG_WAYLAND + if (xorgWayland) + (*flag) = HW_SKIP_CONSOLE; +#endif return TRUE; default: /* Unknown or deprecated function */ |