debian/changelog | 6 debian/control | 2 debian/patches/series | 1 debian/patches/xmir.patch | 406 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 414 insertions(+), 1 deletion(-)
New commits: commit c47e57c97b4f3a51b82718ce1cd5efeba787606b Author: Christopher James Halse Rogers <r...@ubuntu.com> Date: Fri Aug 2 20:41:29 2013 +1000 Add XMir support diff --git a/debian/changelog b/debian/changelog index 709b3f6..7e5adb6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xserver-xorg-video-nouveau (1:1.0.8-0ubuntu2) saucy; urgency=low + + * Add XMir support + + -- Christopher James Halse Rogers <r...@ubuntu.com> Thu, 01 Aug 2013 20:58:29 +1000 + xserver-xorg-video-nouveau (1:1.0.8-0ubuntu1) saucy; urgency=low * Sync to unreleased debian experimental git. diff --git a/debian/control b/debian/control index 8e919c1..70ce991 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Build-Depends: debhelper (>= 8), dh-autoreconf, pkg-config, - xserver-xorg-dev (>= 2:1.9.4), + xserver-xorg-dev (>= 2:1.14.2-0ubuntu4~), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, diff --git a/debian/patches/series b/debian/patches/series index e8e209c..8dfdb49 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,3 +3,4 @@ # Ubuntu patches 100-vblank-on.diff +xmir.patch diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch new file mode 100644 index 0000000..94ce066 --- /dev/null +++ b/debian/patches/xmir.patch @@ -0,0 +1,406 @@ +commit 4515628ff78e07aea0d661ff3fd999c29cc55259 +Author: Christopher James Halse Rogers <r...@ubuntu.com> +Date: Mon Jul 22 17:46:58 2013 +1000 + + Support running nested in a Mir compositor + + Signed-off-by: Christopher James Halse Rogers <r...@ubuntu.com> + +Index: xf86-video-nouveau/src/nouveau_dri2.c +=================================================================== +--- xf86-video-nouveau.orig/src/nouveau_dri2.c 2013-08-01 20:57:06.744921258 +1000 ++++ xf86-video-nouveau/src/nouveau_dri2.c 2013-08-01 20:57:06.740921258 +1000 +@@ -267,7 +267,7 @@ + NVPtr pNv = NVPTR(scrn); + int i; + +- if (!xf86_config->num_crtc) ++ if (xorgMir || !xf86_config->num_crtc) + return FALSE; + + for (i = 0; i < xf86_config->num_crtc; i++) { +@@ -290,7 +290,7 @@ + ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen); + NVPtr pNv = NVPTR(scrn); + +- return pNv->glx_vblank && ++ return pNv->glx_vblank && !xorgMir && + nv_window_belongs_to_crtc(scrn, draw->x, draw->y, + draw->width, draw->height); + } +@@ -766,6 +766,19 @@ + free(flip); + } + ++#if DRI2INFOREC_VERSION >= 8 && defined(XMIR) ++static int nouveau_dri2_auth_magic(ScreenPtr pScreen, uint32_t magic) ++{ ++ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ++ NVPtr pNv = NVPTR(pScrn); ++ ++ if (xorgMir) ++ return xmir_auth_drm_magic(pNv->xmir, magic); ++ else ++ return drmAuthMagic(pNv->dev->fd, magic); ++} ++#endif ++ + Bool + nouveau_dri2_init(ScreenPtr pScreen) + { +@@ -804,6 +817,11 @@ + dri2.GetParam = NULL; + #endif + ++#if DRI2INFOREC_VERSION >= 8 && defined(XMIR) ++ dri2.version = 8; ++ dri2.AuthMagic2 = nouveau_dri2_auth_magic; ++#endif ++ + #if DRI2INFOREC_VERSION >= 9 + dri2.version = 9; + dri2.CreateBuffer2 = nouveau_dri2_create_buffer2; +Index: xf86-video-nouveau/src/nv_driver.c +=================================================================== +--- xf86-video-nouveau.orig/src/nv_driver.c 2013-08-01 20:57:06.744921258 +1000 ++++ xf86-video-nouveau/src/nv_driver.c 2013-08-01 20:57:40.208921211 +1000 +@@ -226,6 +226,8 @@ + case GET_REQUIRED_HW_INTERFACES: + flag = (CARD32 *)data; + (*flag) = 0; ++ if (xorgMir) ++ *flag |= HW_SKIP_CONSOLE; + return TRUE; + default: + return FALSE; +@@ -333,6 +335,23 @@ + } + + static Bool ++NVHasMirSupport(struct pci_device *pci_dev) ++{ ++ char *busid; ++ ++ busid = XNFprintf("pci:%04x:%02x:%02x.%d", ++ pci_dev->domain, pci_dev->bus, pci_dev->dev, pci_dev->func); ++ ++ if (xmir_get_drm_fd(busid) < 0) { ++ xf86DrvMsg(-1, X_ERROR, "[XMir] GPU %s not handled by Mir\n", busid); ++ free(busid); ++ return FALSE; ++ } ++ free(busid); ++ return TRUE; ++} ++ ++static Bool + NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev, + intptr_t match_data) + { +@@ -343,6 +362,9 @@ + }; + ScrnInfoPtr pScrn = NULL; + ++ if (xorgMir && !NVHasMirSupport(pci_dev)) ++ return FALSE; ++ + if (!NVHasKMS(pci_dev)) + return FALSE; + +@@ -367,6 +389,9 @@ + if (!dev->pdev) + return FALSE; + ++ if (xorgMir && !NVHasMirSupport(dev->pdev)) ++ return FALSE; ++ + if (!NVHasKMS(dev->pdev)) + return FALSE; + +@@ -424,9 +449,11 @@ + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is called.\n"); + +- ret = drmSetMaster(pNv->dev->fd); +- if (ret) +- ErrorF("Unable to get master: %s\n", strerror(errno)); ++ if (!xorgMir) { ++ ret = drmSetMaster(pNv->dev->fd); ++ if (ret) ++ ErrorF("Unable to get master: %s\n", strerror(errno)); ++ } + + if (XF86_CRTC_CONFIG_PTR(pScrn)->num_crtc && !xf86SetDesiredModes(pScrn)) + return FALSE; +@@ -452,6 +479,9 @@ + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVLeaveVT is called.\n"); + ++ if (xorgMir) ++ return; ++ + ret = drmDropMaster(pNv->dev->fd); + if (ret && errno != EIO && errno != ENODEV) + ErrorF("Error dropping master: %i(%m)\n", -errno); +@@ -501,6 +531,86 @@ + } + #endif + ++#ifdef XMIR ++static void ++nouveau_xmir_copy_pixmap_to_mir(PixmapPtr src, int fd) ++{ ++ ScreenPtr pScreen = src->drawable.pScreen; ++ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ++ NVPtr pNv = NVPTR(pScrn); ++ ExaDriverPtr exa = pNv->EXADriverPtr; ++ ++ PixmapPtr dst = NULL; ++ int ret; ++ struct nouveau_bo *bo_dst = NULL; ++ ++ ret = nouveau_bo_prime_handle_ref(pNv->dev, fd, &bo_dst); ++ ErrorF("ret = %i for buffer %i\n", ret, fd); ++ assert(!ret); ++ ++ dst = pScreen->CreatePixmap(pScreen, 0, 0, pScrn->depth, 0); ++ if (dst == NullPixmap) ++ goto cleanup_bo; ++ ++ pScreen->ModifyPixmapHeader(dst, pScrn->virtualX, pScrn->virtualY, pScrn->depth, pScrn->depth, ++ pScrn->virtualX, NULL); ++ nouveau_bo_ref(bo_dst, &nouveau_pixmap(dst)->bo); ++ ++ ret = exa->PrepareCopy (src, dst, 0, 0, GXcopy, FB_ALLONES); ++ if (ret) { ++ exa->Copy (dst, 0, 0, 0, 0, pScrn->virtualX, pScrn->virtualY); ++ exa->DoneCopy (dst); ++ PUSH_KICK(pNv->pushbuf); ++ } ++ ++cleanup_bo: ++ nouveau_bo_ref(NULL, &bo_dst); ++} ++ ++static void ++nouveau_xmir_buffer_available(WindowPtr win) ++{ ++ int fd; ++ PixmapPtr window_pixmap; ++ ScreenPtr screen = win->drawable.pScreen; ++ ++ if (!xmir_window_is_dirty(win)) ++ return; ++ ++ fd = xmir_prime_fd_for_window(win); ++ ++ window_pixmap = (*win->drawable.pScreen->GetWindowPixmap)(win); ++ ++ assert(window_pixmap == screen->GetScreenPixmap(screen)); ++ ++ nouveau_xmir_copy_pixmap_to_mir(window_pixmap, fd); ++ ++ xmir_submit_rendering_for_window(win, NULL); ++} ++ ++static void ++nouveau_submit_dirty_window(WindowPtr win) ++{ ++ PixmapPtr window_pixmap; ++ int fd; ++ ++ if (!xmir_window_has_free_buffer(win)) ++ return; ++ ++ fd = xmir_prime_fd_for_window(win); ++ ++ window_pixmap = (*win->drawable.pScreen->GetWindowPixmap)(win); ++ nouveau_xmir_copy_pixmap_to_mir(window_pixmap, fd); ++ ++ xmir_submit_rendering_for_window(win, NULL); ++} ++ ++static xmir_driver xmir_nouveau_driver = { ++ XMIR_DRIVER_VERSION, ++ nouveau_xmir_buffer_available ++}; ++#endif ++ + static void + NVBlockHandler (BLOCKHANDLER_ARGS_DECL) + { +@@ -516,6 +626,11 @@ + nouveau_dirty_update(pScreen); + #endif + ++#ifdef XMIR ++ if (pNv->xmir) ++ xmir_screen_for_each_damaged_window(pNv->xmir, nouveau_submit_dirty_window); ++#endif ++ + if (pScrn->vtSema && !pNv->NoAccel) + nouveau_pushbuf_kick(pNv->pushbuf, pNv->pushbuf->channel); + +@@ -535,7 +650,10 @@ + return FALSE; + pScreen->CreateScreenResources = NVCreateScreenResources; + +- drmmode_fbcon_copy(pScreen); ++ if (!xorgMir) ++ drmmode_fbcon_copy(pScreen); ++ else if (!xf86SetDesiredModes(pScrn)) ++ return FALSE; + if (!NVEnterVT(VT_FUNC_ARGS(0))) + return FALSE; + +@@ -561,7 +679,7 @@ + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + NVPtr pNv = NVPTR(pScrn); + +- if (XF86_CRTC_CONFIG_PTR(pScrn)->num_crtc) ++ if (!xorgMir && XF86_CRTC_CONFIG_PTR(pScrn)->num_crtc) + drmmode_screen_fini(pScreen); + + if (!pNv->NoAccel) +@@ -688,7 +806,7 @@ + NVPtr pNv = NVPTR(pScrn); + NVEntPtr pNVEnt = NVEntPriv(pScrn); + struct pci_device *dev = pNv->PciInfo; +- char *busid; ++ char *busid = NULL; + drmSetVersion sv; + int err; + int ret; +@@ -712,8 +830,11 @@ + busid = XNFprintf("pci:%04x:%02x:%02x.%d", + dev->domain, dev->bus, dev->dev, dev->func); + #endif ++ if (!xorgMir) ++ ret = nouveau_device_open(busid, &pNv->dev); ++ else ++ ret = nouveau_device_wrap(xmir_get_drm_fd(busid), 0, &pNv->dev); + +- ret = nouveau_device_open(busid, &pNv->dev); + if (ret) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] Failed to open DRM device for %s: %d\n", +@@ -723,6 +844,9 @@ + } + free(busid); + ++ if (xorgMir) ++ return TRUE; ++ + sv.drm_di_major = 1; + sv.drm_di_minor = 1; + sv.drm_dd_major = -1; +@@ -818,6 +942,14 @@ + ) + return FALSE; + ++#ifdef XMIR ++ if (xorgMir) { ++ pNv->xmir = xmir_screen_create(pScrn); ++ if (pNv->xmir == NULL) ++ NVPreInitFail("Mir failed to initialize\n"); ++ } ++#endif ++ + if (xf86IsEntityShared(pScrn->entityList[0])) { + if(!xf86IsPrimInitDone(pScrn->entityList[0])) { + pNv->Primary = TRUE; +@@ -965,6 +1097,8 @@ + from = X_CONFIG; + pNv->HWCursor = FALSE; + } ++ if (xorgMir) ++ pNv->HWCursor = FALSE; + xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", + pNv->HWCursor ? "HW" : "SW"); + +@@ -1062,7 +1196,11 @@ + xf86DrvMsg(pScrn->scrnIndex, from, "Swap limit set to %d [Max allowed %d]%s\n", + pNv->swap_limit, pNv->max_swap_limit, reason); + +- ret = drmmode_pre_init(pScrn, pNv->dev->fd, pScrn->bitsPerPixel >> 3); ++ if (xorgMir) { ++ xmir_screen_pre_init(pScrn, pNv->xmir, &xmir_nouveau_driver); ++ ret = TRUE; ++ } else ++ ret = drmmode_pre_init(pScrn, pNv->dev->fd, pScrn->bitsPerPixel >> 3); + if (ret == FALSE) + NVPreInitFail("Kernel modesetting failed to initialize\n"); + +@@ -1170,7 +1308,8 @@ + { + NVPtr pNv = NVPTR(pScrn); + +- drmmode_remove_fb(pScrn); ++ if (!xorgMir) ++ drmmode_remove_fb(pScrn); + + nouveau_bo_ref(NULL, &pNv->transfer); + nouveau_bo_ref(NULL, &pNv->scanout); +@@ -1370,6 +1509,11 @@ + else + fbPictureInit (pScreen, 0, 0); + ++#ifdef XMIR ++ if (pNv->xmir) ++ xmir_screen_init(pScreen, pNv->xmir); ++#endif ++ + xf86SetBlackWhitePixels(pScreen); + + if (!pNv->NoAccel && !nouveau_exa_init(pScreen)) +@@ -1443,19 +1587,19 @@ + * Initialize colormap layer. + * Must follow initialization of the default colormap + */ +- if (xf86_config->num_crtc && ++ if (!xorgMir && xf86_config->num_crtc && + !xf86HandleColormaps(pScreen, 256, 8, NVLoadPalette, + NULL, CMAP_PALETTED_TRUECOLOR)) +- return FALSE; + + /* Report any unused options (only for the first generation) */ + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + +- if (xf86_config->num_crtc) ++ if (!xorgMir && xf86_config->num_crtc) + drmmode_screen_init(pScreen); + else + pNv->glx_vblank = FALSE; ++ + return TRUE; + } + +Index: xf86-video-nouveau/src/nv_type.h +=================================================================== +--- xf86-video-nouveau.orig/src/nv_type.h 2013-08-01 20:57:06.744921258 +1000 ++++ xf86-video-nouveau/src/nv_type.h 2013-08-01 20:57:06.740921258 +1000 +@@ -9,6 +9,14 @@ + #include <stdint.h> + #include "xf86Crtc.h" + ++#ifdef XMIR ++#include "xmir.h" ++#include "xf86Priv.h" ++#else ++typedef struct xmir_screen xmir_screen; ++#define xorgMir 0 ++#endif ++ + #if XF86_CRTC_VERSION >= 5 + #define NOUVEAU_PIXMAP_SHARING 1 + #endif +@@ -112,6 +120,8 @@ + PixmapPtr pspix, pmpix, pdpix; + PicturePtr pspict, pmpict; + Pixel fg_colour; ++ ++ xmir_screen *xmir; + } NVRec; + + #define NVPTR(p) ((NVPtr)((p)->driverPrivate)) -- 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/e1v5coc-0002tc...@vasks.debian.org