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>2012-03-27 10:11:44 -0400
commit3e52e42389918a39edaf0011e257809539ac6de9 (patch)
treea4b1d36e2ce355d3838ac07708d3076fd388542d
parent2e7b5f7eafbf452c781e50eba7dc8323260af59e (diff)
Add xwayland supportxwayland-1.12
-rw-r--r--configure.ac1
-rw-r--r--src/intel.h4
-rw-r--r--src/intel_dri.c33
-rw-r--r--src/intel_driver.c71
-rw-r--r--src/intel_module.c6
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 */