v3d: implement resource_get_param
Prior to this commit, the stride, offset and modifier were fetched
via WINSYS_HANDLE_TYPE_KMS. However we can't make such a query
succeed if the buffer couldn't be imported to the KMS device.
Instead, implement the resource_get_param hook to allow users to
fetch this information without WINSYS_HANDLE_TYPE_KMS.
A tiny helper function is introduced to compute the modifier of a
resource.
Signed-off-by: Simon Ser <contact@emersion.fr>
Fixes: 7bcb223639 ("v3d, vc4: Fix dmabuf import for non-scanout buffers")
Reported-by: Roman Stratiienko <r.stratiienko@gmail.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12370>
This commit is contained in:
@@ -236,7 +236,6 @@ spec@ext_gpu_shader4@tex-miplevel-selection gpu4texturelodoffset 1darray,Fail
|
||||
spec@ext_gpu_shader4@tex-miplevel-selection gpu4texturelodoffset 1darrayshadow,Fail
|
||||
spec@ext_gpu_shader4@tex-miplevel-selection gpu4textureoffset 1darray,Fail
|
||||
spec@ext_gpu_shader4@tex-miplevel-selection gpu4textureoffset 1darrayshadow,Fail
|
||||
spec@ext_image_dma_buf_import@ext_image_dma_buf_import-export-tex,Fail
|
||||
spec@ext_packed_depth_stencil@texwrap formats bordercolor,Fail
|
||||
spec@ext_packed_depth_stencil@texwrap formats bordercolor@GL_DEPTH24_STENCIL8- border color only,Fail
|
||||
spec@ext_packed_depth_stencil@texwrap formats bordercolor-swizzled,Fail
|
||||
|
||||
@@ -396,6 +396,21 @@ v3d_resource_destroy(struct pipe_screen *pscreen,
|
||||
free(rsc);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
v3d_resource_modifier(struct v3d_resource *rsc)
|
||||
{
|
||||
if (rsc->tiled) {
|
||||
/* A shared tiled buffer should always be allocated as UIF,
|
||||
* not UBLINEAR or LT.
|
||||
*/
|
||||
assert(rsc->slices[0].tiling == V3D_TILING_UIF_XOR ||
|
||||
rsc->slices[0].tiling == V3D_TILING_UIF_NO_XOR);
|
||||
return DRM_FORMAT_MOD_BROADCOM_UIF;
|
||||
} else {
|
||||
return DRM_FORMAT_MOD_LINEAR;
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
v3d_resource_get_handle(struct pipe_screen *pscreen,
|
||||
struct pipe_context *pctx,
|
||||
@@ -409,6 +424,7 @@ v3d_resource_get_handle(struct pipe_screen *pscreen,
|
||||
|
||||
whandle->stride = rsc->slices[0].stride;
|
||||
whandle->offset = 0;
|
||||
whandle->modifier = v3d_resource_modifier(rsc);
|
||||
|
||||
/* 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
|
||||
@@ -416,17 +432,6 @@ v3d_resource_get_handle(struct pipe_screen *pscreen,
|
||||
*/
|
||||
bo->private = false;
|
||||
|
||||
if (rsc->tiled) {
|
||||
/* A shared tiled buffer should always be allocated as UIF,
|
||||
* not UBLINEAR or LT.
|
||||
*/
|
||||
assert(rsc->slices[0].tiling == V3D_TILING_UIF_XOR ||
|
||||
rsc->slices[0].tiling == V3D_TILING_UIF_NO_XOR);
|
||||
whandle->modifier = DRM_FORMAT_MOD_BROADCOM_UIF;
|
||||
} else {
|
||||
whandle->modifier = DRM_FORMAT_MOD_LINEAR;
|
||||
}
|
||||
|
||||
switch (whandle->type) {
|
||||
case WINSYS_HANDLE_TYPE_SHARED:
|
||||
return v3d_bo_flink(bo, &whandle->handle);
|
||||
@@ -448,6 +453,30 @@ v3d_resource_get_handle(struct pipe_screen *pscreen,
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
v3d_resource_get_param(struct pipe_screen *pscreen,
|
||||
struct pipe_context *pctx, struct pipe_resource *prsc,
|
||||
unsigned plane, unsigned layer, unsigned level,
|
||||
enum pipe_resource_param param,
|
||||
unsigned usage, uint64_t *value)
|
||||
{
|
||||
struct v3d_resource *rsc = v3d_resource(prsc);
|
||||
|
||||
switch (param) {
|
||||
case PIPE_RESOURCE_PARAM_STRIDE:
|
||||
*value = rsc->slices[level].stride;
|
||||
return true;
|
||||
case PIPE_RESOURCE_PARAM_OFFSET:
|
||||
*value = 0;
|
||||
return true;
|
||||
case PIPE_RESOURCE_PARAM_MODIFIER:
|
||||
*value = v3d_resource_modifier(rsc);
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#define PAGE_UB_ROWS (V3D_UIFCFG_PAGE_SIZE / V3D_UIFBLOCK_ROW_SIZE)
|
||||
#define PAGE_UB_ROWS_TIMES_1_5 ((PAGE_UB_ROWS * 3) >> 1)
|
||||
#define PAGE_CACHE_UB_ROWS (V3D_PAGE_CACHE_SIZE / V3D_UIFBLOCK_ROW_SIZE)
|
||||
@@ -1148,6 +1177,7 @@ v3d_resource_screen_init(struct pipe_screen *pscreen)
|
||||
pscreen->resource_create = u_transfer_helper_resource_create;
|
||||
pscreen->resource_from_handle = v3d_resource_from_handle;
|
||||
pscreen->resource_get_handle = v3d_resource_get_handle;
|
||||
pscreen->resource_get_param = v3d_resource_get_param;
|
||||
pscreen->resource_destroy = u_transfer_helper_resource_destroy;
|
||||
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl,
|
||||
true, false,
|
||||
|
||||
Reference in New Issue
Block a user