mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 02:38:04 +02:00
freedreno: replace custom code with u_pipe_screen_lookup_or_create()
Signed-off-by: Eric Engestrom <eric@igalia.com> Reviewed-by: Rob Clark <robclark@freedesktop.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180>
This commit is contained in:
parent
013f05872c
commit
e17c3af593
3 changed files with 21 additions and 90 deletions
|
|
@ -989,10 +989,22 @@ fd_screen_get_driver_uuid(struct pipe_screen *pscreen, char *uuid)
|
|||
fd_get_driver_uuid(uuid);
|
||||
}
|
||||
|
||||
struct pipe_screen *
|
||||
fd_screen_create(struct fd_device *dev, struct renderonly *ro,
|
||||
const struct pipe_screen_config *config)
|
||||
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(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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -24,87 +24,16 @@
|
|||
* Rob Clark <robclark@freedesktop.org>
|
||||
*/
|
||||
|
||||
#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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue