summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2010-10-15 17:58:14 -0400
committerKristian Høgsberg <krh@bitplanet.net>2010-10-18 10:11:11 -0400
commite0acdbd6f5f7ef8d9fc5b61fbd53041f4d74da06 (patch)
tree29fb6fc8dec90f44cf507c0f1d4636e764e8d957
parent8507ef50ba08061ac158848a7c4c136e1755d87e (diff)
Add hosted supporthosted-2
-rw-r--r--configure.ac5
-rw-r--r--src/intel.h3
-rw-r--r--src/intel_dri.c29
-rw-r--r--src/intel_driver.c48
-rw-r--r--src/intel_module.c3
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 <hosted.h>
#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 <X11/extensions/Xv.h>
#include "shadow.h"
+#include <hosted.h>
#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 */