Module: Mesa Branch: main Commit: b5919b0b106dbdf5f5da6733e83cc532bdf257d8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b5919b0b106dbdf5f5da6733e83cc532bdf257d8
Author: Simon Ser <[email protected]> Date: Sat Aug 14 13:57:15 2021 +0200 etnaviv: add stride, offset and modifier to 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, extend the resource_get_param hook to allow users to fetch this information without WINSYS_HANDLE_TYPE_KMS. Signed-off-by: Simon Ser <[email protected]> Fixes: 9da901d2b2e7 ("etnaviv: fail in get_handle(TYPE_KMS) without a scanout resource") Reported-by: Roman Stratiienko <[email protected]> Reviewed-by: Lucas Stach <[email protected]> Reviewed-by: Daniel Stone <[email protected]> Reviewed-by: Christian Gmeiner <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12370> --- src/gallium/drivers/etnaviv/etnaviv_resource.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index aa47be8ed07..6f77b829151 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -639,8 +639,7 @@ etna_resource_get_param(struct pipe_screen *pscreen, enum pipe_resource_param param, unsigned usage, uint64_t *value) { - switch (param) { - case PIPE_RESOURCE_PARAM_NPLANES: { + if (param == PIPE_RESOURCE_PARAM_NPLANES) { unsigned count = 0; for (struct pipe_resource *cur = prsc; cur; cur = cur->next) @@ -648,6 +647,25 @@ etna_resource_get_param(struct pipe_screen *pscreen, *value = count; return true; } + + struct pipe_resource *cur = prsc; + for (int i = 0; i < plane; i++) { + cur = cur->next; + if (!cur) + return false; + } + struct etna_resource *rsc = etna_resource(cur); + + switch (param) { + case PIPE_RESOURCE_PARAM_STRIDE: + *value = rsc->levels[level].stride; + return true; + case PIPE_RESOURCE_PARAM_OFFSET: + *value = rsc->levels[level].offset; + return true; + case PIPE_RESOURCE_PARAM_MODIFIER: + *value = layout_to_modifier(rsc->layout); + return true; default: return false; }
