summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-08-14 14:03:58 +0200
committerEric Engestrom <eric@engestrom.ch>2021-09-07 20:08:49 +0100
commit3141b6457250b71463a2dc069b2cb5eaf0f9e653 (patch)
tree4334f2a4d58a9ed11fceef1376f0bf9394bdd1c9
parent7967fb6236fce3b98ff4f35d91444c1d4fbbdd9d (diff)
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 <contact@emersion.fr> Fixes: 4c092947df30 ("panfrost: fail in get_handle(TYPE_KMS) without a scanout resource") Reported-by: Roman Stratiienko <r.stratiienko@gmail.com> Reviewed-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12370> (cherry picked from commit 99fc6f7271c611b58779a0e5c8a7d1764570449d)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c25
2 files changed, 26 insertions, 1 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 90bef8f3182..0ea156fb721 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -859,7 +859,7 @@
"description": "panfrost: implement resource_get_param",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "4c092947df308f20e288bb5baf50bff181e5d3fa"
},
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index 180e66885ae..0e1f43efbcc 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -196,6 +196,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)
{
@@ -1304,6 +1328,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);