Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/vulkan-1/tests/vulkan.c | 4 +- dlls/winevulkan/make_vulkan | 6 ++- dlls/winex11.drv/vulkan.c | 81 ++++++++++++++++++++++++++++++++++++ include/wine/vulkan_driver.h | 8 +++- 4 files changed, 95 insertions(+), 4 deletions(-)
diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index cb4d2e9e53..da3af11d4d 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -212,8 +212,8 @@ static void test_enumerate_physical_device2(void) trace("Device '%s', device UUID:%s, driver UUID:%s, device LUID:%08x:%08x\n", properties2.properties.deviceName, wine_dbgstr_guid((const GUID *)id.deviceUUID), wine_dbgstr_guid((const GUID *)id.driverUUID), luid->HighPart, luid->LowPart); - todo_wine ok(id.deviceLUIDValid == VK_TRUE, "Expect valid device LUID \n"); - todo_wine ok(id.deviceNodeMask == 1, "Expect device node mask %08x, got %08x\n", 1, id.deviceNodeMask); + ok(id.deviceLUIDValid == VK_TRUE, "Expect valid device LUID \n"); + ok(id.deviceNodeMask == 1, "Expect device node mask %08x, got %08x\n", 1, id.deviceNodeMask); } }
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 960417d428..99c44d420e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -133,7 +133,7 @@ CORE_EXTENSIONS = [ # Functions part of our winevulkan graphics driver interface. # DRIVER_VERSION should be bumped on any change to driver interface # in FUNCTION_OVERRIDES -DRIVER_VERSION = 7 +DRIVER_VERSION = 8
# Table of functions for which we have a special implementation. # These are regular device / instance functions for which we need @@ -167,8 +167,12 @@ FUNCTION_OVERRIDES = { "vkGetDeviceProcAddr" : {"dispatch" : False, "driver" : True, "thunk" : False}, "vkGetDeviceQueue" : {"dispatch": True, "driver" : False, "thunk" : False}, "vkGetDeviceQueue2" : {"dispatch": True, "driver" : False, "thunk" : False}, + "vkGetPhysicalDeviceProperties2": {"dispatch" : True, "driver" : True, "thunk" : True}, "vkQueueSubmit" : {"dispatch": True, "driver" : False, "thunk" : False},
+ # VK_KHR_get_physical_device_properties2 + "vkGetPhysicalDeviceProperties2KHR": {"dispatch" : True, "driver" : True, "thunk" : True}, + # VK_KHR_surface "vkDestroySurfaceKHR" : {"dispatch" : True, "driver" : True, "thunk" : True}, "vkGetPhysicalDeviceSurfaceSupportKHR" : {"dispatch" : True, "driver" : True, "thunk" : True}, diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 28ae1a9e0e..c99a89e388 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -28,6 +28,10 @@
#include "windef.h" #include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "devguid.h" +#include "setupapi.h"
#include "wine/debug.h" #include "wine/heap.h" @@ -56,6 +60,9 @@ static CRITICAL_SECTION context_section = { &critsect_debug, -1, 0, 0, 0, 0 };
static XContext vulkan_hwnd_context;
+extern const DEVPROPKEY DEVPROPKEY_DISPLAY_ADAPTER_LUID; +extern const DEVPROPKEY DEVPROPKEY_DISPLAY_ADAPTER_UUID; + #define VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR 1000004000
struct wine_vk_surface @@ -65,6 +72,13 @@ struct wine_vk_surface VkSurfaceKHR surface; /* native surface */ };
+/* All Vulkan structures use this structure for the first elements. */ +struct wine_vk_structure_header +{ + VkStructureType sType; + void *pNext; +}; + typedef struct VkXlibSurfaceCreateInfoKHR { VkStructureType sType; @@ -85,6 +99,7 @@ static VkResult (*pvkGetDeviceGroupSurfacePresentModesKHR)(VkDevice, VkSurfaceKH static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); +static void (*pvkGetPhysicalDeviceProperties2)(VkPhysicalDevice, VkPhysicalDeviceProperties2 *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); static VkResult (*pvkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); static VkResult (*pvkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkPresentModeKHR *); @@ -131,6 +146,7 @@ static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) LOAD_FUNCPTR(vkQueuePresentKHR) LOAD_OPTIONAL_FUNCPTR(vkGetDeviceGroupSurfacePresentModesKHR) LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDevicePresentRectanglesKHR) + LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceProperties2) #undef LOAD_FUNCPTR #undef LOAD_OPTIONAL_FUNCPTR
@@ -544,6 +560,69 @@ static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR * return res; }
+static BOOL wine_get_adapter_luid(const GUID *uuid, LUID *luid) +{ + HDEVINFO devinfo; + SP_DEVINFO_DATA devinfo_data = {sizeof(SP_DEVINFO_DATA)}; + DEVPROPTYPE property_type; + GUID result; + UINT i; + + devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT); + if (devinfo == INVALID_HANDLE_VALUE) + return FALSE; + + for (i = 0; SetupDiEnumDeviceInfo(devinfo, i, &devinfo_data); ++i) + { + property_type = DEVPROP_TYPE_UINT64; + if (!SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_UUID, &property_type, + (BYTE *)&result, sizeof(result), NULL, 0)) + continue; + + if (IsEqualGUID(&result, uuid)) + { + if (SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_LUID, &property_type, + (BYTE *)luid, sizeof(*luid), NULL, 0)) + return TRUE; + } + } + + return FALSE; +} + +static void wine_fill_physical_device_id_luid(VkPhysicalDeviceProperties2 *properties) +{ + VkPhysicalDeviceIDProperties *id; + struct wine_vk_structure_header *header; + + if (!properties->pNext) + return; + + for (header = properties->pNext; header; header = header->pNext) + { + if (header->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES) + { + id = (VkPhysicalDeviceIDProperties *)header; + if (wine_get_adapter_luid((const GUID *)id->deviceUUID, (LUID *)id->deviceLUID)) + { + id->deviceNodeMask = 1; + id->deviceLUIDValid = VK_TRUE; + } + } + } +} + +static void X11DRV_vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{ + pvkGetPhysicalDeviceProperties2(phys_dev, properties); + wine_fill_physical_device_id_luid(properties); +} + +static void X11DRV_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{ + X11DRV_vkGetPhysicalDeviceProperties2(phys_dev, properties); +} + static const struct vulkan_funcs vulkan_funcs = { X11DRV_vkCreateInstance, @@ -557,6 +636,8 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkGetDeviceProcAddr, X11DRV_vkGetInstanceProcAddr, X11DRV_vkGetPhysicalDevicePresentRectanglesKHR, + X11DRV_vkGetPhysicalDeviceProperties2, + X11DRV_vkGetPhysicalDeviceProperties2KHR, X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR, X11DRV_vkGetPhysicalDeviceSurfacePresentModesKHR, diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index a5bc50325c..87ebd3d5a9 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -39,7 +39,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 7 +#define WINE_VULKAN_DRIVER_VERSION 8
struct vulkan_funcs { @@ -58,6 +58,8 @@ struct vulkan_funcs void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *); void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *); VkResult (*p_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *); + void (*p_vkGetPhysicalDeviceProperties2)(VkPhysicalDevice, VkPhysicalDeviceProperties2 *); + void (*p_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice, VkPhysicalDeviceProperties2 *); VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *); VkResult (*p_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *); VkResult (*p_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkPresentModeKHR *); @@ -116,6 +118,10 @@ static inline void *get_vulkan_driver_instance_proc_addr( return vulkan_funcs->p_vkGetInstanceProcAddr; if (!strcmp(name, "GetPhysicalDevicePresentRectanglesKHR")) return vulkan_funcs->p_vkGetPhysicalDevicePresentRectanglesKHR; + if (!strcmp(name, "GetPhysicalDeviceProperties2")) + return vulkan_funcs->p_vkGetPhysicalDeviceProperties2; + if (!strcmp(name, "GetPhysicalDeviceProperties2KHR")) + return vulkan_funcs->p_vkGetPhysicalDeviceProperties2KHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=45801
Your paranoid android.
=== debian9 (32 bit French report) ===
Report errors: : has no done line (or it is garbled)
=== debian9 (32 bit Japanese:Japan report) ===
Report errors: : has no done line (or it is garbled)
On Tue, Dec 18, 2018 at 5:25 PM Zhiyi Zhang zzhang@codeweavers.com wrote:
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com
dlls/vulkan-1/tests/vulkan.c | 4 +- dlls/winevulkan/make_vulkan | 6 ++- dlls/winex11.drv/vulkan.c | 81 ++++++++++++++++++++++++++++++++++++ include/wine/vulkan_driver.h | 8 +++- 4 files changed, 95 insertions(+), 4 deletions(-)
I think that this should be implemented in winevulkan instead. It isn't winex11-specific and I don't see a reason to duplicate it in every Wine graphics driver.
+static BOOL wine_get_adapter_luid(const GUID *uuid, LUID *luid) +{
- HDEVINFO devinfo;
- SP_DEVINFO_DATA devinfo_data = {sizeof(SP_DEVINFO_DATA)};
- DEVPROPTYPE property_type;
- GUID result;
- UINT i;
- devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT);
- if (devinfo == INVALID_HANDLE_VALUE)
return FALSE;
- for (i = 0; SetupDiEnumDeviceInfo(devinfo, i, &devinfo_data); ++i)
- {
property_type = DEVPROP_TYPE_UINT64;
if (!SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_UUID, &property_type,
(BYTE *)&result, sizeof(result), NULL, 0))
continue;
if (IsEqualGUID(&result, uuid))
{
if (SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_LUID, &property_type,
(BYTE *)luid, sizeof(*luid), NULL, 0))
return TRUE;
}
- }
You should call SetupDiDestroyDeviceInfoList().
+static void wine_fill_physical_device_id_luid(VkPhysicalDeviceProperties2 *properties) +{
- VkPhysicalDeviceIDProperties *id;
- struct wine_vk_structure_header *header;
- if (!properties->pNext)
return;
- for (header = properties->pNext; header; header = header->pNext)
- {
The if statement before the loop is redundant.
+static void X11DRV_vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{
- pvkGetPhysicalDeviceProperties2(phys_dev, properties);
- wine_fill_physical_device_id_luid(properties);
+}
+static void X11DRV_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{
- X11DRV_vkGetPhysicalDeviceProperties2(phys_dev, properties);
+}
You cannot assume that vkGetPhysicalDeviceProperties2() is available when vkGetPhysicalDeviceProperties2KHR() is called. We should call vkGetPhysicalDeviceProperties2KHR().
On 12/20/18 5:52 AM, Józef Kucia wrote:
On Tue, Dec 18, 2018 at 5:25 PM Zhiyi Zhang zzhang@codeweavers.com wrote:
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com
dlls/vulkan-1/tests/vulkan.c | 4 +- dlls/winevulkan/make_vulkan | 6 ++- dlls/winex11.drv/vulkan.c | 81 ++++++++++++++++++++++++++++++++++++ include/wine/vulkan_driver.h | 8 +++- 4 files changed, 95 insertions(+), 4 deletions(-)
I think that this should be implemented in winevulkan instead. It isn't winex11-specific and I don't see a reason to duplicate it in every Wine graphics driver.
Right. The reason for me thunk it in graphics driver is to avoid the host struct conversion code in winevulkan. But now that you mention the duplication in graphics driver, I guess thunking it in winevulkan would be better indeed. I already had a version for it.
+static BOOL wine_get_adapter_luid(const GUID *uuid, LUID *luid) +{
- HDEVINFO devinfo;
- SP_DEVINFO_DATA devinfo_data = {sizeof(SP_DEVINFO_DATA)};
- DEVPROPTYPE property_type;
- GUID result;
- UINT i;
- devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT);
- if (devinfo == INVALID_HANDLE_VALUE)
return FALSE;
- for (i = 0; SetupDiEnumDeviceInfo(devinfo, i, &devinfo_data); ++i)
- {
property_type = DEVPROP_TYPE_UINT64;
if (!SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_UUID, &property_type,
(BYTE *)&result, sizeof(result), NULL, 0))
continue;
if (IsEqualGUID(&result, uuid))
{
if (SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPROPKEY_DISPLAY_ADAPTER_LUID, &property_type,
(BYTE *)luid, sizeof(*luid), NULL, 0))
return TRUE;
}
- }
You should call SetupDiDestroyDeviceInfoList().
Thanks, missed this one.
+static void wine_fill_physical_device_id_luid(VkPhysicalDeviceProperties2 *properties) +{
- VkPhysicalDeviceIDProperties *id;
- struct wine_vk_structure_header *header;
- if (!properties->pNext)
return;
- for (header = properties->pNext; header; header = header->pNext)
- {
The if statement before the loop is redundant.
+static void X11DRV_vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{
- pvkGetPhysicalDeviceProperties2(phys_dev, properties);
- wine_fill_physical_device_id_luid(properties);
+}
+static void X11DRV_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev, VkPhysicalDeviceProperties2 *properties) +{
- X11DRV_vkGetPhysicalDeviceProperties2(phys_dev, properties);
+}
You cannot assume that vkGetPhysicalDeviceProperties2() is available when vkGetPhysicalDeviceProperties2KHR() is called. We should call vkGetPhysicalDeviceProperties2KHR().
Thanks for the heads up.