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