From 13c06cde4e9a4ce275c6cbf477d211344f468dbf Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 16 Jul 2012 02:51:37 +0100 Subject: libdrm/nouveau: add prime handle->bo and bo->handle support. This adds prime support to nouveau libdrm. Signed-off-by: Dave Airlie --- nouveau/nouveau.c | 35 +++++++++++++++++++++++++++++++++++ nouveau/nouveau.h | 3 +++ 2 files changed, 38 insertions(+) diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c index 5aa41070..940d9339 100644 --- a/nouveau/nouveau.c +++ b/nouveau/nouveau.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -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) diff --git a/nouveau/nouveau.h b/nouveau/nouveau.h index 51a95981..c42eea7a 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; -- cgit v1.2.3