diff options
author | Eric Anholt <[email protected]> | 2017-05-08 16:46:59 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2017-05-17 14:18:26 -0700 |
commit | 50e78cd04f6b40c4cf02774861380d843b00ebb9 (patch) | |
tree | 9cd2b689ae2bee865109b7b563d06c84ec9eb502 /src/gallium/drivers/vc4/vc4_resource.c | |
parent | 76e4ab57158de8a568572f1acb1d679ce8abb288 (diff) |
vc4: Drop pointless indirections around BO import/export.
I've since found them to be more confusing by adding indirections than
clarifying by screening off resources from the handle/fd import/export
process.
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_resource.c')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_resource.c | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index eee72769f75..c0bfc8ff2ea 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -380,13 +380,31 @@ static boolean vc4_resource_get_handle(struct pipe_screen *pscreen, struct pipe_context *pctx, struct pipe_resource *prsc, - struct winsys_handle *handle, + struct winsys_handle *whandle, unsigned usage) { struct vc4_resource *rsc = vc4_resource(prsc); - return vc4_screen_bo_get_handle(pscreen, rsc->bo, rsc->slices[0].stride, - handle); + whandle->stride = rsc->slices[0].stride; + + /* If we're passing some reference to our BO out to some other part of + * the system, then we can't do any optimizations about only us being + * the ones seeing it (like BO caching or shadow update avoidance). + */ + rsc->bo->private = false; + + switch (whandle->type) { + case DRM_API_HANDLE_TYPE_SHARED: + return vc4_bo_flink(rsc->bo, &whandle->handle); + case DRM_API_HANDLE_TYPE_KMS: + whandle->handle = rsc->bo->handle; + return TRUE; + case DRM_API_HANDLE_TYPE_FD: + whandle->handle = vc4_bo_get_dmabuf(rsc->bo); + return whandle->handle != -1; + } + + return FALSE; } static void @@ -567,9 +585,10 @@ fail: static struct pipe_resource * vc4_resource_from_handle(struct pipe_screen *pscreen, const struct pipe_resource *tmpl, - struct winsys_handle *handle, + struct winsys_handle *whandle, unsigned usage) { + struct vc4_screen *screen = vc4_screen(pscreen); struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl); struct pipe_resource *prsc = &rsc->base; struct vc4_resource_slice *slice = &rsc->slices[0]; @@ -579,7 +598,7 @@ vc4_resource_from_handle(struct pipe_screen *pscreen, if (!rsc) return NULL; - if (handle->stride != expected_stride) { + if (whandle->stride != expected_stride) { static bool warned = false; if (!warned) { warned = true; @@ -588,18 +607,40 @@ vc4_resource_from_handle(struct pipe_screen *pscreen, "unsupported stride %d instead of %d\n", prsc->width0, prsc->height0, util_format_short_name(prsc->format), - handle->stride, + whandle->stride, expected_stride); } goto fail; } rsc->tiled = false; - rsc->bo = vc4_screen_bo_from_handle(pscreen, handle); + + if (whandle->offset != 0) { + fprintf(stderr, + "Attempt to import unsupported winsys offset %u\n", + whandle->offset); + return NULL; + } + + switch (whandle->type) { + case DRM_API_HANDLE_TYPE_SHARED: + rsc->bo = vc4_bo_open_name(screen, + whandle->handle, whandle->stride); + break; + case DRM_API_HANDLE_TYPE_FD: + rsc->bo = vc4_bo_open_dmabuf(screen, + whandle->handle, whandle->stride); + break; + default: + fprintf(stderr, + "Attempt to import unsupported handle type %d\n", + whandle->type); + } + if (!rsc->bo) goto fail; - slice->stride = handle->stride; + slice->stride = whandle->stride; slice->tiling = VC4_TILING_FORMAT_LINEAR; rsc->vc4_format = get_resource_texture_format(prsc); |