From 99fc6f7271c611b58779a0e5c8a7d1764570449d Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sat, 14 Aug 2021 14:03:58 +0200 Subject: [PATCH] panfrost: 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. Signed-off-by: Simon Ser Fixes: 4c092947df30 ("panfrost: fail in get_handle(TYPE_KMS) without a scanout resource") Reported-by: Roman Stratiienko Reviewed-by: Daniel Stone Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/pan_resource.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 6e46cf0..49bd3fb 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -183,6 +183,30 @@ panfrost_resource_get_handle(struct pipe_screen *pscreen, return false; } +static bool +panfrost_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 panfrost_resource *rsrc = (struct panfrost_resource *) prsc; + + switch (param) { + case PIPE_RESOURCE_PARAM_STRIDE: + *value = rsrc->image.layout.slices[level].line_stride; + return true; + case PIPE_RESOURCE_PARAM_OFFSET: + *value = rsrc->image.layout.slices[level].offset; + return true; + case PIPE_RESOURCE_PARAM_MODIFIER: + *value = rsrc->image.layout.modifier; + return true; + default: + return false; + } +} + static void panfrost_flush_resource(struct pipe_context *pctx, struct pipe_resource *prsc) { @@ -1329,6 +1353,7 @@ panfrost_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_destroy = u_transfer_helper_resource_destroy; pscreen->resource_from_handle = panfrost_resource_from_handle; pscreen->resource_get_handle = panfrost_resource_get_handle; + pscreen->resource_get_param = panfrost_resource_get_param; pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, true, false, fake_rgtc, true); -- 2.7.4