From 15c21eafc2fb34226b783b08987fae448e8b9aa3 Mon Sep 17 00:00:00 2001 From: Max R Date: Sun, 13 Aug 2023 18:23:56 +0300 Subject: [PATCH] virgl: Allow importing resources without known templ On windows when external resources are imported there is no information about them. And in such cases resource_from_hanlde templ argument is equal NULL. To support such case on virgl, virgl winsys can now fill in template for resource, that will be used if templ=NULL. Additionally helper functions were added to convert virgl encoded enums to pipe. Reviewed-by: Feng Jiang Part-of: --- src/gallium/drivers/virgl/virgl_resource.c | 15 +++++++++------ src/gallium/drivers/virgl/virgl_winsys.h | 4 +++- src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index 471d86a5bd3..87d610ebbfc 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -717,22 +717,29 @@ static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *scre uint32_t storage_size; struct virgl_screen *vs = virgl_screen(screen); - if (templ->target == PIPE_BUFFER) + if (templ && templ->target == PIPE_BUFFER) return NULL; struct virgl_resource *res = CALLOC_STRUCT(virgl_resource); - res->b = *templ; + if (templ) + res->b = *templ; res->b.screen = &vs->base; pipe_reference_init(&res->b.reference, 1); plane = winsys_stride = plane_offset = modifier = 0; res->hw_res = vs->vws->resource_create_from_handle(vs->vws, whandle, + &res->b, &plane, &winsys_stride, &plane_offset, &modifier, &res->blob_mem); + if (!res->hw_res) { + FREE(res); + return NULL; + } + /* do not use winsys returns for guest storage info of classic resource */ if (!res->blob_mem) { winsys_stride = 0; @@ -742,10 +749,6 @@ static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *scre virgl_resource_layout(&res->b, &res->metadata, plane, winsys_stride, plane_offset, modifier); - if (!res->hw_res) { - FREE(res); - return NULL; - } /* * If the overall resource is larger than a single page in size, we can diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index e780f5eef9b..deb4f00f0fd 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -27,6 +27,7 @@ #include "virtio-gpu/virgl_hw.h" struct pipe_box; +struct pipe_resource; struct pipe_fence_handle; struct winsys_handle; struct virgl_hw_res; @@ -86,6 +87,7 @@ struct virgl_winsys { struct virgl_hw_res *(*resource_create_from_handle)(struct virgl_winsys *vws, struct winsys_handle *whandle, + struct pipe_resource *templ, uint32_t *plane, uint32_t *stride, uint32_t *plane_offset, @@ -184,5 +186,5 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) } extern enum virgl_formats pipe_to_virgl_format(enum pipe_format format); - +extern enum pipe_format virgl_to_pipe_format(enum virgl_formats format); #endif diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index e3bbd34f00e..03e33eb5508 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -478,6 +478,7 @@ virgl_drm_winsys_resource_get_storage_size(struct virgl_winsys *qws, static struct virgl_hw_res * virgl_drm_winsys_resource_create_handle(struct virgl_winsys *qws, struct winsys_handle *whandle, + UNUSED struct pipe_resource *templ, uint32_t *plane, uint32_t *stride, uint32_t *plane_offset,