asahi: use u_pipe_screen_lookup_or_create() to keep track of and reuse screens

Signed-off-by: Eric Engestrom <eric@igalia.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180>
This commit is contained in:
Eric Engestrom 2022-12-14 22:20:57 +00:00 committed by Marge Bot
parent 8193efec83
commit cd152ec930
2 changed files with 19 additions and 2 deletions

View file

@ -1782,6 +1782,12 @@ static const struct u_transfer_vtbl transfer_vtbl = {
.get_stencil = agx_resource_get_stencil,
};
static int
agx_screen_get_fd(struct pipe_screen *pscreen)
{
return agx_device(pscreen)->fd;
}
struct pipe_screen *
agx_screen_create(int fd, struct renderonly *ro, struct sw_winsys *winsys)
{
@ -1822,6 +1828,7 @@ agx_screen_create(int fd, struct renderonly *ro, struct sw_winsys *winsys)
}
screen->destroy = agx_destroy_screen;
screen->get_screen_fd = agx_screen_get_fd;
screen->get_name = agx_get_name;
screen->get_vendor = agx_get_vendor;
screen->get_device_vendor = agx_get_device_vendor;

View file

@ -30,20 +30,30 @@
#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"
#include "asahi_drm_public.h"
#include "asahi/agx_public.h"
static struct pipe_screen *
asahi_screen_create(int fd, const struct pipe_screen_config *config,
struct renderonly *ro)
{
return agx_screen_create(fd, ro, NULL);
}
struct pipe_screen *
asahi_drm_screen_create(int fd)
{
return agx_screen_create(os_dupfd_cloexec(fd), NULL, NULL);
return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL,
NULL, asahi_screen_create);
}
struct pipe_screen *
asahi_drm_screen_create_renderonly(struct renderonly *ro)
{
return agx_screen_create(os_dupfd_cloexec(ro->gpu_fd), ro, NULL);
return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(ro->gpu_fd), NULL,
ro, asahi_screen_create);
}