aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie2012-07-15 20:51:37 -0500
committerDave Airlie2012-07-18 22:05:57 -0500
commit13c06cde4e9a4ce275c6cbf477d211344f468dbf (patch)
tree58263bc8adc578fd76125b4b0c42952dd0b7f173 /nouveau
parentcc0a14575d9fd0aafe73cb4aa445eaf024436114 (diff)
downloadlibdrm-13c06cde4e9a4ce275c6cbf477d211344f468dbf.tar.gz
libdrm-13c06cde4e9a4ce275c6cbf477d211344f468dbf.tar.xz
libdrm-13c06cde4e9a4ce275c6cbf477d211344f468dbf.zip
libdrm/nouveau: add prime handle->bo and bo->handle support.
This adds prime support to nouveau libdrm. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'nouveau')
-rw-r--r--nouveau/nouveau.c35
-rw-r--r--nouveau/nouveau.h3
2 files changed, 38 insertions, 0 deletions
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 @@
34#include <assert.h> 34#include <assert.h>
35#include <errno.h> 35#include <errno.h>
36#include <sys/mman.h> 36#include <sys/mman.h>
37#include <fcntl.h>
37 38
38#include <xf86drm.h> 39#include <xf86drm.h>
39#include <xf86atomic.h> 40#include <xf86atomic.h>
@@ -442,6 +443,40 @@ nouveau_bo_ref(struct nouveau_bo *bo, struct nouveau_bo **pref)
442} 443}
443 444
444int 445int
446nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd,
447 struct nouveau_bo **bo)
448{
449 int ret;
450 unsigned int handle;
451
452 ret = drmPrimeFDToHandle(dev->fd, prime_fd, &handle);
453 if (ret) {
454 nouveau_bo_ref(NULL, bo);
455 return ret;
456 }
457
458 ret = nouveau_bo_wrap(dev, handle, bo);
459 if (ret) {
460 nouveau_bo_ref(NULL, bo);
461 return ret;
462 }
463
464 return 0;
465}
466
467int
468nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd)
469{
470 struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
471 int ret;
472
473 ret = drmPrimeHandleToFD(bo->device->fd, nvbo->base.handle, DRM_CLOEXEC, prime_fd);
474 if (ret)
475 return ret;
476 return 0;
477}
478
479int
445nouveau_bo_wait(struct nouveau_bo *bo, uint32_t access, 480nouveau_bo_wait(struct nouveau_bo *bo, uint32_t access,
446 struct nouveau_client *client) 481 struct nouveau_client *client)
447{ 482{
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,
135 struct nouveau_client *); 135 struct nouveau_client *);
136int nouveau_bo_wait(struct nouveau_bo *, uint32_t access, 136int nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
137 struct nouveau_client *); 137 struct nouveau_client *);
138int nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd,
139 struct nouveau_bo **);
140int nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd);
138 141
139struct nouveau_bufref { 142struct nouveau_bufref {
140 struct nouveau_list thead; 143 struct nouveau_list thead;