diff mbox

libdrm/nouveau: add prime handle->bo and bo->handle support.

Message ID 1342403539-11789-1-git-send-email-airlied@gmail.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Dave Airlie July 16, 2012, 1:52 a.m. UTC
From: Dave Airlie <airlied@redhat.com>

This adds prime support to nouveau libdrm.

Signed-off-by: Dave Airlie <airlied@redhat.com>
---
 nouveau/nouveau.c |   35 +++++++++++++++++++++++++++++++++++
 nouveau/nouveau.h |    3 +++
 2 files changed, 38 insertions(+)
diff mbox

Patch

diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c
index 5aa4107..940d933 100644
--- a/nouveau/nouveau.c
+++ b/nouveau/nouveau.c
@@ -34,6 +34,7 @@ 
 #include <assert.h>
 #include <errno.h>
 #include <sys/mman.h>
+#include <fcntl.h>
 
 #include <xf86drm.h>
 #include <xf86atomic.h>
@@ -442,6 +443,40 @@  nouveau_bo_ref(struct nouveau_bo *bo, struct nouveau_bo **pref)
 }
 
 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)
 {
diff --git a/nouveau/nouveau.h b/nouveau/nouveau.h
index 51a9598..c42eea7 100644
--- a/nouveau/nouveau.h
+++ b/nouveau/nouveau.h
@@ -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;