xf86-video-intel: Branch 'xwayland-1.12' - 3 commits - src/intel_dri.c src/intel_driver.c src/intel.h src/intel_module.c

Kristian Høgsberg krh at kemper.freedesktop.org
Wed Aug 21 23:08:40 PDT 2013


Rebased ref, commits from common ancestor:
commit 1f2427f562f93efdd6447217f41ec378279d189c
Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Fri Feb 22 13:42:41 2013 -0500

    xwayland: Set ScheduleSwap to NULL so DRI2 doesn't call it
    
    We don't support this yet.

diff --git a/src/intel_dri.c b/src/intel_dri.c
index f1a686c..0fe88c5 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1614,6 +1614,7 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 	info.version = 4;
 	info.AuthMagic3 = intel_auth_magic3;
 	info.GetMSC = NULL;
+	info.ScheduleSwap = NULL;
 	info.ScheduleWaitMSC = NULL;
 #endif
 
commit bb4e7c69349ae1ea6aca36977e0d01bea2966564
Author: Tiago Vignatti <tiago.vignatti at intel.com>
Date:   Fri Feb 8 14:57:02 2013 +0200

    xwayland: Use new DRI2 AuthMagic3
    
    Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 038940e..f1a686c 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1512,7 +1512,8 @@ out_complete:
 }
 
 #ifdef XORG_WAYLAND
-static int intel_auth_magic2(ScreenPtr screen, uint32_t magic)
+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);
@@ -1522,7 +1523,7 @@ static int intel_auth_magic2(ScreenPtr screen, uint32_t magic)
 		return drmAuthMagic(intel->drmSubFD, magic);
 
         /* Forward the request to our host */
-        return xwl_drm_authenticate(intel->xwl_screen, magic);
+        return xwl_drm_authenticate(client, intel->xwl_screen, magic);
 }
 #endif
 
@@ -1611,7 +1612,7 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 
 #if defined(XORG_WAYLAND) /* If we have XORG_WAYLAND, we have AuthMagic2 */
 	info.version = 4;
-	info.AuthMagic2 = intel_auth_magic2;
+	info.AuthMagic3 = intel_auth_magic3;
 	info.GetMSC = NULL;
 	info.ScheduleWaitMSC = NULL;
 #endif
commit 860e27c1c385993ae4df3e0a95967af1b388fd16
Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Mon Sep 24 15:01:09 2012 -0400

    xwayland: Add xwayland support

diff --git a/src/intel.h b/src/intel.h
index a5603fe..b1d8b0d 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -350,6 +350,8 @@ typedef struct intel_screen_private {
 	InputHandlerProc uevent_handler;
 #endif
 	Bool has_prime_vmap_flush;
+
+	struct xwl_screen *xwl_screen;
 } intel_screen_private;
 
 #ifndef I915_PARAM_HAS_PRIME_VMAP_FLUSH
diff --git a/src/intel_dri.c b/src/intel_dri.c
index 8cab73f..038940e 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"
 
@@ -1506,6 +1511,21 @@ out_complete:
 	return TRUE;
 }
 
+#ifdef XORG_WAYLAND
+static int intel_auth_magic2(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(intel->xwl_screen, magic);
+}
+#endif
+
 static int dri2_server_generation;
 #endif
 
@@ -1589,6 +1609,13 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 	driverNames[0] = info.driverName;
 #endif
 
+#if defined(XORG_WAYLAND) /* If we have XORG_WAYLAND, we have AuthMagic2 */
+	info.version = 4;
+	info.AuthMagic2 = intel_auth_magic2;
+	info.GetMSC = NULL;
+	info.ScheduleWaitMSC = NULL;
+#endif
+
 	return DRI2ScreenInit(screen, &info);
 }
 
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 41f0311..d1da72d 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -70,12 +70,17 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "intel_hwmc.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"
@@ -167,10 +172,16 @@ 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
+
 	if (!intel_uxa_create_screen_resources(screen))
 		return FALSE;
 
-	intel_copy_fb(scrn);
+	if (!intel->xwl_screen)
+		intel_copy_fb(scrn);
 	return TRUE;
 }
 
@@ -451,6 +462,27 @@ static void intel_setup_capabilities(ScrnInfoPtr scrn)
 #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.
@@ -505,12 +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");
-		return FALSE;
-	}
-
 	scrn->monitor = scrn->confScreen->monitor;
 	scrn->progClock = TRUE;
 	scrn->rgbBits = 8;
@@ -549,6 +575,31 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 	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;
@@ -590,6 +641,9 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
 	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");
 
@@ -611,7 +665,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;
 	}
@@ -738,6 +793,11 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
 #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
@@ -773,9 +833,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
 	}
 }
 
@@ -1049,7 +1116,8 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
 	if (serverGeneration == 1)
 		xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options);
 
-	intel_mode_init(intel);
+	if (!intel->xwl_screen)
+		intel_mode_init(intel);
 
 	intel->suspended = FALSE;
 
@@ -1162,7 +1230,8 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL)
 	}
 
 	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;
 	}
diff --git a/src/intel_module.c b/src/intel_module.c
index e6ca964..7b35cc4 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -33,6 +33,7 @@
 #include <xf86Parser.h>
 #include <xf86drm.h>
 #include <xf86drmMode.h>
+#include <xf86Priv.h>
 #include <i915_drm.h>
 
 #include <xorgVersion.h>
@@ -376,6 +377,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 */
@@ -481,7 +487,11 @@ static Bool intel_pci_probe(DriverPtr		driver,
 	PciChipsets intel_pci_chipsets[NUM_CHIPSETS];
 	unsigned i;
 
-	if (!has_kernel_mode_setting(device)) {
+	if (!has_kernel_mode_setting(device)
+#ifdef XORG_WAYLAND
+	    && !xorgWayland
+#endif
+	    ) {
 #if KMS_ONLY
 		return FALSE;
 #else


More information about the xorg-commit mailing list