panfrost: Avoid passing winsys handles to import/export BO funcs

Let's keep a clear split between ioctl wrappers and the rest of the
driver. All the import BO function need is a dmabuf FD and the screen
object, and the export one should only take care of generating a dmabuf
FD out of a BO object. Winsys handle manipulation should stay in the
resource.c file.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
This commit is contained in:
Boris Brezillon
2019-07-02 12:53:17 +02:00
parent aa5bc35f31
commit 8d4afcdacc
3 changed files with 20 additions and 19 deletions

View File

@@ -114,7 +114,7 @@ panfrost_drm_free_slab(struct panfrost_screen *screen, struct panfrost_memory *m
} }
struct panfrost_bo * struct panfrost_bo *
panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *whandle) panfrost_drm_import_bo(struct panfrost_screen *screen, int fd)
{ {
struct panfrost_bo *bo = rzalloc(screen, struct panfrost_bo); struct panfrost_bo *bo = rzalloc(screen, struct panfrost_bo);
struct drm_panfrost_get_bo_offset get_bo_offset = {0,}; struct drm_panfrost_get_bo_offset get_bo_offset = {0,};
@@ -122,7 +122,7 @@ panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *wha
int ret; int ret;
unsigned gem_handle; unsigned gem_handle;
ret = drmPrimeFDToHandle(screen->fd, whandle->handle, &gem_handle); ret = drmPrimeFDToHandle(screen->fd, fd, &gem_handle);
assert(!ret); assert(!ret);
get_bo_offset.handle = gem_handle; get_bo_offset.handle = gem_handle;
@@ -141,7 +141,7 @@ panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *wha
assert(0); assert(0);
} }
bo->size = lseek(whandle->handle, 0, SEEK_END); bo->size = lseek(fd, 0, SEEK_END);
assert(bo->size > 0); assert(bo->size > 0);
bo->cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, bo->cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
screen->fd, mmap_bo.offset); screen->fd, mmap_bo.offset);
@@ -158,21 +158,18 @@ panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *wha
} }
int int
panfrost_drm_export_bo(struct panfrost_screen *screen, int gem_handle, unsigned int stride, struct winsys_handle *whandle) panfrost_drm_export_bo(struct panfrost_screen *screen, const struct panfrost_bo *bo)
{ {
struct drm_prime_handle args = { struct drm_prime_handle args = {
.handle = gem_handle, .handle = bo->gem_handle,
.flags = DRM_CLOEXEC, .flags = DRM_CLOEXEC,
}; };
int ret = drmIoctl(screen->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args); int ret = drmIoctl(screen->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
if (ret == -1) if (ret == -1)
return FALSE; return -1;
whandle->handle = args.fd; return args.fd;
whandle->stride = stride;
return TRUE;
} }
static int static int

View File

@@ -70,7 +70,7 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
pipe_reference_init(&prsc->reference, 1); pipe_reference_init(&prsc->reference, 1);
prsc->screen = pscreen; prsc->screen = pscreen;
rsc->bo = panfrost_drm_import_bo(screen, whandle); rsc->bo = panfrost_drm_import_bo(screen, whandle->handle);
rsc->slices[0].stride = whandle->stride; rsc->slices[0].stride = whandle->stride;
rsc->slices[0].initialized = true; rsc->slices[0].initialized = true;
@@ -120,10 +120,16 @@ panfrost_resource_get_handle(struct pipe_screen *pscreen,
handle->handle = args.fd; handle->handle = args.fd;
return TRUE; return TRUE;
} else } else {
return panfrost_drm_export_bo(screen, rsrc->bo->gem_handle, int fd = panfrost_drm_export_bo(screen, rsrc->bo);
rsrc->slices[0].stride,
handle); if (fd < 0)
return FALSE;
handle->handle = fd;
handle->stride = rsrc->slices[0].stride;
return TRUE;
}
} }
return FALSE; return FALSE;

View File

@@ -83,11 +83,9 @@ void
panfrost_drm_free_slab(struct panfrost_screen *screen, panfrost_drm_free_slab(struct panfrost_screen *screen,
struct panfrost_memory *mem); struct panfrost_memory *mem);
struct panfrost_bo * struct panfrost_bo *
panfrost_drm_import_bo(struct panfrost_screen *screen, panfrost_drm_import_bo(struct panfrost_screen *screen, int fd);
struct winsys_handle *whandle);
int int
panfrost_drm_export_bo(struct panfrost_screen *screen, int gem_handle, panfrost_drm_export_bo(struct panfrost_screen *screen, const struct panfrost_bo *bo);
unsigned int stride, struct winsys_handle *whandle);
int int
panfrost_drm_submit_vs_fs_job(struct panfrost_context *ctx, bool has_draws, panfrost_drm_submit_vs_fs_job(struct panfrost_context *ctx, bool has_draws,
bool is_scanout); bool is_scanout);