broadcom/vc4: Allow importing linear BOs with arbitrary offset/stride.
This is part of supporting YUV textures -- MMAL will be handing us a single GEM BO with the planes at offsets within it, and MMAL-decided stride.
This commit is contained in:
parent
978b884afc
commit
0c1dd9dee0
|
@ -708,13 +708,6 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|||
if (!rsc)
|
||||
return NULL;
|
||||
|
||||
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,
|
||||
|
@ -766,6 +759,28 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|||
rsc->vc4_format = get_resource_texture_format(prsc);
|
||||
vc4_setup_slices(rsc, "import");
|
||||
|
||||
if (whandle->offset != 0) {
|
||||
if (rsc->tiled) {
|
||||
fprintf(stderr,
|
||||
"Attempt to import unsupported "
|
||||
"winsys offset %u\n",
|
||||
whandle->offset);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rsc->slices[0].offset += whandle->offset;
|
||||
|
||||
if (rsc->slices[0].offset + rsc->slices[0].size >
|
||||
rsc->bo->size) {
|
||||
fprintf(stderr, "Attempt to import "
|
||||
"with overflowing offset (%d + %d > %d)\n",
|
||||
whandle->offset,
|
||||
rsc->slices[0].size,
|
||||
rsc->bo->size);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
if (screen->ro) {
|
||||
/* Make sure that renderonly has a handle to our buffer in the
|
||||
* display's fd, so that a later renderonly_get_handle()
|
||||
|
@ -779,7 +794,7 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (whandle->stride != slice->stride) {
|
||||
if (rsc->tiled && whandle->stride != slice->stride) {
|
||||
static bool warned = false;
|
||||
if (!warned) {
|
||||
warned = true;
|
||||
|
@ -792,6 +807,8 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|||
slice->stride);
|
||||
}
|
||||
goto fail;
|
||||
} else if (!rsc->tiled) {
|
||||
slice->stride = whandle->stride;
|
||||
}
|
||||
|
||||
return prsc;
|
||||
|
|
Loading…
Reference in New Issue