libdrm/nouveau: add prime handle->bo and bo->handle support.
authorDave Airlie <airlied@redhat.com>
Mon, 16 Jul 2012 01:51:37 +0000 (02:51 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 19 Jul 2012 03:05:57 +0000 (13:05 +1000)
This adds prime support to nouveau libdrm.

Signed-off-by: Dave Airlie <airlied@redhat.com>
nouveau/nouveau.c
nouveau/nouveau.h

index 5aa41070d582f7f67057f41379b6d7ab7445fd0d..940d93396e566bef5aba643ef7c11fd005375383 100644 (file)
@@ -34,6 +34,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <sys/mman.h>
+#include <fcntl.h>
 
 #include <xf86drm.h>
 #include <xf86atomic.h>
@@ -441,6 +442,40 @@ nouveau_bo_ref(struct nouveau_bo *bo, struct nouveau_bo **pref)
        *pref = bo;
 }
 
+int
+nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd,
+                           struct nouveau_bo **bo)
+{
+       int ret;
+       unsigned int handle;
+
+       ret = drmPrimeFDToHandle(dev->fd, prime_fd, &handle);
+       if (ret) {
+               nouveau_bo_ref(NULL, bo);
+               return ret;
+       }
+
+       ret = nouveau_bo_wrap(dev, handle, bo);
+       if (ret) {
+               nouveau_bo_ref(NULL, bo);
+               return ret;
+       }
+
+       return 0;
+}
+
+int
+nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd)
+{
+       struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
+       int ret;
+
+       ret = drmPrimeHandleToFD(bo->device->fd, nvbo->base.handle, DRM_CLOEXEC, prime_fd);
+       if (ret)
+               return ret;
+       return 0;
+}
+
 int
 nouveau_bo_wait(struct nouveau_bo *bo, uint32_t access,
                struct nouveau_client *client)
index 51a959814bd7c3d8c135d3d305b9f1ab58eb91d0..c42eea7a8e909d3ba33a3e25c1b249eddd04f395 100644 (file)
@@ -135,6 +135,9 @@ int  nouveau_bo_map(struct nouveau_bo *, uint32_t access,
                    struct nouveau_client *);
 int  nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
                     struct nouveau_client *);
+int  nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd,
+                                struct nouveau_bo **);
+int  nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd);
 
 struct nouveau_bufref {
        struct nouveau_list thead;