summaryrefslogtreecommitdiff
path: root/src/uxa/intel_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uxa/intel_driver.c')
-rw-r--r--src/uxa/intel_driver.c83
1 files changed, 76 insertions, 7 deletions
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 675408da..e74ba600 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -70,12 +70,17 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "intel_xvmc.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,9 +172,15 @@ 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;
+ if (!intel->xwl_screen)
intel_copy_fb(scrn);
return TRUE;
}
@@ -463,6 +474,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.
@@ -517,12 +549,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;
@@ -561,6 +587,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;
@@ -599,6 +650,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");
@@ -620,7 +674,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;
}
@@ -757,6 +812,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
@@ -792,9 +852,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
}
}
@@ -1067,6 +1134,7 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
if (serverGeneration == 1)
xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options);
+ if (!intel->xwl_screen)
intel_mode_init(intel);
intel->suspended = FALSE;
@@ -1182,6 +1250,7 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL)
}
if (intel->front_buffer) {
+ if (!intel->xwl_screen)
intel_mode_remove_fb(intel);
drm_intel_bo_unreference(intel->front_buffer);
intel->front_buffer = NULL;