|
|
@@ -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; |