[PATCH 1/4] winevulkan: Thunk vkGetPhysicalDeviceProperties2 and vkGetPhysicalDeviceProperties2KHR.

Zhiyi Zhang zzhang at codeweavers.com
Mon Jun 15 09:06:47 CDT 2020



On 6/13/20 3:03 AM, Brendan Shanks wrote:
> HI Zhiyi,
>
>> On Jun 12, 2020, at 12:20 AM, Zhiyi Zhang <zzhang at codeweavers.com> wrote:
>>
>> So that user graphics drivers can fill in LUID property.
>>
>> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
>> ---
>> dlls/winemac.drv/vulkan.c    | 66 +++++++++++++++++++++++++-----------
>> dlls/winevulkan/make_vulkan  |  4 ++-
>> dlls/winex11.drv/vulkan.c    | 65 ++++++++++++++++++++++++-----------
>> include/wine/vulkan_driver.h |  8 ++++-
>> 4 files changed, 101 insertions(+), 42 deletions(-)
>>
>> diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
>> index 1dee769836f..36de61501cb 100755
>> --- a/dlls/winevulkan/make_vulkan
>> +++ b/dlls/winevulkan/make_vulkan
>> @@ -138,7 +138,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 = 8
>> +DRIVER_VERSION = 9
>>
>> # Table of functions for which we have a special implementation.
>> # These are regular device / instance functions for which we need
>> @@ -165,6 +165,8 @@ FUNCTION_OVERRIDES = {
>>     "vkGetPhysicalDeviceExternalFenceProperties" : {"dispatch" : False, "driver" : False, "thunk" : False},
>>     "vkGetPhysicalDeviceExternalSemaphoreProperties" : {"dispatch" : False, "driver" : False, "thunk" : False},
>>     "vkGetPhysicalDeviceImageFormatProperties2" : {"dispatch" : True, "driver" : False, "thunk" : True, "private_thunk" : True},
>> +    "vkGetPhysicalDeviceProperties2" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> +    "vkGetPhysicalDeviceProperties2KHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
> Just an idea:
> What if vkGetRandROutputDisplayEXT() and vkGetPhysicalDeviceProperties2() were called when discovering GPUs (like in xrandr14_get_gpus()), and the returned deviceUUID was stored in SetupAPI for each GPU.
> Then the Vulkan thunks would take the deviceUUID returned from the system driver, search SetupAPI for it, and get the corresponding GPU LUID. I’m not sure if it would be much simpler, but would avoid having to extend the driver interface.
Seems like a good idea. I will give it a try. Thanks.

>
>>     # Device functions
>>     "vkAllocateCommandBuffers" : {"dispatch" : True, "driver" : False, "thunk" : False},
>> diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
>> index 4de82586906..c988b1a6b27 100644
>> --- a/dlls/winex11.drv/vulkan.c
>> +++ b/dlls/winex11.drv/vulkan.c
>> @@ -84,6 +84,8 @@ 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 void (*pvkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice, VkPhysicalDeviceProperties2 *);
>> static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *);
>> static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *);
>> static VkResult (*pvkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *);
>> @@ -123,6 +125,8 @@ static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context)
>>     LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties);
>>     LOAD_FUNCPTR(vkGetDeviceProcAddr);
>>     LOAD_FUNCPTR(vkGetInstanceProcAddr);
>> +    LOAD_FUNCPTR(vkGetPhysicalDeviceProperties2);
>> +    LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceProperties2KHR);
>>     LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilities2KHR);
>>     LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
>>     LOAD_OPTIONAL_FUNCPTR(vkGetPhysicalDeviceSurfaceFormats2KHR);
>> @@ -459,6 +463,25 @@ static VkResult X11DRV_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice
>>     return pvkGetPhysicalDevicePresentRectanglesKHR(phys_dev, x11_surface->surface, count, rects);
>> }
>>
>> +static void X11DRV_vkGetPhysicalDeviceProperties2(VkPhysicalDevice phys_dev,
>> +        VkPhysicalDeviceProperties2 *properties)
>> +{
>> +    TRACE("%p, %p\n", phys_dev, properties);
>> +
>> +    pvkGetPhysicalDeviceProperties2(phys_dev, properties);
>> +}
>> +
>> +static void X11DRV_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice phys_dev,
>> +        VkPhysicalDeviceProperties2 *properties)
>> +{
>> +    TRACE("%p, %p\n", phys_dev, properties);
>> +
>> +    if (pvkGetPhysicalDeviceProperties2KHR)
>> +        pvkGetPhysicalDeviceProperties2KHR(phys_dev, properties);
>> +    else
>> +        pvkGetPhysicalDeviceProperties2(phys_dev, properties);
>> +}
>> +
>> static VkResult X11DRV_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice phys_dev,
>>         const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, VkSurfaceCapabilities2KHR *capabilities)
>> {
>> @@ -603,26 +626,28 @@ static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *
>>
>> static const struct vulkan_funcs vulkan_funcs =
>> {
>> -    X11DRV_vkCreateInstance,
>> -    X11DRV_vkCreateSwapchainKHR,
>> -    X11DRV_vkCreateWin32SurfaceKHR,
>> -    X11DRV_vkDestroyInstance,
>> -    X11DRV_vkDestroySurfaceKHR,
>> -    X11DRV_vkDestroySwapchainKHR,
>> -    X11DRV_vkEnumerateInstanceExtensionProperties,
>> -    X11DRV_vkGetDeviceGroupSurfacePresentModesKHR,
>> -    X11DRV_vkGetDeviceProcAddr,
>> -    X11DRV_vkGetInstanceProcAddr,
>> -    X11DRV_vkGetPhysicalDevicePresentRectanglesKHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfaceCapabilities2KHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfaceFormats2KHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfacePresentModesKHR,
>> -    X11DRV_vkGetPhysicalDeviceSurfaceSupportKHR,
>> -    X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR,
>> -    X11DRV_vkGetSwapchainImagesKHR,
>> -    X11DRV_vkQueuePresentKHR,
>> +    .p_vkCreateInstance = X11DRV_vkCreateInstance,
>> +    .p_vkCreateSwapchainKHR = X11DRV_vkCreateSwapchainKHR,
>> +    .p_vkCreateWin32SurfaceKHR = X11DRV_vkCreateWin32SurfaceKHR,
>> +    .p_vkDestroyInstance = X11DRV_vkDestroyInstance,
>> +    .p_vkDestroySurfaceKHR = X11DRV_vkDestroySurfaceKHR,
>> +    .p_vkDestroySwapchainKHR = X11DRV_vkDestroySwapchainKHR,
>> +    .p_vkEnumerateInstanceExtensionProperties = X11DRV_vkEnumerateInstanceExtensionProperties,
>> +    .p_vkGetDeviceGroupSurfacePresentModesKHR = X11DRV_vkGetDeviceGroupSurfacePresentModesKHR,
>> +    .p_vkGetDeviceProcAddr = X11DRV_vkGetDeviceProcAddr,
>> +    .p_vkGetInstanceProcAddr = X11DRV_vkGetInstanceProcAddr,
>> +    .p_vkGetPhysicalDevicePresentRectanglesKHR = X11DRV_vkGetPhysicalDevicePresentRectanglesKHR,
>> +    .p_vkGetPhysicalDeviceProperties2 = X11DRV_vkGetPhysicalDeviceProperties2,
>> +    .p_vkGetPhysicalDeviceProperties2KHR = X11DRV_vkGetPhysicalDeviceProperties2KHR,
>> +    .p_vkGetPhysicalDeviceSurfaceCapabilities2KHR = X11DRV_vkGetPhysicalDeviceSurfaceCapabilities2KHR,
>> +    .p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR,
>> +    .p_vkGetPhysicalDeviceSurfaceFormats2KHR = X11DRV_vkGetPhysicalDeviceSurfaceFormats2KHR,
>> +    .p_vkGetPhysicalDeviceSurfaceFormatsKHR = X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR,
>> +    .p_vkGetPhysicalDeviceSurfacePresentModesKHR = X11DRV_vkGetPhysicalDeviceSurfacePresentModesKHR,
>> +    .p_vkGetPhysicalDeviceSurfaceSupportKHR = X11DRV_vkGetPhysicalDeviceSurfaceSupportKHR,
>> +    .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR,
>> +    .p_vkGetSwapchainImagesKHR = X11DRV_vkGetSwapchainImagesKHR,
>> +    .p_vkQueuePresentKHR = X11DRV_vkQueuePresentKHR,
>> };
> I'm in favor of C99 designated initializers but I don’t think I've seen them used anywhere else in Wine, are they allowed? If so, I think the change should go in a separate commit though.
They are being used, for example, in wined3d_adapter_vk_ops in wined3d/adapter_vk.c.

> Brendan




More information about the wine-devel mailing list