xf86-video-intel: src/intel_device.c src/intel_driver.h src/intel_module.c src/sna/sna_display.c src/sna/sna_driver.c src/sna/sna.h src/sna/sna_video_overlay.c src/sna/sna_video_sprite.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Aug 9 03:47:57 PDT 2013
src/intel_device.c | 13 ++++++++++++-
src/intel_driver.h | 2 ++
src/intel_module.c | 9 ++++++++-
src/sna/sna.h | 1 +
src/sna/sna_display.c | 18 +++++++++++++++---
src/sna/sna_driver.c | 12 ++++++++----
src/sna/sna_video_overlay.c | 3 +++
src/sna/sna_video_sprite.c | 3 +++
8 files changed, 52 insertions(+), 9 deletions(-)
New commits:
commit b6b5c3f009585151eb772dfc2526843c7cee82b3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Aug 9 11:34:39 2013 +0100
intel: Disable incompatible features whilst hosted
Start adding the infrastructure to disable direct hardware access if X
is being run under a system compositor (aka "hosted").
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/intel_device.c b/src/intel_device.c
index c5f0a38..d9ff8bc 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -92,7 +92,7 @@ static int __intel_check_device(int fd)
if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
ret = FALSE;
}
- if (ret) {
+ if (ret && !hosted()) {
struct drm_mode_card_res res;
memset(&res, 0, sizeof(res));
@@ -199,6 +199,12 @@ int intel_open_device(int entity_num,
dev->open_count = 0;
dev->master_count = 0;
+ /* If hosted under a system compositor, just pretend to be master */
+ if (hosted()) {
+ dev->open_count++;
+ dev->master_count++;
+ }
+
xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
return fd;
@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
drmSetVersion sv;
int retry = 2000;
+ assert(!hosted());
+
/* Check that what we opened was a master or a
* master-capable FD, by setting the version of the
* interface we'll use to talk to it.
@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
if (dev->master_count++ == 0) {
int retry = 2000;
+ assert(!hosted());
do {
ret = drmSetMaster(dev->fd);
if (ret == 0)
@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
ret = 0;
assert(dev->master_count);
if (--dev->master_count == 0) {
+ assert(!hosted());
assert(drmSetMaster(dev->fd) == 0);
ret = drmDropMaster(dev->fd);
}
@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
if (--dev->open_count)
return;
+ assert(!hosted());
intel_set_device(scrn, NULL);
drmClose(dev->fd);
diff --git a/src/intel_driver.h b/src/intel_driver.h
index 1e67eab..4768536 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -129,4 +129,6 @@ void intel_put_device(ScrnInfoPtr scrn);
void __intel_uxa_release_device(ScrnInfoPtr scrn);
+#define hosted() (0)
+
#endif /* INTEL_DRIVER_H */
diff --git a/src/intel_module.c b/src/intel_module.c
index 47e494c..42fa8d8 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -382,6 +382,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
#else
(*flag) = HW_IO | HW_MMIO;
#endif
+ if (hosted())
+ (*flag) = HW_SKIP_CONSOLE;
+
return TRUE;
default:
/* Unknown or deprecated function */
@@ -410,6 +413,9 @@ static enum accel_method { UXA, SNA } get_accel_method(void)
enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
XF86ConfDevicePtr dev;
+ if (hosted())
+ return SNA;
+
dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
if (dev && dev->dev_option_lst) {
const char *s;
@@ -493,7 +499,8 @@ static Bool intel_pci_probe(DriverPtr driver,
case PCI_CHIP_I810_DC100:
case PCI_CHIP_I810_E:
case PCI_CHIP_I815:
- break;
+ if (!hosted())
+ break;
default:
return FALSE;
}
diff --git a/src/sna/sna.h b/src/sna/sna.h
index caf671f..7387088 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -229,6 +229,7 @@ struct sna {
#define SNA_TEAR_FREE 0x10
#define SNA_FORCE_SHADOW 0x20
#define SNA_FLUSH_GTT 0x40
+#define SNA_IS_HOSTED 0x80
#define SNA_REPROBE 0x80000000
unsigned cpu_features;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 5dcf47f..f86d93d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3151,11 +3151,22 @@ sna_crtc_config_notify(ScreenPtr screen)
sna_mode_update(to_sna_from_screen(screen));
}
+#if HAS_PIXMAP_SHARING
+#define sna_setup_provider(scrn) xf86ProviderSetup(scrn, NULL, "Intel")
+#else
+#define sna_setup_provider(scrn)
+#endif
+
bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
{
struct sna_mode *mode = &sna->mode;
int i;
+ if (sna->flags & SNA_IS_HOSTED) {
+ sna_setup_provider(scrn);
+ return true;
+ }
+
mode->kmode = drmModeGetResources(sna->kgem.fd);
if (mode->kmode) {
xf86CrtcConfigInit(scrn, &sna_mode_funcs);
@@ -3172,9 +3183,7 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
if (!xf86IsEntityShared(scrn->entityList[0]))
sna_mode_compute_possible_clones(scrn);
-#if HAS_PIXMAP_SHARING
- xf86ProviderSetup(scrn, NULL, "Intel");
-#endif
+ sna_setup_provider(scrn);
} else {
if (!sna_mode_fake_init(sna))
return false;
@@ -3200,6 +3209,9 @@ sna_mode_close(struct sna *sna)
while (sna_mode_has_pending_events(sna))
sna_mode_wakeup(sna);
+ if (sna->flags & SNA_IS_HOSTED)
+ return;
+
for (i = 0; i < xf86_config->num_crtc; i++)
sna_crtc_disable_shadow(sna, to_sna_crtc(xf86_config->crtc[i]));
}
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index fc8773b..7f2c0ac 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -287,7 +287,7 @@ static bool has_pageflipping(struct sna *sna)
drm_i915_getparam_t gp;
int v;
- if (sna->flags & SNA_NO_WAIT)
+ if (sna->flags & (SNA_IS_HOSTED | SNA_NO_WAIT))
return false;
v = 0;
@@ -413,6 +413,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
sna = to_sna(scrn);
sna->scrn = scrn;
sna->pEnt = pEnt;
+ sna->flags = 0;
scrn->displayWidth = 640; /* default it */
@@ -425,7 +426,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
fd = intel_get_device(scrn);
if (fd == -1) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Failed to become DRM master.\n");
+ "Failed to claim DRM device.\n");
goto cleanup;
}
@@ -484,7 +485,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
if (xf86ReturnOptValBool(sna->Options, OPTION_TILING_FB, FALSE))
sna->tiling &= ~SNA_TILING_FB;
- sna->flags = 0;
if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
sna->flags |= SNA_NO_WAIT;
if (xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
@@ -629,6 +629,9 @@ sna_uevent_init(ScrnInfoPtr scrn)
Bool hotplug;
MessageType from = X_CONFIG;
+ if (sna->flags & SNA_IS_HOSTED)
+ return;
+
DBG(("%s\n", __FUNCTION__));
/* RandR will be disabled if Xinerama is active, and so generating
@@ -895,7 +898,8 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
if (!miDCInitialize(screen, xf86GetPointerScreenFuncs()))
return FALSE;
- if (xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
+ if ((sna->flags & SNA_IS_HOSTED) == 0 &&
+ xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
HARDWARE_CURSOR_INVERT_MASK |
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index a0b4db9..a68a173 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -683,6 +683,9 @@ void sna_video_overlay_setup(struct sna *sna, ScreenPtr screen)
struct sna_video *video;
XvPortPtr port;
+ if (sna->flags & SNA_IS_HOSTED)
+ return;
+
if (!sna_has_overlay(sna))
return;
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 07e59bd..a8d50ab 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -456,6 +456,9 @@ void sna_video_sprite_setup(struct sna *sna, ScreenPtr screen)
struct sna_video *video;
XvPortPtr port;
+ if (sna->flags & SNA_IS_HOSTED)
+ return;
+
memset(&r, 0, sizeof(struct drm_mode_get_plane_res));
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPLANERESOURCES, &r))
return;
More information about the xorg-commit
mailing list