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>
main
Dave Airlie 2012-07-16 02:51:37 +01:00
parent cc0a14575d
commit 13c06cde4e
2 changed files with 38 additions and 0 deletions

View 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)

View 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;