From e0acdbd6f5f7ef8d9fc5b61fbd53041f4d74da06 Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Fri, 15 Oct 2010 17:58:14 -0400 Subject: Add hosted support --- configure.ac | 5 +++++ src/intel.h | 3 +++ src/intel_dri.c | 29 +++++++++++++++++++++++++++++ src/intel_driver.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ src/intel_module.c | 3 +++ 5 files changed, 82 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index e066b3dc..d54c0d50 100644 --- a/configure.ac +++ b/configure.ac @@ -133,6 +133,11 @@ if test "$KMS_ONLY" = yes; then AC_DEFINE(KMS_ONLY,1,[Assume KMS support]) fi +# FIXME: Write some clever check here. +AC_DEFINE(XORG_HOSTED, 1, [Enable wayland integration.]) +AM_CONDITIONAL(XORG_HOSTED, true) +PKG_CHECK_MODULES(WAYLAND, [wayland-client]) + DRIVER_NAME=intel AC_SUBST([DRIVER_NAME]) AC_SUBST([moduledir]) diff --git a/src/intel.h b/src/intel.h index 6b059976..20d9969f 100644 --- a/src/intel.h +++ b/src/intel.h @@ -441,6 +441,9 @@ typedef struct intel_screen_private { */ Bool fallback_debug; unsigned debug_flush; + + struct hosted_screen *hosted_screen; + } intel_screen_private; enum { diff --git a/src/intel_dri.c b/src/intel_dri.c index 67f7be9d..9820eef2 100644 --- a/src/intel_dri.c +++ b/src/intel_dri.c @@ -57,6 +57,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "windowstr.h" #include "shadow.h" +#include #include "xaarop.h" @@ -1151,6 +1152,29 @@ out_complete: } #endif +static int intel_auth_magic(int fd, uint32_t magic) +{ + ScrnInfoPtr scrn; + intel_screen_private *intel; + int i; + + for (i = 0; i < 1; i++) { + scrn = xf86Screens[i]; + intel = intel_get_screen_private(scrn); + if (hosted_screen_get_drm_fd(intel->hosted_screen) == fd) + break; + } + + if (i == 1) { + /* Not hosted, go stragight to drm */ + return drmAuthMagic(fd, magic); + } else { + /* Forward the request to our host */ + return hosted_screen_authenticate(intel->hosted_screen, + magic); + } +} + Bool I830DRI2ScreenInit(ScreenPtr screen) { ScrnInfoPtr scrn = xf86Screens[screen->myNum]; @@ -1213,6 +1237,11 @@ Bool I830DRI2ScreenInit(ScreenPtr screen) } #endif +#if DRI2INFOREC_VERSION >= 5 + 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 b16913b4..2ca48465 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -66,6 +66,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xf86xv.h" #include #include "shadow.h" +#include #include "intel.h" #include "intel_video.h" @@ -250,6 +251,11 @@ static Bool i830CreateScreenResources(ScreenPtr screen) intel_uxa_create_screen_resources(screen); +#ifdef XORG_HOSTED + if (intel->hosted_screen) + hosted_screen_init(intel->hosted_screen, screen); +#endif + return TRUE; } @@ -466,6 +472,24 @@ static void I830XvInit(ScrnInfoPtr scrn) intel->colorKey); } +#ifdef XORG_HOSTED /* Need the XORG_HOSTED #define in xorg-server.h */ +static int intel_name_pixmap(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 Success; +} + +static struct hosted_driver hosted_driver = { + .version = 1, + .name_pixmap = intel_name_pixmap +}; +#endif + /** * This is called before ScreenInit to do any require probing of screen * configuration. @@ -513,10 +537,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; @@ -553,6 +573,15 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) intel_check_chipset_option(scrn); intel_check_dri_option(scrn); + xf86LoadSubModule(scrn, "hosted"); + intel->hosted_screen = hosted_screen_pre_init(scrn, 0, &hosted_driver); + if (intel->hosted_screen) + intel->drmSubFD = + hosted_screen_get_drm_fd(intel->hosted_screen); + else if (!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; @@ -590,7 +619,8 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) } /* SwapBuffers delays to avoid tearing */ - intel->swapbuffers_wait = TRUE; + if (!intel->hosted_screen) + intel->swapbuffers_wait = TRUE; /* Allow user override if they set a value */ if (xf86IsOptionSet(intel->Options, OPTION_SWAPBUFFERS_WAIT)) { @@ -611,7 +641,8 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) I830XvInit(scrn); - if (!intel_mode_pre_init(scrn, intel->drmSubFD, intel->cpp)) { + if (!intel->hosted_screen && + !intel_mode_pre_init(scrn, intel->drmSubFD, intel->cpp)) { PreInitCleanup(scrn); return FALSE; } @@ -801,6 +832,11 @@ intel_flush_callback(CallbackListPtr *list, intel_batch_submit(scrn, intel->need_mi_flush || !list_is_empty(&intel->flush_pixmaps)); + +#ifdef XORG_HOSTED + if (intel->hosted_screen) + hosted_screen_post_damage(intel->hosted_screen); +#endif } } diff --git a/src/intel_module.c b/src/intel_module.c index 898e6973..7ccc5a69 100644 --- a/src/intel_module.c +++ b/src/intel_module.c @@ -423,6 +423,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn, #else (*flag) = HW_IO | HW_MMIO; #endif + + /* FIXME: Conditional on hosted */ + (*flag) = HW_SKIP_CONSOLE; return TRUE; default: /* Unknown or deprecated function */ -- cgit v1.2.3