static boolean etna_resource_get_handle(struct pipe_screen *pscreen, struct pipe_context *pctx, struct pipe_resource *prsc, struct winsys_handle *handle, unsigned usage) { struct etna_resource *rsc = etna_resource(prsc); if (renderonly_get_handle(rsc->scanout, handle)) return TRUE; return etna_screen_bo_get_handle(pscreen, rsc->bo, rsc->levels[0].stride, handle); }
static boolean etna_resource_get_handle(struct pipe_screen *pscreen, struct pipe_context *pctx, struct pipe_resource *prsc, struct winsys_handle *handle, unsigned usage) { struct etna_resource *rsc = etna_resource(prsc); /* Scanout is always attached to the base resource */ struct renderonly_scanout *scanout = rsc->scanout; /* * External resources are preferred, so a import->export chain of * render/sampler incompatible buffers yield the same handle. */ if (rsc->external) rsc = etna_resource(rsc->external); handle->stride = rsc->levels[0].stride; handle->modifier = layout_to_modifier(rsc->layout); if (handle->type == WINSYS_HANDLE_TYPE_SHARED) { return etna_bo_get_name(rsc->bo, &handle->handle) == 0; } else if (handle->type == WINSYS_HANDLE_TYPE_KMS) { if (renderonly_get_handle(scanout, handle)) { return TRUE; } else { handle->handle = etna_bo_handle(rsc->bo); return TRUE; } } else if (handle->type == WINSYS_HANDLE_TYPE_FD) { handle->handle = etna_bo_dmabuf(rsc->bo); return TRUE; } else { return FALSE; } }