Module: Mesa
Branch: main
Commit: 8193efec8364b50c0781fac9a588d7582c40d8d4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8193efec8364b50c0781fac9a588d7582c40d8d4

Author: Eric Engestrom <[email protected]>
Date:   Tue Dec 13 15:49:57 2022 +0000

panfrost: 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/panfrost/pan_public.h             |  3 ++-
 src/gallium/drivers/panfrost/pan_screen.c             | 10 +++++++++-
 src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c |  7 +++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_public.h 
b/src/gallium/drivers/panfrost/pan_public.h
index ed21ccdda60..5b90ed81fa2 100644
--- a/src/gallium/drivers/panfrost/pan_public.h
+++ b/src/gallium/drivers/panfrost/pan_public.h
@@ -29,9 +29,10 @@ extern "C" {
 #endif
 
 struct pipe_screen;
+struct pipe_screen_config;
 struct renderonly;
 
-struct pipe_screen *panfrost_create_screen(int fd, struct renderonly *ro);
+struct pipe_screen *panfrost_create_screen(int fd, const struct 
pipe_screen_config *config, struct renderonly *ro);
 
 #ifdef __cplusplus
 }
diff --git a/src/gallium/drivers/panfrost/pan_screen.c 
b/src/gallium/drivers/panfrost/pan_screen.c
index 92350235eef..4d9aeeb5bae 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -792,6 +792,12 @@ panfrost_get_disk_shader_cache(struct pipe_screen *pscreen)
    return pan_screen(pscreen)->disk_cache;
 }
 
+static int
+panfrost_get_screen_fd(struct pipe_screen *pscreen)
+{
+   return pan_device(pscreen)->fd;
+}
+
 int
 panfrost_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
                                struct pipe_driver_query_info *info)
@@ -810,7 +816,8 @@ panfrost_get_driver_query_info(struct pipe_screen *pscreen, 
unsigned index,
 }
 
 struct pipe_screen *
-panfrost_create_screen(int fd, struct renderonly *ro)
+panfrost_create_screen(int fd, const struct pipe_screen_config *config,
+                       struct renderonly *ro)
 {
    /* Create the screen */
    struct panfrost_screen *screen = rzalloc(NULL, struct panfrost_screen);
@@ -839,6 +846,7 @@ panfrost_create_screen(int fd, struct renderonly *ro)
 
    screen->base.destroy = panfrost_destroy_screen;
 
+   screen->base.get_screen_fd = panfrost_get_screen_fd;
    screen->base.get_name = panfrost_get_name;
    screen->base.get_vendor = panfrost_get_vendor;
    screen->base.get_device_vendor = panfrost_get_device_vendor;
diff --git a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c 
b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
index 082e816d99b..1c3afa1ed5d 100644
--- a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
+++ b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
@@ -30,6 +30,7 @@
 #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"
@@ -113,12 +114,14 @@ free_scanout:
 struct pipe_screen *
 panfrost_drm_screen_create(int fd)
 {
-   return panfrost_create_screen(os_dupfd_cloexec(fd), NULL);
+   return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL, NULL,
+                                         panfrost_create_screen);
 }
 
 struct pipe_screen *
 panfrost_drm_screen_create_renderonly(struct renderonly *ro)
 {
    ro->create_for_resource = panfrost_create_kms_dumb_buffer_for_resource;
-   return panfrost_create_screen(os_dupfd_cloexec(ro->gpu_fd), ro);
+   return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(ro->gpu_fd), NULL,
+                                         ro, panfrost_create_screen);
 }

Reply via email to