debian/changelog | 5 debian/control | 3 debian/patches/series | 1 debian/patches/xmir.patch | 595 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 602 insertions(+), 2 deletions(-)
New commits: commit 293f821ee866f13097ed68e0314d16d11d1e0388 Author: Christopher James Halse Rogers <r...@ubuntu.com> Date: Thu Aug 1 16:08:32 2013 +1000 Add initial XMir patch diff --git a/debian/changelog b/debian/changelog index b25ec80..6093547 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,7 +9,10 @@ xserver-xorg-video-intel (2:2.21.12-1ubuntu1) UNRELEASED; urgency=low * Cherry-pick 3 commits from upstream git to fix SNA regressions in 2.21.12 (34c9b759f, 7f76a2bf3, a764a6e69b) - -- Maarten Lankhorst <maarten.lankho...@ubuntu.com> Thu, 18 Jul 2013 13:51:58 +0200 + [ Christopher James Halse Rogers ] + * Add initial XMir support patch + + -- Christopher James Halse Rogers <r...@ubuntu.com> Thu, 01 Aug 2013 16:06:42 +1000 xserver-xorg-video-intel (2:2.21.12-1) UNRELEASED; urgency=low diff --git a/debian/control b/debian/control index 716a434..b686176 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,8 @@ Build-Depends: debhelper (>= 8), dh-autoreconf, pkg-config, - xserver-xorg-dev (>= 2:1.11.99.901), +# Depend on latest server to ensure XMir support + xserver-xorg-dev (>= 2:1.14.2-0ubuntu4~), x11proto-core-dev, x11proto-fonts-dev, x11proto-xinerama-dev, diff --git a/debian/patches/series b/debian/patches/series index 2c1177d..c72571f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -2,3 +2,4 @@ sna-note-that-borderClip-region.patch sna-fix-typo-in-computing-box.patch sna-fall-back-to-proc-cpuinfo.patch +xmir.patch diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch new file mode 100644 index 0000000..0ca2bc2 --- /dev/null +++ b/debian/patches/xmir.patch @@ -0,0 +1,595 @@ +commit ea3344d571ff728f5cb84c6920635e552090ec7c +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Jul 24 01:44:30 2013 +0100 + + sna: Preliminary patch for XMir + + For the intrepid explorer, who is desperate to encounter all the bugs we + fixed long ago. /o\ + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +Index: xf86-video-intel/src/Makefile.am +=================================================================== +--- xf86-video-intel.orig/src/Makefile.am 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/Makefile.am 2013-08-01 16:06:54.212945668 +1000 +@@ -46,6 +46,7 @@ + intel_device.c \ + intel_options.c \ + intel_module.c \ ++ intel_xmir.h \ + compat-api.h \ + $(NULL) + +Index: xf86-video-intel/src/intel_device.c +=================================================================== +--- xf86-video-intel.orig/src/intel_device.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/intel_device.c 2013-08-01 16:06:54.212945668 +1000 +@@ -92,7 +92,7 @@ + if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp)) + ret = FALSE; + } +- if (ret) { ++ if (ret && !xorgMir) { + struct drm_mode_card_res res; + + memset(&res, 0, sizeof(res)); +@@ -121,10 +121,34 @@ + return fd; + } + ++static int __intel_open_xmir(const struct pci_device *pci, ++ char **path) ++{ ++ char id[20]; ++ int fd; ++ ++ snprintf(id, sizeof(id), ++ "pci:%04x:%02x:%02x.%d", ++ pci->domain, pci->bus, pci->dev, pci->func); ++ fd = xmir_get_drm_fd(id); ++ if (fd == -1) ++ return -1; ++ ++ if (*path == NULL) /* XXX Fix Xmir - it knows both the fd and path */ ++ *path = drmGetDeviceNameFromFd(fd); ++ if (*path == NULL) ++ fd = -1; ++ ++ return fd; ++} ++ + static int __intel_open_device(const struct pci_device *pci, char **path) + { + int fd; + ++ if (xorgMir) ++ return __intel_open_xmir(pci, path); ++ + if (*path == NULL) { + char id[20]; + int ret; +@@ -199,6 +223,12 @@ + dev->open_count = 0; + dev->master_count = 0; + ++ /* If hosted under a system compositor, just pretend to be master */ ++ if (xorgMir) { ++ dev->open_count++; ++ dev->master_count++; ++ } ++ + xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev; + + return fd; +@@ -222,6 +252,8 @@ + drmSetVersion sv; + int retry = 2000; + ++ assert(!xorgMir); ++ + /* 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 +299,7 @@ + if (dev->master_count++ == 0) { + int retry = 2000; + ++ assert(!xorgMir); + do { + ret = drmSetMaster(dev->fd); + if (ret == 0) +@@ -288,6 +321,7 @@ + ret = 0; + assert(dev->master_count); + if (--dev->master_count == 0) { ++ assert(!xorgMir); + assert(drmSetMaster(dev->fd) == 0); + ret = drmDropMaster(dev->fd); + } +@@ -317,6 +351,7 @@ + if (--dev->open_count) + return; + ++ assert(!xorgMir); + intel_set_device(scrn, NULL); + + drmClose(dev->fd); +Index: xf86-video-intel/src/intel_driver.h +=================================================================== +--- xf86-video-intel.orig/src/intel_driver.h 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/intel_driver.h 2013-08-01 16:06:54.212945668 +1000 +@@ -1,6 +1,8 @@ + #ifndef INTEL_DRIVER_H + #define INTEL_DRIVER_H + ++#include "intel_xmir.h" ++ + #define INTEL_VERSION 4000 + #define INTEL_NAME "intel" + #define INTEL_DRIVER_NAME "intel" +Index: xf86-video-intel/src/intel_module.c +=================================================================== +--- xf86-video-intel.orig/src/intel_module.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/intel_module.c 2013-08-01 16:06:54.212945668 +1000 +@@ -422,6 +422,9 @@ + #else + (*flag) = HW_IO | HW_MMIO; + #endif ++ if (xorgMir) ++ (*flag) = HW_SKIP_CONSOLE; ++ + return TRUE; + default: + /* Unknown or deprecated function */ +@@ -533,7 +536,8 @@ + case PCI_CHIP_I810_DC100: + case PCI_CHIP_I810_E: + case PCI_CHIP_I815: +- break; ++ if (!xorgMir) ++ break; + default: + return FALSE; + } +Index: xf86-video-intel/src/intel_xmir.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ xf86-video-intel/src/intel_xmir.h 2013-08-01 16:06:54.212945668 +1000 +@@ -0,0 +1,15 @@ ++#ifndef INTEL_XMIR_H ++#define INTEL_XMIR_H ++ ++#include <xorg-server.h> ++ ++#if XMIR ++#include <xf86Priv.h> ++#include <xmir.h> ++#else ++typedef struct xmir_screen xmir_screen; ++#define xorgMir 0 ++#define xmir_get_drm_fd(id) -1 ++#endif ++ ++#endif /* INTEL_XMIR_H */ +Index: xf86-video-intel/src/sna/Makefile.am +=================================================================== +--- xf86-video-intel.orig/src/sna/Makefile.am 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/Makefile.am 2013-08-01 16:06:54.212945668 +1000 +@@ -73,6 +73,7 @@ + sna_video_overlay.c \ + sna_video_sprite.c \ + sna_video_textured.c \ ++ sna_xmir.c \ + gen2_render.c \ + gen2_render.h \ + gen3_render.c \ +Index: xf86-video-intel/src/sna/sna.h +=================================================================== +--- xf86-video-intel.orig/src/sna/sna.h 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna.h 2013-08-01 16:06:54.212945668 +1000 +@@ -218,6 +218,7 @@ + #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; +@@ -271,6 +272,7 @@ + EntityInfoPtr pEnt; + struct pci_device *PciInfo; + const struct intel_device_info *info; ++ xmir_screen *xmir; + + ScreenBlockHandlerProcPtr BlockHandler; + ScreenWakeupHandlerProcPtr WakeupHandler; +@@ -912,4 +914,18 @@ + uint16_t width, + uint16_t height); + ++/* sna_xmir.c */ ++ ++#if XMIR ++bool sna_xmir_create(struct sna *sna); ++bool sna_xmir_pre_init(struct sna *sna); ++void sna_xmir_init(struct sna *sna, ScreenPtr screen); ++void sna_xmir_post_damage(struct sna *sna); ++#else ++inline static bool sna_xmir_create(struct sna *sna) { return true; } ++inline static bool sna_xmir_pre_init(struct sna *sna) { return true; } ++inline static void sna_xmir_init(struct sna *sna, ScreenPtr screen) { } ++inline static void sna_xmir_post_damage(struct sna *sna) { } ++#endif ++ + #endif /* _SNA_H */ +Index: xf86-video-intel/src/sna/sna_display.c +=================================================================== +--- xf86-video-intel.orig/src/sna/sna_display.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna_display.c 2013-08-01 16:06:54.212945668 +1000 +@@ -3128,11 +3128,22 @@ + 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); +@@ -3149,9 +3160,7 @@ + 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; +Index: xf86-video-intel/src/sna/sna_dri.c +=================================================================== +--- xf86-video-intel.orig/src/sna/sna_dri.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna_dri.c 2013-08-01 16:06:54.216945668 +1000 +@@ -2399,6 +2399,13 @@ + } + #endif + ++#if DRI2INFOREC_VERSION >= 8 && XMIR ++static int sna_dri_auth_magic2(ScreenPtr screen, uint32_t magic) ++{ ++ return xmir_auth_drm_magic(to_sna_from_screen(screen)->xmir, magic); ++} ++#endif ++ + static bool has_i830_dri(void) + { + return access(DRI_DRIVER_PATH "/i830_dri.so", R_OK) == 0; +@@ -2474,6 +2481,13 @@ + info.ReuseBufferNotify = NULL; + #endif + ++#if DRI2INFOREC_VERSION >= 8 && XMIR ++ if (sna->xmir) { ++ info.version = 8; ++ info.AuthMagic2 = sna_dri_auth_magic2; ++ } ++#endif ++ + #if USE_ASYNC_SWAP + info.version = 10; + info.AsyncSwap = sna_dri_async_swap; +Index: xf86-video-intel/src/sna/sna_driver.c +=================================================================== +--- xf86-video-intel.orig/src/sna/sna_driver.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna_driver.c 2013-08-01 16:06:54.216945668 +1000 +@@ -295,7 +295,7 @@ + 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; +@@ -421,6 +421,7 @@ + sna = to_sna(scrn); + sna->scrn = scrn; + sna->pEnt = pEnt; ++ sna->flags = 0; + + scrn->displayWidth = 640; /* default it */ + +@@ -433,13 +434,21 @@ + 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"); + return FALSE; + } + +- preferred_depth = sna->info->gen < 030 ? 15 : 24; +- if (!fb_supports_depth(fd, preferred_depth)) ++ if (!sna_xmir_create(sna)) ++ return FALSE; ++ ++ if (sna->xmir) { ++ /* XXX query depth from xmir */ + preferred_depth = 24; ++ } else { ++ preferred_depth = sna->info->gen < 030 ? 15 : 24; ++ if (!fb_supports_depth(fd, preferred_depth)) ++ preferred_depth = 24; ++ } + + if (!xf86SetDepthBpp(scrn, preferred_depth, 0, 0, + Support32bppFb | +@@ -475,6 +484,9 @@ + + intel_detect_chipset(scrn, sna->pEnt, sna->PciInfo); + ++ if (!sna_xmir_pre_init(sna)) ++ return FALSE; ++ + kgem_init(&sna->kgem, fd, sna->PciInfo, sna->info->gen); + if (xf86ReturnOptValBool(sna->Options, OPTION_ACCEL_DISABLE, FALSE) || + !sna_option_cast_to_bool(sna, OPTION_ACCEL_METHOD, TRUE)) { +@@ -492,7 +504,6 @@ + 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)) +@@ -555,6 +566,8 @@ + + if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec)) + sna_accel_block_handler(sna, tv); ++ ++ sna_xmir_post_damage(sna); + } + + static void +@@ -633,6 +646,9 @@ + 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 +@@ -885,6 +901,8 @@ + return FALSE; + } + ++ sna_xmir_init(sna, screen); ++ + xf86SetBlackWhitePixels(screen); + + xf86SetBackingStore(screen); +@@ -892,7 +910,8 @@ + 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 | +Index: xf86-video-intel/src/sna/sna_video_overlay.c +=================================================================== +--- xf86-video-intel.orig/src/sna/sna_video_overlay.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna_video_overlay.c 2013-08-01 16:06:54.216945668 +1000 +@@ -683,6 +683,9 @@ + struct sna_video *video; + XvPortPtr port; + ++ if (sna->flags & SNA_IS_HOSTED) ++ return; ++ + if (!sna_has_overlay(sna)) + return; + +Index: xf86-video-intel/src/sna/sna_video_sprite.c +=================================================================== +--- xf86-video-intel.orig/src/sna/sna_video_sprite.c 2013-08-01 16:06:54.220945668 +1000 ++++ xf86-video-intel/src/sna/sna_video_sprite.c 2013-08-01 16:06:54.216945668 +1000 +@@ -456,6 +456,9 @@ + 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; +Index: xf86-video-intel/src/sna/sna_xmir.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ xf86-video-intel/src/sna/sna_xmir.c 2013-08-01 16:07:47.936945593 +1000 +@@ -0,0 +1,165 @@ ++/*************************************************************************** ++ ++ Copyright 2013 Intel Corporation. All Rights Reserved. ++ ++ Permission is hereby granted, free of charge, to any person obtaining a ++ copy of this software and associated documentation files (the ++ "Software"), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sub license, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice (including the ++ next paragraph) shall be included in all copies or substantial portions ++ of the Software. ++ ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ++ IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, ++ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ++ THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++ **************************************************************************/ ++ ++#include <assert.h> ++ ++#include "sna.h" ++ ++#if XMIR ++ ++/* Theory of Operation ++ * ------------------- ++ * ++ * 1. Clients render to their pixmaps and Windows aggregating damage. ++ * 2. Before blocking, we walk the list of dirty Windows and submit ++ * any damage to Mir. This consumes the xfer buffer. ++ * 3. Clients continue to render and we accumulate damage. However, ++ * as there is now no xfer buffer free, damage accumulates. ++ * 4. Mir reports that its exchange has complete and gives us a new ++ * transport buffer. ++ * 5. Before going to sleep, we iterate over dirty Windows and copy ++ * their damage into the xfer buffer and send back to Mir. ++ * ++ * Clients render uninterrupted, but we only send damage to Mir once ++ * every frame. ++ */ ++ ++#define FORCE_FULL_REDRAW 0 ++ ++static bool ++sna_xmir_copy_to_mir(WindowPtr win, RegionPtr region) ++{ ++ PixmapPtr src = get_window_pixmap(win); ++ struct sna *sna = to_sna_from_pixmap(src); ++ struct sna_pixmap *priv; ++ struct kgem_bo *bo; ++ BoxRec box, *boxes; ++ int nbox; ++ bool ret; ++ ++ priv = sna_pixmap_force_to_gpu(src, MOVE_READ); ++ if (priv == NULL) ++ return false; ++ ++ /* XXX size and pitch are bogus */ ++ ++ bo = kgem_create_for_prime(&sna->kgem, ++ xmir_prime_fd_for_window(win), ++ priv->gpu_bo->pitch * src->drawable.height); ++ if (bo == NULL) ++ return false; ++ ++ bo->pitch = priv->gpu_bo->pitch; ++ ++ if (FORCE_FULL_REDRAW || region == NULL) { ++ box.x1 = box.y1 = 0; ++ box.x2 = src->drawable.width; ++ box.y2 = src->drawable.height; ++ boxes = &box; ++ nbox = 1; ++ } else { ++ boxes = REGION_RECTS(region); ++ nbox = REGION_NUM_RECTS(region); ++ } ++ ++ ret = sna->render.copy_boxes(sna, GXcopy, ++ src, priv->gpu_bo, 0, 0, ++ src, bo, 0, 0, ++ boxes, nbox, COPY_LAST); ++ ++ kgem_bo_destroy(&sna->kgem, bo); ++ if (!ret) ++ return false; ++ ++ kgem_submit(&sna->kgem); ++ xmir_submit_rendering_for_window(win, region); ++ return true; ++} ++ ++static void ++sna_xmir_buffer_available(WindowPtr win) ++{ ++#if 0 ++ if (!xmir_window_is_dirty(win)) ++ return; ++ ++ sna_xmir_copy_to_mir(win, NULL); ++#endif ++} ++ ++static void ++sna_xmir_submit_dirty_window(WindowPtr win) ++{ ++ if (!xmir_window_has_free_buffer(win)) ++ return; ++ ++ sna_xmir_copy_to_mir(win, xmir_window_get_dirty(win)); ++} ++ ++static const xmir_driver sna_xmir_driver = { ++ XMIR_DRIVER_VERSION, ++ sna_xmir_buffer_available ++}; ++ ++bool sna_xmir_create(struct sna *sna) ++{ ++ if (!xorgMir) ++ return true; ++ ++ sna->xmir = xmir_screen_create(sna->scrn); ++ if (sna->xmir == NULL) ++ return false; ++ ++ sna->flags |= SNA_IS_HOSTED; ++ return true; ++} ++ ++bool sna_xmir_pre_init(struct sna *sna) ++{ ++ if (sna->xmir == NULL) ++ return true; ++ ++ return xmir_screen_pre_init(sna->scrn, sna->xmir, &sna_xmir_driver); ++} ++ ++void sna_xmir_init(struct sna *sna, ScreenPtr screen) ++{ ++ if (sna->xmir == NULL) ++ return; ++ ++ xmir_screen_init(screen, sna->xmir); ++} ++ ++void sna_xmir_post_damage(struct sna *sna) ++{ ++ if (sna->xmir == NULL) ++ return; ++ ++ xmir_screen_for_each_damaged_window(sna->xmir, ++ sna_xmir_submit_dirty_window); ++} ++ ++#endif -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1v5cb7-0001zv...@vasks.debian.org