struct winsys_handle *handle, unsigned usage)
{
struct etna_resource *rsc = etna_resource(prsc);
+ struct renderonly_scanout *scanout;
+
+ if (handle->plane) {
+ struct pipe_resource *cur = prsc;
+
+ for (int i = 0; i < handle->plane; i++) {
+ cur = cur->next;
+ if (!cur)
+ return false;
+ }
+ rsc = etna_resource(cur);
+ }
+
/* Scanout is always attached to the base resource */
- struct renderonly_scanout *scanout = rsc->scanout;
+ scanout = rsc->scanout;
handle->stride = rsc->levels[0].stride;
handle->offset = rsc->levels[0].offset;
}
}
+static bool
+etna_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)
+{
+ switch (param) {
+ case PIPE_RESOURCE_PARAM_NPLANES: {
+ unsigned count = 0;
+
+ for (struct pipe_resource *cur = prsc; cur; cur = cur->next)
+ count++;
+ *value = count;
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
void
etna_resource_used(struct etna_context *ctx, struct pipe_resource *prsc,
enum etna_resource_status status)
pscreen->resource_create_with_modifiers = etna_resource_create_modifiers;
pscreen->resource_from_handle = etna_resource_from_handle;
pscreen->resource_get_handle = etna_resource_get_handle;
+ pscreen->resource_get_param = etna_resource_get_param;
pscreen->resource_changed = etna_resource_changed;
pscreen->resource_destroy = etna_resource_destroy;
}