From 59efea9f63dc7509a772f3cedce675b1f16a5e11 Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Thu, 2 Mar 2023 14:52:02 -0500 Subject: [PATCH] d3d12/llvmpipe/softpipe: Add support for `get_screen_fd` Reviewed-by: Jesse Natalie Reviewed-by: Rob Clark Part-of: --- src/gallium/drivers/d3d12/d3d12_screen.cpp | 13 +++++++++++++ src/gallium/drivers/llvmpipe/lp_screen.c | 13 +++++++++++++ src/gallium/drivers/softpipe/sp_screen.c | 12 ++++++++++++ src/gallium/include/frontend/sw_winsys.h | 3 +++ src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c | 9 +++++++++ 5 files changed, 50 insertions(+) diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 0d2ca39..665df77 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -1231,6 +1231,18 @@ d3d12_interop_export_object(struct pipe_screen *pscreen, struct pipe_resource *r return sizeof(*info); } +static int +d3d12_screen_get_fd(struct pipe_screen *pscreen) +{ + struct d3d12_screen *screen = d3d12_screen(pscreen); + struct sw_winsys *winsys = screen->winsys; + + if (winsys->get_fd) + return winsys->get_fd(winsys); + else + return -1; +} + bool d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LUID *adapter_luid) { @@ -1257,6 +1269,7 @@ d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LU screen->base.get_vendor = d3d12_get_vendor; screen->base.get_device_vendor = d3d12_get_device_vendor; + screen->base.get_screen_fd = d3d12_screen_get_fd; screen->base.get_param = d3d12_get_param; screen->base.get_paramf = d3d12_get_paramf; screen->base.get_shader_param = d3d12_get_shader_param; diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 8423c6d..41bf064 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -964,6 +964,18 @@ lp_get_disk_shader_cache(struct pipe_screen *_screen) return screen->disk_shader_cache; } +static int +llvmpipe_screen_get_fd(struct pipe_screen *_screen) +{ + struct llvmpipe_screen *screen = llvmpipe_screen(_screen); + struct sw_winsys *winsys = screen->winsys; + + if (winsys->get_fd) + return winsys->get_fd(winsys); + else + return -1; +} + void lp_disk_cache_find_shader(struct llvmpipe_screen *screen, @@ -1066,6 +1078,7 @@ llvmpipe_create_screen(struct sw_winsys *winsys) screen->base.get_name = llvmpipe_get_name; screen->base.get_vendor = llvmpipe_get_vendor; screen->base.get_device_vendor = llvmpipe_get_vendor; // TODO should be the CPU vendor + screen->base.get_screen_fd = llvmpipe_screen_get_fd; screen->base.get_param = llvmpipe_get_param; screen->base.get_shader_param = llvmpipe_get_shader_param; screen->base.get_compute_param = llvmpipe_get_compute_param; diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 7af49a8..7bd792f 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -572,6 +572,17 @@ softpipe_get_compute_param(struct pipe_screen *_screen, return 0; } +static int +softpipe_screen_get_fd(struct pipe_screen *screen) +{ + struct sw_winsys *winsys = softpipe_screen(screen)->winsys; + + if (winsys->get_fd) + return winsys->get_fd(winsys); + else + return -1; +} + /** * Create a new pipe_screen object * Note: we're not presently subclassing pipe_screen (no softpipe_screen). @@ -593,6 +604,7 @@ softpipe_create_screen(struct sw_winsys *winsys) screen->base.get_name = softpipe_get_name; screen->base.get_vendor = softpipe_get_vendor; screen->base.get_device_vendor = softpipe_get_vendor; // TODO should be the CPU vendor + screen->base.get_screen_fd = softpipe_screen_get_fd; screen->base.get_param = softpipe_get_param; screen->base.get_shader_param = softpipe_get_shader_param; screen->base.get_paramf = softpipe_get_paramf; diff --git a/src/gallium/include/frontend/sw_winsys.h b/src/gallium/include/frontend/sw_winsys.h index 45ad81b..1982ac5 100644 --- a/src/gallium/include/frontend/sw_winsys.h +++ b/src/gallium/include/frontend/sw_winsys.h @@ -66,6 +66,9 @@ struct sw_winsys void (*destroy)( struct sw_winsys *ws ); + int + (*get_fd)( struct sw_winsys *ws ); + bool (*is_displaytarget_format_supported)( struct sw_winsys *ws, unsigned tex_usage, diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c index 1989831..5761c0e 100644 --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c @@ -491,6 +491,13 @@ kms_sw_displaytarget_display(struct sw_winsys *ws, assert(0); } +static int +kms_sw_winsys_get_fd(struct sw_winsys *ws) +{ + struct kms_sw_winsys *kms_sw = kms_sw_winsys(ws); + + return kms_sw->fd; +} static void kms_destroy_sw_winsys(struct sw_winsys *winsys) @@ -512,6 +519,8 @@ kms_dri_create_winsys(int fd) ws->base.destroy = kms_destroy_sw_winsys; + ws->base.get_fd = kms_sw_winsys_get_fd; + ws->base.is_displaytarget_format_supported = kms_sw_is_displaytarget_format_supported; /* screen texture functions */ -- 2.7.4