diff options
author | Simon Ser <contact@emersion.fr> | 2021-08-14 14:05:43 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-08-19 13:12:51 +0000 |
commit | 8de086e12f5a20a75b227e48faeb83d9aacb21c3 (patch) | |
tree | 3a1647e8c6c4671d9e3ab6fa9154d5901644d863 | |
parent | b1fbceac6f840172e2aeae929072ed92a4c47eb0 (diff) |
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: 7bcb22363935 ("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>
-rw-r--r-- | src/broadcom/ci/piglit-v3d-rpi4-fails.txt | 1 | ||||
-rw-r--r-- | src/gallium/drivers/v3d/v3d_resource.c | 52 |
2 files changed, 41 insertions, 12 deletions
diff --git a/src/broadcom/ci/piglit-v3d-rpi4-fails.txt b/src/broadcom/ci/piglit-v3d-rpi4-fails.txt index f53887f8cad..4557a55562f 100644 --- a/src/broadcom/ci/piglit-v3d-rpi4-fails.txt +++ b/src/broadcom/ci/piglit-v3d-rpi4-fails.txt @@ -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 diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index 62da3147620..d48479460db 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -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, |