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

Reply via email to