From: Jacek Caban jacek@codeweavers.com
--- dlls/win32u/sysparams.c | 20 ++++++ dlls/win32u/vulkan.c | 48 +++++++++++++++ dlls/win32u/win32u_private.h | 1 + dlls/winevulkan/Makefile.in | 2 +- dlls/winevulkan/loader.c | 116 ----------------------------------- 5 files changed, 70 insertions(+), 117 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 13b49a9f12c..13f0b5fc85a 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -7617,3 +7617,23 @@ BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid ) unlock_display_devices(); return found; } + +/* Find the Vulkan LUID corresponding to a device UUID */ +BOOL get_luid_from_vulkan_uuid( const GUID *uuid, LUID *luid ) +{ + BOOL found = FALSE; + struct gpu *gpu; + + if (!lock_display_devices( FALSE )) return FALSE; + + LIST_FOR_EACH_ENTRY( gpu, &gpus, struct gpu, entry ) + { + if (!IsEqualGUID( uuid, &gpu->vulkan_uuid )) continue; + *luid = gpu->luid; + found = TRUE; + break; + } + + unlock_display_devices(); + return found; +} diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 45ed31606dd..aa3c9c7c6a8 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1002,11 +1002,58 @@ static VkResult win32u_vkGetPhysicalDevicePresentRectanglesKHR( VkPhysicalDevice surface->obj.host.surface, rect_count, rects ); }
+static void *find_vk_struct( void *s, VkStructureType t ) +{ + VkBaseOutStructure *header; + + for (header = s; header; header = header->pNext) + { + if (header->sType == t) return header; + } + + return NULL; +} + +static void fill_luid_property( VkPhysicalDeviceProperties2 *properties2 ) +{ + VkPhysicalDeviceVulkan11Properties *vk11; + VkPhysicalDeviceIDProperties *id; + VkBool32 device_luid_valid; + const GUID *uuid; + LUID luid; + + vk11 = find_vk_struct( properties2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES ); + id = find_vk_struct( properties2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES ); + + if (!vk11 && !id) return; + uuid = (const GUID *)(id ? id->deviceUUID : vk11->deviceUUID); + device_luid_valid = get_luid_from_vulkan_uuid( uuid, &luid ); + if (!device_luid_valid) WARN( "luid for %s not found\n", debugstr_guid(uuid) ); + + if (id) + { + if (device_luid_valid) memcpy( &id->deviceLUID, &luid, sizeof(id->deviceLUID) ); + id->deviceLUIDValid = device_luid_valid; + id->deviceNodeMask = 1; + } + + if (vk11) + { + if (device_luid_valid) memcpy( &vk11->deviceLUID, &luid, sizeof(vk11->deviceLUID) ); + vk11->deviceLUIDValid = device_luid_valid; + vk11->deviceNodeMask = 1; + } + + TRACE( "deviceName:%s deviceLUIDValid:%d LUID:%08x:%08x.\n", + properties2->properties.deviceName, device_luid_valid, luid.HighPart, luid.LowPart ); +} + static void win32u_vkGetPhysicalDeviceProperties2( VkPhysicalDevice client_physical_device, VkPhysicalDeviceProperties2 *properties2 ) { struct vulkan_physical_device *physical_device = vulkan_physical_device_from_handle( client_physical_device );
physical_device->instance->p_vkGetPhysicalDeviceProperties2( physical_device->host.physical_device, properties2 ); + fill_luid_property( properties2 ); }
static void win32u_vkGetPhysicalDeviceProperties2KHR( VkPhysicalDevice client_physical_device, VkPhysicalDeviceProperties2 *properties2 ) @@ -1014,6 +1061,7 @@ static void win32u_vkGetPhysicalDeviceProperties2KHR( VkPhysicalDevice client_ph struct vulkan_physical_device *physical_device = vulkan_physical_device_from_handle( client_physical_device );
physical_device->instance->p_vkGetPhysicalDeviceProperties2KHR( physical_device->host.physical_device, properties2 ); + fill_luid_property( properties2 ); }
static VkResult win32u_vkGetPhysicalDeviceSurfaceFormatsKHR( VkPhysicalDevice client_physical_device, VkSurfaceKHR client_surface, diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 99762011ba0..8be540c4f7c 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -204,6 +204,7 @@ struct vulkan_gpu extern BOOL get_vulkan_gpus( struct list *gpus ); extern void free_vulkan_gpu( struct vulkan_gpu *gpu ); extern BOOL get_vulkan_uuid_from_luid( const LUID *luid, GUID *uuid ); +extern BOOL get_luid_from_vulkan_uuid( const GUID *uuid, LUID *luid );
extern int d3dkmt_object_get_fd( D3DKMT_HANDLE local );
diff --git a/dlls/winevulkan/Makefile.in b/dlls/winevulkan/Makefile.in index 52bffca2843..80aa536159b 100644 --- a/dlls/winevulkan/Makefile.in +++ b/dlls/winevulkan/Makefile.in @@ -1,7 +1,7 @@ MODULE = winevulkan.dll UNIXLIB = winevulkan.so IMPORTLIB = winevulkan -IMPORTS = user32 gdi32 advapi32 setupapi win32u +IMPORTS = advapi32 UNIX_LIBS = -lwin32u $(PTHREAD_LIBS)
SOURCES = \ diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 79bbe8a2758..8238d476af1 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -20,10 +20,6 @@ #include <stdlib.h> #include "vulkan_loader.h" #include "winreg.h" -#include "ntuser.h" -#include "initguid.h" -#include "devguid.h" -#include "setupapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
@@ -32,27 +28,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); */ #define WINE_VULKAN_ICD_VERSION 4
-DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2); -DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_GPU_VULKAN_UUID, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5c, 2); - static HINSTANCE hinstance;
-static void *wine_vk_get_global_proc_addr(const char *name); - -#define wine_vk_find_struct(s, t) wine_vk_find_struct_((void *)s, VK_STRUCTURE_TYPE_##t) -static void *wine_vk_find_struct_(void *s, VkStructureType t) -{ - VkBaseOutStructure *header; - - for (header = s; header; header = header->pNext) - { - if (header->sType == t) - return header; - } - - return NULL; -} - VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) { TRACE("%p, %p\n", count, properties); @@ -440,97 +417,6 @@ VkResult WINAPI vkEnumerateInstanceVersion(uint32_t *version) return params.result; }
-static HANDLE get_display_device_init_mutex(void) -{ - HANDLE mutex = CreateMutexW(NULL, FALSE, L"display_device_init"); - - WaitForSingleObject(mutex, INFINITE); - return mutex; -} - -static void release_display_device_init_mutex(HANDLE mutex) -{ - ReleaseMutex(mutex); - CloseHandle(mutex); -} - -/* Wait until graphics driver is loaded by explorer */ -static void wait_graphics_driver_ready(void) -{ - static BOOL ready = FALSE; - - if (!ready) - { - SendMessageW(GetDesktopWindow(), WM_NULL, 0, 0); - ready = TRUE; - } -} - -static void fill_luid_property(VkPhysicalDeviceProperties2 *properties2) -{ - VkPhysicalDeviceVulkan11Properties *vk11; - VkBool32 device_luid_valid = VK_FALSE; - VkPhysicalDeviceIDProperties *id; - uint32_t device_node_mask = 0; - SP_DEVINFO_DATA device_data; - const uint8_t* device_uuid; - DWORD type, device_idx = 0; - HDEVINFO devinfo; - HANDLE mutex; - GUID uuid; - LUID luid; - - vk11 = wine_vk_find_struct(properties2, PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES); - id = wine_vk_find_struct(properties2, PHYSICAL_DEVICE_ID_PROPERTIES); - - if (!vk11 && !id) - return; - - wait_graphics_driver_ready(); - mutex = get_display_device_init_mutex(); - devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, L"PCI", NULL, 0); - device_data.cbSize = sizeof(device_data); - while (SetupDiEnumDeviceInfo(devinfo, device_idx++, &device_data)) - { - if (!SetupDiGetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_GPU_VULKAN_UUID, - &type, (BYTE *)&uuid, sizeof(uuid), NULL, 0)) - continue; - - device_uuid = id ? id->deviceUUID : vk11->deviceUUID; - - if (!IsEqualGUID(&uuid, device_uuid)) - continue; - - if (SetupDiGetDevicePropertyW(devinfo, &device_data, &DEVPROPKEY_GPU_LUID, &type, - (BYTE *)&luid, sizeof(luid), NULL, 0)) - { - device_luid_valid = VK_TRUE; - device_node_mask = 1; - break; - } - } - SetupDiDestroyDeviceInfoList(devinfo); - release_display_device_init_mutex(mutex); - - if (id) - { - if (device_luid_valid) memcpy(&id->deviceLUID, &luid, sizeof(id->deviceLUID)); - id->deviceLUIDValid = device_luid_valid; - id->deviceNodeMask = device_node_mask; - } - - if (vk11) - { - if (device_luid_valid) memcpy(&vk11->deviceLUID, &luid, sizeof(vk11->deviceLUID)); - vk11->deviceLUIDValid = device_luid_valid; - vk11->deviceNodeMask = device_node_mask; - } - - TRACE("deviceName:%s deviceLUIDValid:%d LUID:%08lx:%08lx deviceNodeMask:%#x.\n", - properties2->properties.deviceName, device_luid_valid, luid.HighPart, luid.LowPart, - device_node_mask); -} - void WINAPI vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties2) { @@ -543,7 +429,6 @@ void WINAPI vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev, params.pProperties = properties2; status = UNIX_CALL(vkGetPhysicalDeviceProperties2, ¶ms); assert(!status); - fill_luid_property(properties2); }
void WINAPI vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev, @@ -558,7 +443,6 @@ void WINAPI vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev, params.pProperties = properties2; status = UNIX_CALL(vkGetPhysicalDeviceProperties2KHR, ¶ms); assert(!status); - fill_luid_property(properties2); }
VkResult WINAPI vkCreateDevice(VkPhysicalDevice phys_dev, const VkDeviceCreateInfo *create_info,