Module: Mesa Branch: main Commit: 8193efec8364b50c0781fac9a588d7582c40d8d4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8193efec8364b50c0781fac9a588d7582c40d8d4
Author: Eric Engestrom <[email protected]> Date: Tue Dec 13 15:49:57 2022 +0000 panfrost: use u_pipe_screen_lookup_or_create() to keep track of and reuse screens Signed-off-by: Eric Engestrom <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20180> --- src/gallium/drivers/panfrost/pan_public.h | 3 ++- src/gallium/drivers/panfrost/pan_screen.c | 10 +++++++++- src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c | 7 +++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_public.h b/src/gallium/drivers/panfrost/pan_public.h index ed21ccdda60..5b90ed81fa2 100644 --- a/src/gallium/drivers/panfrost/pan_public.h +++ b/src/gallium/drivers/panfrost/pan_public.h @@ -29,9 +29,10 @@ extern "C" { #endif struct pipe_screen; +struct pipe_screen_config; struct renderonly; -struct pipe_screen *panfrost_create_screen(int fd, struct renderonly *ro); +struct pipe_screen *panfrost_create_screen(int fd, const struct pipe_screen_config *config, struct renderonly *ro); #ifdef __cplusplus } diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index 92350235eef..4d9aeeb5bae 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -792,6 +792,12 @@ panfrost_get_disk_shader_cache(struct pipe_screen *pscreen) return pan_screen(pscreen)->disk_cache; } +static int +panfrost_get_screen_fd(struct pipe_screen *pscreen) +{ + return pan_device(pscreen)->fd; +} + int panfrost_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, struct pipe_driver_query_info *info) @@ -810,7 +816,8 @@ panfrost_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, } struct pipe_screen * -panfrost_create_screen(int fd, struct renderonly *ro) +panfrost_create_screen(int fd, const struct pipe_screen_config *config, + struct renderonly *ro) { /* Create the screen */ struct panfrost_screen *screen = rzalloc(NULL, struct panfrost_screen); @@ -839,6 +846,7 @@ panfrost_create_screen(int fd, struct renderonly *ro) screen->base.destroy = panfrost_destroy_screen; + screen->base.get_screen_fd = panfrost_get_screen_fd; screen->base.get_name = panfrost_get_name; screen->base.get_vendor = panfrost_get_vendor; screen->base.get_device_vendor = panfrost_get_device_vendor; diff --git a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c index 082e816d99b..1c3afa1ed5d 100644 --- a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c +++ b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c @@ -30,6 +30,7 @@ #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" @@ -113,12 +114,14 @@ free_scanout: struct pipe_screen * panfrost_drm_screen_create(int fd) { - return panfrost_create_screen(os_dupfd_cloexec(fd), NULL); + return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(fd), NULL, NULL, + panfrost_create_screen); } struct pipe_screen * panfrost_drm_screen_create_renderonly(struct renderonly *ro) { ro->create_for_resource = panfrost_create_kms_dumb_buffer_for_resource; - return panfrost_create_screen(os_dupfd_cloexec(ro->gpu_fd), ro); + return u_pipe_screen_lookup_or_create(os_dupfd_cloexec(ro->gpu_fd), NULL, + ro, panfrost_create_screen); }
