summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <[email protected]>2019-07-02 12:53:17 +0200
committerBoris Brezillon <[email protected]>2019-07-02 14:58:51 +0200
commit8d4afcdacc16822d38318f8e7e0148566d2af9ec (patch)
treef5ad5e71c4036bc36a5072f41c0688d9eb74953f
parentaa5bc35f31863fd15219849bc09826fe5be3a2ba (diff)
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 <[email protected]>
-rw-r--r--src/gallium/drivers/panfrost/pan_drm.c17
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c16
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.h6
3 files changed, 20 insertions, 19 deletions
diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c
index f17f56bc630..b88ab0e5ce2 100644
--- a/src/gallium/drivers/panfrost/pan_drm.c
+++ b/src/gallium/drivers/panfrost/pan_drm.c
@@ -114,7 +114,7 @@ panfrost_drm_free_slab(struct panfrost_screen *screen, struct panfrost_memory *m
}
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 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;
unsigned gem_handle;
- ret = drmPrimeFDToHandle(screen->fd, whandle->handle, &gem_handle);
+ ret = drmPrimeFDToHandle(screen->fd, fd, &gem_handle);
assert(!ret);
get_bo_offset.handle = gem_handle;
@@ -141,7 +141,7 @@ panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *wha
assert(0);
}
- bo->size = lseek(whandle->handle, 0, SEEK_END);
+ bo->size = lseek(fd, 0, SEEK_END);
assert(bo->size > 0);
bo->cpu = os_mmap(NULL, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
screen->fd, mmap_bo.offset);
@@ -158,21 +158,18 @@ panfrost_drm_import_bo(struct panfrost_screen *screen, struct winsys_handle *wha
}
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 = {
- .handle = gem_handle,
+ .handle = bo->gem_handle,
.flags = DRM_CLOEXEC,
};
int ret = drmIoctl(screen->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
if (ret == -1)
- return FALSE;
+ return -1;
- whandle->handle = args.fd;
- whandle->stride = stride;
-
- return TRUE;
+ return args.fd;
}
static int
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index 8901aeee09b..f86617f80c2 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -70,7 +70,7 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
pipe_reference_init(&prsc->reference, 1);
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].initialized = true;
@@ -120,10 +120,16 @@ panfrost_resource_get_handle(struct pipe_screen *pscreen,
handle->handle = args.fd;
return TRUE;
- } else
- return panfrost_drm_export_bo(screen, rsrc->bo->gem_handle,
- rsrc->slices[0].stride,
- handle);
+ } else {
+ int fd = panfrost_drm_export_bo(screen, rsrc->bo);
+
+ if (fd < 0)
+ return FALSE;
+
+ handle->handle = fd;
+ handle->stride = rsrc->slices[0].stride;
+ return TRUE;
+ }
}
return FALSE;
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index 83186ebb2f7..1a1eb2f8bf2 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -83,11 +83,9 @@ void
panfrost_drm_free_slab(struct panfrost_screen *screen,
struct panfrost_memory *mem);
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);
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);
int
panfrost_drm_submit_vs_fs_job(struct panfrost_context *ctx, bool has_draws,
bool is_scanout);