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); }