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

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

freedreno: replace custom code with u_pipe_screen_lookup_or_create()

Signed-off-by: Eric Engestrom <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180>

---

 src/gallium/drivers/freedreno/freedreno_screen.c   | 18 +++++-
 src/gallium/drivers/freedreno/freedreno_screen.h   | 16 +----
 .../winsys/freedreno/drm/freedreno_drm_winsys.c    | 75 +---------------------
 3 files changed, 20 insertions(+), 89 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index 5458c35c00e..eb4756425b7 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -989,10 +989,22 @@ fd_screen_get_driver_uuid(struct pipe_screen *pscreen, 
char *uuid)
    fd_get_driver_uuid(uuid);
 }
 
+static int
+fd_screen_get_fd(struct pipe_screen *pscreen)
+{
+   struct fd_screen *screen = fd_screen(pscreen);
+   return fd_device_fd(screen->dev);
+}
+
 struct pipe_screen *
-fd_screen_create(struct fd_device *dev, struct renderonly *ro,
-                 const struct pipe_screen_config *config)
+fd_screen_create(int fd,
+                 const struct pipe_screen_config *config,
+                 struct renderonly *ro)
 {
+   struct fd_device *dev = fd_device_new_dup(fd);
+   if (!dev)
+      return NULL;
+
    struct fd_screen *screen = CALLOC_STRUCT(fd_screen);
    struct pipe_screen *pscreen;
    uint64_t val;
@@ -1013,7 +1025,6 @@ fd_screen_create(struct fd_device *dev, struct renderonly 
*ro,
 
    screen->dev = dev;
    screen->ro = ro;
-   screen->refcnt = 1;
 
    // maybe this should be in context?
    screen->pipe = fd_pipe_new(screen->dev, FD_PIPE_3D);
@@ -1177,6 +1188,7 @@ fd_screen_create(struct fd_device *dev, struct renderonly 
*ro,
    (void)simple_mtx_init(&screen->lock, mtx_plain);
 
    pscreen->destroy = fd_screen_destroy;
+   pscreen->get_screen_fd = fd_screen_get_fd;
    pscreen->get_param = fd_screen_get_param;
    pscreen->get_paramf = fd_screen_get_paramf;
    pscreen->get_shader_param = fd_screen_get_shader_param;
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h 
b/src/gallium/drivers/freedreno/freedreno_screen.h
index 0e2d5790989..87e1c380ba0 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -66,16 +66,6 @@ struct fd_screen {
 
    simple_mtx_t lock;
 
-   /* it would be tempting to use pipe_reference here, but that
-    * really doesn't work well if it isn't the first member of
-    * the struct, so not quite so awesome to be adding refcnting
-    * further down the inheritance hierarchy:
-    */
-   int refcnt;
-
-   /* place for winsys to stash it's own stuff: */
-   void *winsys_priv;
-
    struct slab_parent_pool transfer_pool;
 
    uint64_t gmem_base;
@@ -206,9 +196,9 @@ bool fd_screen_bo_get_handle(struct pipe_screen *pscreen, 
struct fd_bo *bo,
 struct fd_bo *fd_screen_bo_from_handle(struct pipe_screen *pscreen,
                                        struct winsys_handle *whandle);
 
-struct pipe_screen *fd_screen_create(struct fd_device *dev,
-                                     struct renderonly *ro,
-                                     const struct pipe_screen_config *config);
+struct pipe_screen *fd_screen_create(int fd,
+                                     const struct pipe_screen_config *config,
+                                     struct renderonly *ro);
 
 static inline boolean
 is_a20x(struct fd_screen *screen)
diff --git a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c 
b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
index 3b01bd73a3f..b4ffa3f70f6 100644
--- a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
+++ b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
@@ -24,87 +24,16 @@
  *    Rob Clark <[email protected]>
  */
 
-#include <sys/stat.h>
-
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "util/format/u_format.h"
-#include "util/u_memory.h"
 #include "util/u_inlines.h"
-#include "util/u_hash_table.h"
-#include "util/u_pointer.h"
-#include "util/u_thread.h"
+#include "util/u_screen.h"
 
 #include "freedreno_drm_public.h"
 
 #include "freedreno/freedreno_screen.h"
 
-static struct hash_table *fd_tab = NULL;
-
-static mtx_t fd_screen_mutex = _MTX_INITIALIZER_NP;
-
-static void
-fd_drm_screen_destroy(struct pipe_screen *pscreen)
-{
-       struct fd_screen *screen = fd_screen(pscreen);
-       boolean destroy;
-
-       mtx_lock(&fd_screen_mutex);
-       destroy = --screen->refcnt == 0;
-       if (destroy) {
-               int fd = fd_device_fd(screen->dev);
-               _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(&fd_screen_mutex);
-
-       if (destroy) {
-               pscreen->destroy = screen->winsys_priv;
-               pscreen->destroy(pscreen);
-       }
-}
-
 struct pipe_screen *
 fd_drm_screen_create(int fd, struct renderonly *ro,
                const struct pipe_screen_config *config)
 {
-       struct pipe_screen *pscreen = NULL;
-
-       mtx_lock(&fd_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) {
-               fd_screen(pscreen)->refcnt++;
-       } else {
-               struct fd_device *dev = fd_device_new_dup(fd);
-               if (!dev)
-                       goto unlock;
-
-               pscreen = fd_screen_create(dev, ro, config);
-               if (pscreen) {
-                       int fd = fd_device_fd(dev);
-
-                       _mesa_hash_table_insert(fd_tab, intptr_to_pointer(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():
-                        */
-                       fd_screen(pscreen)->winsys_priv = pscreen->destroy;
-                       pscreen->destroy = fd_drm_screen_destroy;
-               }
-       }
-
-unlock:
-       mtx_unlock(&fd_screen_mutex);
-       return pscreen;
+       return u_pipe_screen_lookup_or_create(fd, config, ro, fd_screen_create);
 }

Reply via email to