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:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user