summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-08-14 13:57:15 +0200
committerEric Engestrom <eric@engestrom.ch>2021-09-07 20:08:48 +0100
commit7967fb6236fce3b98ff4f35d91444c1d4fbbdd9d (patch)
tree213feb5be0daf816f5a7ded20d0dd1dd08e34fc1
parent9d3789671dff8582f7502b57e709aaffbadab504 (diff)
downloadmesa-7967fb6236fce3b98ff4f35d91444c1d4fbbdd9d.tar.gz
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 <contact@emersion.fr> Fixes: 9da901d2b2e7 ("etnaviv: fail in get_handle(TYPE_KMS) without a scanout resource") Reported-by: Roman Stratiienko <r.stratiienko@gmail.com> Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12370> (cherry picked from commit b5919b0b106dbdf5f5da6733e83cc532bdf257d8)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_resource.c22
2 files changed, 21 insertions, 3 deletions
diff --git a/.pick_status.json b/.pick_status.json
index e58699642ef..90bef8f3182 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -868,7 +868,7 @@
"description": "etnaviv: add stride, offset and modifier to resource_get_param",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "9da901d2b2e7ab5d5f21a0004fc294810f69f04a"
},
diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c
index bac4b75614a..f08043acc7b 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_resource.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c
@@ -632,8 +632,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)
@@ -641,6 +640,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;
}