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

Author: Eric Engestrom <[email protected]>
Date:   Tue Dec 13 21:02:22 2022 +0000

lima: replace custom code with u_pipe_screen_lookup_or_create()

Signed-off-by: Eric Engestrom <[email protected]>
Acked-by: Vasily Khoruzhick <[email protected]>
Acked-by: Erico Nunes <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180>

---

 src/gallium/drivers/lima/lima_screen.c        | 13 +++--
 src/gallium/drivers/lima/lima_screen.h        |  6 +--
 src/gallium/winsys/lima/drm/lima_drm_winsys.c | 72 ++-------------------------
 3 files changed, 16 insertions(+), 75 deletions(-)

diff --git a/src/gallium/drivers/lima/lima_screen.c 
b/src/gallium/drivers/lima/lima_screen.c
index 081060eba57..364510bcdbc 100644
--- a/src/gallium/drivers/lima/lima_screen.c
+++ b/src/gallium/drivers/lima/lima_screen.c
@@ -647,8 +647,16 @@ lima_get_disk_shader_cache (struct pipe_screen *pscreen)
    return screen->disk_cache;
 }
 
+static int
+lima_screen_get_fd(struct pipe_screen *pscreen)
+{
+   struct lima_screen *screen = lima_screen(pscreen);
+   return screen->fd;
+}
+
 struct pipe_screen *
-lima_screen_create(int fd, struct renderonly *ro)
+lima_screen_create(int fd, const struct pipe_screen_config *config,
+                   struct renderonly *ro)
 {
    uint64_t system_memory;
    struct lima_screen *screen;
@@ -731,6 +739,7 @@ lima_screen_create(int fd, struct renderonly *ro)
    pp_frame_rsw[13] = 0x00000100;
 
    screen->base.destroy = lima_screen_destroy;
+   screen->base.get_screen_fd = lima_screen_get_fd;
    screen->base.get_name = lima_screen_get_name;
    screen->base.get_vendor = lima_screen_get_vendor;
    screen->base.get_device_vendor = lima_screen_get_device_vendor;
@@ -750,8 +759,6 @@ lima_screen_create(int fd, struct renderonly *ro)
 
    slab_create_parent(&screen->transfer_pool, sizeof(struct lima_transfer), 
16);
 
-   screen->refcnt = 1;
-
    return &screen->base;
 
 err_out2:
diff --git a/src/gallium/drivers/lima/lima_screen.h 
b/src/gallium/drivers/lima/lima_screen.h
index c6d98041ae8..82800052b15 100644
--- a/src/gallium/drivers/lima/lima_screen.h
+++ b/src/gallium/drivers/lima/lima_screen.h
@@ -64,9 +64,6 @@ struct lima_screen {
    struct pipe_screen base;
    struct renderonly *ro;
 
-   int refcnt;
-   void *winsys_priv;
-
    int fd;
    int gpu_type;
    int num_pp;
@@ -104,6 +101,7 @@ lima_screen(struct pipe_screen *pscreen)
 }
 
 struct pipe_screen *
-lima_screen_create(int fd, struct renderonly *ro);
+lima_screen_create(int fd, const struct pipe_screen_config *config,
+                   struct renderonly *ro);
 
 #endif
diff --git a/src/gallium/winsys/lima/drm/lima_drm_winsys.c 
b/src/gallium/winsys/lima/drm/lima_drm_winsys.c
index 9c8cd933e79..b3d8887d4e3 100644
--- a/src/gallium/winsys/lima/drm/lima_drm_winsys.c
+++ b/src/gallium/winsys/lima/drm/lima_drm_winsys.c
@@ -21,87 +21,23 @@
  * IN THE SOFTWARE.
  */
 
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "c11/threads.h"
 #include "util/os_file.h"
-#include "util/u_hash_table.h"
-#include "util/u_pointer.h"
+#include "util/u_screen.h"
 #include "renderonly/renderonly.h"
 
 #include "lima_drm_public.h"
 
 #include "lima/lima_screen.h"
 
-static struct hash_table *fd_tab = NULL;
-static mtx_t lima_screen_mutex = _MTX_INITIALIZER_NP;
-
-static void
-lima_drm_screen_destroy(struct pipe_screen *pscreen)
-{
-   struct lima_screen *screen = lima_screen(pscreen);
-   boolean destroy;
-   int fd = screen->fd;
-
-   mtx_lock(&lima_screen_mutex);
-   destroy = --screen->refcnt == 0;
-   if (destroy) {
-      _mesa_hash_table_remove_key(fd_tab, intptr_to_pointer(fd));
-
-      if (!fd_tab->entries) {
-         _mesa_hash_table_destroy(fd_tab, NULL);
-         fd_tab = NULL;
-      }
-   }
-   mtx_unlock(&lima_screen_mutex);
-
-   if (destroy) {
-      pscreen->destroy = screen->winsys_priv;
-      pscreen->destroy(pscreen);
-      close(fd);
-   }
-}
-
 struct pipe_screen *
 lima_drm_screen_create(int fd)
 {
-   struct pipe_screen *pscreen = NULL;
-
-   mtx_lock(&lima_screen_mutex);
-   if (!fd_tab) {
-      fd_tab = util_hash_table_create_fd_keys();
-      if (!fd_tab)
-         goto unlock;
-   }
-
-   pscreen = util_hash_table_get(fd_tab, intptr_to_pointer(fd));
-   if (pscreen) {
-      lima_screen(pscreen)->refcnt++;
-   } else {
-      int dup_fd = os_dupfd_cloexec(fd);
-
-      pscreen = lima_screen_create(dup_fd, NULL);
-      if (pscreen) {
-         _mesa_hash_table_insert(fd_tab, intptr_to_pointer(dup_fd), pscreen);
-
-         /* Bit of a hack, to avoid circular linkage dependency,
-          * ie. pipe driver having to call in to winsys, we
-          * override the pipe drivers screen->destroy():
-          */
-         lima_screen(pscreen)->winsys_priv = pscreen->destroy;
-         pscreen->destroy = lima_drm_screen_destroy;
-      }
-   }
-
-unlock:
-   mtx_unlock(&lima_screen_mutex);
-   return pscreen;
+   return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL,
+                                         NULL, lima_screen_create);
 }
 
 struct pipe_screen *
 lima_drm_screen_create_renderonly(struct renderonly *ro)
 {
-   return lima_screen_create(os_dupfd_cloexec(ro->gpu_fd), ro);
+   return lima_screen_create(os_dupfd_cloexec(ro->gpu_fd), NULL, ro);
 }

Reply via email to