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

Reply via email to