mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
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.
This commit is contained in:
parent
76e4ab5715
commit
50e78cd04f
3 changed files with 49 additions and 69 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -660,57 +660,3 @@ fail:
|
|||
ralloc_free(pscreen);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
boolean
|
||||
vc4_screen_bo_get_handle(struct pipe_screen *pscreen,
|
||||
struct vc4_bo *bo,
|
||||
unsigned stride,
|
||||
struct winsys_handle *whandle)
|
||||
{
|
||||
whandle->stride = 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).
|
||||
*/
|
||||
bo->private = false;
|
||||
|
||||
switch (whandle->type) {
|
||||
case DRM_API_HANDLE_TYPE_SHARED:
|
||||
return vc4_bo_flink(bo, &whandle->handle);
|
||||
case DRM_API_HANDLE_TYPE_KMS:
|
||||
whandle->handle = bo->handle;
|
||||
return TRUE;
|
||||
case DRM_API_HANDLE_TYPE_FD:
|
||||
whandle->handle = vc4_bo_get_dmabuf(bo);
|
||||
return whandle->handle != -1;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
struct vc4_bo *
|
||||
vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
|
||||
struct winsys_handle *whandle)
|
||||
{
|
||||
struct vc4_screen *screen = vc4_screen(pscreen);
|
||||
|
||||
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:
|
||||
return vc4_bo_open_name(screen, whandle->handle, whandle->stride);
|
||||
case DRM_API_HANDLE_TYPE_FD:
|
||||
return vc4_bo_open_dmabuf(screen, whandle->handle, whandle->stride);
|
||||
default:
|
||||
fprintf(stderr,
|
||||
"Attempt to import unsupported handle type %d\n",
|
||||
whandle->type);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,13 +102,6 @@ vc4_screen(struct pipe_screen *screen)
|
|||
}
|
||||
|
||||
struct pipe_screen *vc4_screen_create(int fd);
|
||||
boolean vc4_screen_bo_get_handle(struct pipe_screen *pscreen,
|
||||
struct vc4_bo *bo,
|
||||
unsigned stride,
|
||||
struct winsys_handle *whandle);
|
||||
struct vc4_bo *
|
||||
vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
|
||||
struct winsys_handle *whandle);
|
||||
|
||||
const void *
|
||||
vc4_screen_get_compiler_options(struct pipe_screen *pscreen,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue