Module: Mesa Branch: main Commit: cd152ec93057a5afc4335acc9adb2668d5a7a840 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd152ec93057a5afc4335acc9adb2668d5a7a840
Author: Eric Engestrom <[email protected]> Date: Wed Dec 14 22:20:57 2022 +0000 asahi: use u_pipe_screen_lookup_or_create() to keep track of and reuse screens Signed-off-by: Eric Engestrom <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180> --- src/gallium/drivers/asahi/agx_pipe.c | 7 +++++++ src/gallium/winsys/asahi/drm/asahi_drm_winsys.c | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 9b550bc72ad..453df377503 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -1782,6 +1782,12 @@ static const struct u_transfer_vtbl transfer_vtbl = { .get_stencil = agx_resource_get_stencil, }; +static int +agx_screen_get_fd(struct pipe_screen *pscreen) +{ + return agx_device(pscreen)->fd; +} + struct pipe_screen * agx_screen_create(int fd, struct renderonly *ro, struct sw_winsys *winsys) { @@ -1822,6 +1828,7 @@ agx_screen_create(int fd, struct renderonly *ro, struct sw_winsys *winsys) } screen->destroy = agx_destroy_screen; + screen->get_screen_fd = agx_screen_get_fd; screen->get_name = agx_get_name; screen->get_vendor = agx_get_vendor; screen->get_device_vendor = agx_get_device_vendor; diff --git a/src/gallium/winsys/asahi/drm/asahi_drm_winsys.c b/src/gallium/winsys/asahi/drm/asahi_drm_winsys.c index 97273507c5c..fc1c9ce304c 100644 --- a/src/gallium/winsys/asahi/drm/asahi_drm_winsys.c +++ b/src/gallium/winsys/asahi/drm/asahi_drm_winsys.c @@ -30,20 +30,30 @@ #include "util/os_file.h" #include "util/u_math.h" #include "util/u_memory.h" +#include "util/u_screen.h" #include "drm-uapi/drm.h" #include "renderonly/renderonly.h" #include "asahi_drm_public.h" #include "asahi/agx_public.h" +static struct pipe_screen * +asahi_screen_create(int fd, const struct pipe_screen_config *config, + struct renderonly *ro) +{ + return agx_screen_create(fd, ro, NULL); +} + struct pipe_screen * asahi_drm_screen_create(int fd) { - return agx_screen_create(os_dupfd_cloexec(fd), NULL, NULL); + return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL, + NULL, asahi_screen_create); } struct pipe_screen * asahi_drm_screen_create_renderonly(struct renderonly *ro) { - return agx_screen_create(os_dupfd_cloexec(ro->gpu_fd), ro, NULL); + return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(ro->gpu_fd), NULL, + ro, asahi_screen_create); }
