From e079116cf0e53501a23c38e76338c3d6f9b3fd3d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 18 Sep 2024 15:09:25 -0400 Subject: [PATCH] vl: add Windows kopper support this passes through the LUID when provided by the caller Reviewed-by: Jesse Natalie Part-of: --- src/gallium/auxiliary/meson.build | 4 +-- src/gallium/auxiliary/vl/vl_winsys.h | 1 + src/gallium/auxiliary/vl/vl_winsys_kopper.c | 32 +++++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/gallium/auxiliary/meson.build b/src/gallium/auxiliary/meson.build index b483cf04eb8..afac59ce6a6 100644 --- a/src/gallium/auxiliary/meson.build +++ b/src/gallium/auxiliary/meson.build @@ -447,7 +447,7 @@ if with_platform_x11 files_libgalliumvlwinsys += files('vl/vl_winsys_dri3.c') endif endif -if with_platform_x11 and with_gallium_zink +if with_gallium_zink files_libgalliumvlwinsys += files('vl/vl_winsys_kopper.c') endif @@ -575,7 +575,7 @@ endif libgalliumvlwinsys = static_library( 'galliumvlwinsys', files_libgalliumvlwinsys, - include_directories : [inc_gallium, inc_include, inc_loader, inc_src], + include_directories : [inc_gallium, inc_include, inc_loader, inc_src, include_directories('../drivers/zink')], dependencies : [dep_libdrm, vlwinsys_deps, idep_mesautil], link_with : [libloader_x11], build_by_default : false, diff --git a/src/gallium/auxiliary/vl/vl_winsys.h b/src/gallium/auxiliary/vl/vl_winsys.h index 6b7cd92416a..afb1d9334e2 100644 --- a/src/gallium/auxiliary/vl/vl_winsys.h +++ b/src/gallium/auxiliary/vl/vl_winsys.h @@ -110,6 +110,7 @@ vl_kopper_screen_create_x11(void *display, int screen) { return NULL; }; #ifdef _WIN32 struct vl_screen *vl_win32_screen_create(LUID *adapter); struct vl_screen *vl_win32_screen_create_from_d3d12_device(IUnknown* d3d12_device, struct sw_winsys* winsys); +struct vl_screen *vl_kopper_screen_create_win32(LUID *adapter); #else /* Always enable the DRM vl winsys */ struct vl_screen * diff --git a/src/gallium/auxiliary/vl/vl_winsys_kopper.c b/src/gallium/auxiliary/vl/vl_winsys_kopper.c index 903c5e760a4..f8565b0a4b5 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_kopper.c +++ b/src/gallium/auxiliary/vl/vl_winsys_kopper.c @@ -33,10 +33,11 @@ #include "vl/vl_compositor.h" #if defined(HAVE_X11_PLATFORM) && defined(HAVE_LIBDRM) #include +#include "gallium/drivers/zink/zink_kopper.h" #include #include "x11/loader_x11.h" -#include "gallium/drivers/zink/zink_kopper.h" #endif +#include "zink_public.h" struct vl_kopper_screen { @@ -76,7 +77,8 @@ vl_kopper_screen_destroy(struct vl_screen *vscreen) struct vl_kopper_screen *scrn = (struct vl_kopper_screen *) vscreen; #if defined(HAVE_X11_PLATFORM) && defined(HAVE_LIBDRM) - close(scrn->fd); + if (scrn->fd != -1) + close(scrn->fd); if (scrn->drawable_texture) pipe_resource_reference(&scrn->drawable_texture, NULL); #endif @@ -230,3 +232,29 @@ error: return NULL; } #endif + +#ifdef _WIN32 +struct vl_screen * +vl_kopper_screen_create_win32(LUID *luid) +{ + struct vl_kopper_screen *scrn = CALLOC_STRUCT(vl_kopper_screen); + uint64_t adapter_luid = 0; + + if (luid) + memcpy(&adapter_luid, luid, sizeof(adapter_luid)); + scrn->base.pscreen = zink_win32_create_screen(adapter_luid); + if (!scrn->base.pscreen) + goto error; + + scrn->base.destroy = vl_kopper_screen_destroy; + + scrn->pipe = scrn->base.pscreen->context_create(scrn->base.pscreen, NULL, 0); + + return &scrn->base; + +error: + vl_kopper_screen_destroy(&scrn->base); + + return NULL; +} +#endif