[PATCH 1/5] winevulkan/winex11: Add VK_KHR_display stub implementation.

Roderick Colenbrander thunderbird2k at gmail.com
Tue Mar 27 18:04:22 CDT 2018


On Tue, Mar 27, 2018 at 3:35 PM, Józef Kucia <joseph.kucia at gmail.com> wrote:
> What is the main reason for this patch? I expect it wasn't written to
> implement VK_KHR_display extensions. If it was written just to make
> forwarding in vulkan-1.dll easier I think we should drop it. I don't
> like adding a lot of stubs to Wine graphics drivers which aren't going
> implemented any time soon. Also, advertising VK_KHR_display as
> supported doesn't seem right when we have just stubs.
>
> I think there are multiple ways to avoid this patch. We can generate
> stub entries in vulkan-1.spec for not implemented functions, or
> generate stub functions in vulkan_thunks.c for not implemented
> functions (we have stub() method in the make_vulkan script).

Correct, the main reason was to create a somewhat complete vulkan-1 as
the native version provides the VK_KHR_display entry points. I can
leave them as just stubs in .spec, but doing anything more requires
all the data types for vulkan_thunks.c to compile.

Ultimately I felt it was good to have at least proper thunks in
vulkan-1, but currently data types get pulled in through required
functionality in winevulkan. I can try changing hacking the thunk
generation code a bit and fall back to a regular stub.

We could drop the patch for now and I can think of another way.

> On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander
> <thunderbird2k at gmail.com> wrote:
>> Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
>> ---
>>  dlls/winevulkan/make_vulkan     |  14 +-
>>  dlls/winevulkan/vulkan.c        | 117 +++++
>>  dlls/winevulkan/vulkan_thunks.c |  59 +++
>>  dlls/winevulkan/vulkan_thunks.h |  70 +++
>>  dlls/winex11.drv/vulkan.c       |  77 +++-
>>  include/wine/vulkan.h           | 952 ++++++++++++++++++++++------------------
>>  include/wine/vulkan_driver.h    |   9 +-
>>  7 files changed, 861 insertions(+), 437 deletions(-)
>>
>> diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
>> index 2858309c06..bb02b2aa92 100755
>> --- a/dlls/winevulkan/make_vulkan
>> +++ b/dlls/winevulkan/make_vulkan
>> @@ -80,6 +80,7 @@ EXT_BLOCK_SIZE = 1000
>>  # and need custom wrappers due to e.g. win32 / X11 specific code.
>>  # List of supported instance extensions.
>>  SUPPORTED_INSTANCE_EXTENSIONS = [
>> +    "VK_KHR_display",
>>      "VK_KHR_get_physical_device_properties2",
>>      "VK_KHR_surface",
>>      "VK_KHR_win32_surface",
>> @@ -95,7 +96,7 @@ BLACKLISTED_EXTENSIONS = [
>>      "VK_EXT_display_control", # Requires VK_EXT_display_surface_counter
>>      "VK_EXT_hdr_metadata", # Needs WSI work.
>>      "VK_GOOGLE_display_timing",
>> -    "VK_KHR_display", # Needs WSI work.
>> +    "VK_KHR_display_swapchain",
>>      "VK_KHR_external_fence_fd",
>>      "VK_KHR_external_fence_win32",
>>      "VK_KHR_external_memory",
>> @@ -109,7 +110,7 @@ BLACKLISTED_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 = 3
>> +DRIVER_VERSION = 4
>>
>>  # Table of functions for which we have a special implementation.
>>  # This are regular device / instance functions for which we need
>> @@ -140,6 +141,15 @@ FUNCTION_OVERRIDES = {
>>      "vkGetDeviceQueue" : {"dispatch": True, "driver" : False, "thunk" : False},
>>      "vkQueueSubmit" : {"dispatch": True, "driver" : False, "thunk" : False},
>>
>> +    # VK_KHR_display
>> +    "vkCreateDisplayModeKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> +    "vkCreateDisplayPlaneSurfaceKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> +    "vkGetDisplayModePropertiesKHR" : {"dispatch" : True, "driver" : True, "thunk" : False},
>> +    "vkGetDisplayPlaneCapabilitiesKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> +    "vkGetDisplayPlaneSupportedDisplaysKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> +    "vkGetPhysicalDeviceDisplayPropertiesKHR" : {"dispatch" : True, "driver" : True, "thunk" : False},
>> +    "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" : {"dispatch" : True, "driver" : True, "thunk" : False},
>> +
>>      # VK_KHR_surface
>>      "vkDestroySurfaceKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>>      "vkGetPhysicalDeviceSurfaceSupportKHR" : {"dispatch" : True, "driver" : True, "thunk" : True},
>> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
>> index ad1a35c934..809fd7203c 100644
>> --- a/dlls/winevulkan/vulkan.c
>> +++ b/dlls/winevulkan/vulkan.c
>> @@ -861,6 +861,123 @@ void WINAPI wine_vkGetDeviceQueue(VkDevice device, uint32_t family_index,
>>      *queue = &device->queues[family_index][queue_index];
>>  }
>>
>> +VkResult WINAPI wine_vkGetDisplayModePropertiesKHR(VkPhysicalDevice phys_dev,
>> +        VkDisplayKHR display, uint32_t *count, VkDisplayModePropertiesKHR *properties)
>> +{
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult result;
>> +    VkDisplayModePropertiesKHR_host *properties_host = NULL;
>> +    TRACE("%p, 0x%s, %p, %p\n", phys_dev, wine_dbgstr_longlong(display), count, properties);
>> +
>> +    if (properties)
>> +    {
>> +        properties_host = heap_calloc(*count, sizeof(*properties_host));
>> +        if (!properties_host)
>> +            return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +    }
>> +
>> +    result = phys_dev->instance->funcs.p_vkGetDisplayModePropertiesKHR(phys_dev->phys_dev,
>> +            display, count, properties_host);
>> +
>> +    if (properties_host && (result == VK_SUCCESS || result == VK_INCOMPLETE))
>> +    {
>> +        unsigned int i;
>> +        for (i = 0; i < *count; i++)
>> +        {
>> +            properties[i].displayMode = properties_host[i].displayMode;
>> +            properties[i].parameters = properties_host[i].parameters;
>> +        }
>> +    }
>> +
>> +    heap_free(properties_host);
>> +    return result;
>> +#else
>> +    TRACE("%p, 0x%s, %p, %p\n", phys_dev, wine_dbgstr_longlong(display), count, properties);
>> +    return phys_dev->instance->funcs.p_vkGetDisplayModePropertiesKHR(phys_dev->phys_dev,
>> +            display, count, properties);
>> +#endif
>> +}
>> +
>> +VkResult WINAPI wine_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice phys_dev,
>> +        uint32_t *count, VkDisplayPlanePropertiesKHR *properties)
>> +{
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult result;
>> +    VkDisplayPlanePropertiesKHR_host *properties_host = NULL;
>> +    TRACE("%p, %p, %p\n", phys_dev, count, properties);
>> +
>> +    if (properties)
>> +    {
>> +        properties_host = heap_calloc(*count, sizeof(*properties_host));
>> +        if (!properties_host)
>> +            return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +    }
>> +
>> +    result = phys_dev->instance->funcs.p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev->phys_dev,
>> +            count, properties_host);
>> +
>> +    if (properties_host && (result == VK_SUCCESS || result == VK_INCOMPLETE))
>> +    {
>> +        unsigned int i;
>> +        for (i = 0; i < *count; i++)
>> +        {
>> +            properties[i].currentDisplay = properties_host[i].currentDisplay;
>> +            properties[i].currentStackIndex = properties_host[i].currentStackIndex;
>> +        }
>> +    }
>> +
>> +    heap_free(properties_host);
>> +    return result;
>> +#else
>> +    TRACE("%p, %p, %p\n", phys_dev, count, properties);
>> +    return phys_dev->instance->funcs.p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(phys_dev->phys_dev,
>> +            count, properties);
>> +#endif
>> +}
>
> What is the main reason that prevents us from autogenerating thunks
> for vkGetDisplayModePropertiesKHR() and
> vkGetPhysicalDeviceDisplayPlanePropertiesKHR()?

The main issue is automatically detecting functions with 'count' and
multi-pass behavior. So far I can just blindly parse parameters and
check if any conversion is needed. These nasty ones, need memory
allocation.

I could maybe store a list of these nasty functions.

>> +
>> +VkResult WINAPI wine_vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice phys_dev,
>> +        uint32_t *count, VkDisplayPropertiesKHR *properties)
>> +{
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult result;
>> +    VkDisplayPropertiesKHR_host *properties_host = NULL;
>> +    TRACE("%p, %p, %p\n", phys_dev, count, properties);
>> +
>> +    if (properties)
>> +    {
>> +        properties_host = heap_calloc(*count, sizeof(*properties_host));
>> +        if (!properties_host)
>> +            return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +    }
>> +
>> +    result = phys_dev->instance->funcs.p_vkGetPhysicalDeviceDisplayPropertiesKHR(phys_dev->phys_dev,
>> +            count, properties_host);
>> +
>> +    if (properties_host && (result == VK_SUCCESS || result == VK_INCOMPLETE))
>> +    {
>> +        unsigned int i;
>> +        for (i = 0; i < *count; i++)
>> +        {
>> +            properties[i].display = properties_host[i].display;
>> +            properties[i].displayName = properties_host[i].displayName;
>> +            properties[i].physicalDimensions = properties_host[i].physicalDimensions;
>> +            properties[i].physicalResolution = properties_host[i].physicalResolution;
>> +            properties[i].supportedTransforms = properties_host[i].supportedTransforms;
>> +            properties[i].planeReorderPossible = properties_host[i].planeReorderPossible;
>> +            properties[i].persistentContent = properties_host[i].persistentContent;
>> +        }
>> +    }
>> +
>> +    heap_free(properties_host);
>> +    return result;
>> +#else
>> +    TRACE("%p, %p, %p\n", phys_dev, count, properties);
>> +    return phys_dev->instance->funcs.p_vkGetPhysicalDeviceDisplayPropertiesKHR(phys_dev->phys_dev,
>> +            count, properties);
>> +#endif
>> +}
>> +
>> +
>>  static PFN_vkVoidFunction WINAPI wine_vkGetInstanceProcAddr(VkInstance instance, const char *name)
>>  {
>>      void *func;
>> diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c
>> index 2f2b8c196f..40e7f76c8f 100644
>> --- a/dlls/winevulkan/vulkan_thunks.c
>> +++ b/dlls/winevulkan/vulkan_thunks.c
>> @@ -381,6 +381,22 @@ static inline void convert_VkDescriptorUpdateTemplateCreateInfoKHR_win_to_host(c
>>      out->set = in->set;
>>  }
>>
>> +static inline void convert_VkDisplaySurfaceCreateInfoKHR_win_to_host(const VkDisplaySurfaceCreateInfoKHR *in, VkDisplaySurfaceCreateInfoKHR_host *out)
>> +{
>> +    if (!in) return;
>> +
>> +    out->sType = in->sType;
>> +    out->pNext = in->pNext;
>> +    out->flags = in->flags;
>> +    out->displayMode = in->displayMode;
>> +    out->planeIndex = in->planeIndex;
>> +    out->planeStackIndex = in->planeStackIndex;
>> +    out->transform = in->transform;
>> +    out->globalAlpha = in->globalAlpha;
>> +    out->alphaMode = in->alphaMode;
>> +    out->imageExtent = in->imageExtent;
>> +}
>> +
>>  static inline void convert_VkFramebufferCreateInfo_win_to_host(const VkFramebufferCreateInfo *in, VkFramebufferCreateInfo_host *out)
>>  {
>>      if (!in) return;
>> @@ -1518,6 +1534,29 @@ static VkResult WINAPI wine_vkCreateDescriptorUpdateTemplateKHR(VkDevice device,
>>  #endif
>>  }
>>
>> +static VkResult WINAPI wine_vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode)
>> +{
>> +    TRACE("%p, 0x%s, %p, %p, %p\n", physicalDevice, wine_dbgstr_longlong(display), pCreateInfo, pAllocator, pMode);
>> +    return physicalDevice->instance->funcs.p_vkCreateDisplayModeKHR(physicalDevice->phys_dev, display, pCreateInfo, NULL, pMode);
>> +}
>> +
>> +static VkResult WINAPI wine_vkCreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface)
>> +{
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult result;
>> +    VkDisplaySurfaceCreateInfoKHR_host pCreateInfo_host;
>> +    TRACE("%p, %p, %p, %p\n", instance, pCreateInfo, pAllocator, pSurface);
>> +
>> +    convert_VkDisplaySurfaceCreateInfoKHR_win_to_host(pCreateInfo, &pCreateInfo_host);
>> +    result = instance->funcs.p_vkCreateDisplayPlaneSurfaceKHR(instance->instance, &pCreateInfo_host, NULL, pSurface);
>> +
>> +    return result;
>> +#else
>> +    TRACE("%p, %p, %p, %p\n", instance, pCreateInfo, pAllocator, pSurface);
>> +    return instance->funcs.p_vkCreateDisplayPlaneSurfaceKHR(instance->instance, pCreateInfo, NULL, pSurface);
>> +#endif
>> +}
>> +
>>  static VkResult WINAPI wine_vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent)
>>  {
>>      TRACE("%p, %p, %p, %p\n", device, pCreateInfo, pAllocator, pEvent);
>> @@ -1848,6 +1887,18 @@ static void WINAPI wine_vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMem
>>      device->funcs.p_vkGetDeviceMemoryCommitment(device->device, memory, pCommittedMemoryInBytes);
>>  }
>>
>> +static VkResult WINAPI wine_vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities)
>> +{
>> +    TRACE("%p, 0x%s, %u, %p\n", physicalDevice, wine_dbgstr_longlong(mode), planeIndex, pCapabilities);
>> +    return physicalDevice->instance->funcs.p_vkGetDisplayPlaneCapabilitiesKHR(physicalDevice->phys_dev, mode, planeIndex, pCapabilities);
>> +}
>> +
>> +static VkResult WINAPI wine_vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t *pDisplayCount, VkDisplayKHR *pDisplays)
>> +{
>> +    TRACE("%p, %u, %p, %p\n", physicalDevice, planeIndex, pDisplayCount, pDisplays);
>> +    return physicalDevice->instance->funcs.p_vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice->phys_dev, planeIndex, pDisplayCount, pDisplays);
>> +}
>> +
>>  static VkResult WINAPI wine_vkGetEventStatus(VkDevice device, VkEvent event)
>>  {
>>      TRACE("%p, 0x%s\n", device, wine_dbgstr_longlong(event));
>> @@ -2377,12 +2428,19 @@ static const struct vulkan_func vk_device_dispatch_table[] =
>>  static const struct vulkan_func vk_instance_dispatch_table[] =
>>  {
>>      {"vkCreateDevice", &wine_vkCreateDevice},
>> +    {"vkCreateDisplayModeKHR", &wine_vkCreateDisplayModeKHR},
>> +    {"vkCreateDisplayPlaneSurfaceKHR", &wine_vkCreateDisplayPlaneSurfaceKHR},
>>      {"vkCreateWin32SurfaceKHR", &wine_vkCreateWin32SurfaceKHR},
>>      {"vkDestroyInstance", &wine_vkDestroyInstance},
>>      {"vkDestroySurfaceKHR", &wine_vkDestroySurfaceKHR},
>>      {"vkEnumerateDeviceExtensionProperties", &wine_vkEnumerateDeviceExtensionProperties},
>>      {"vkEnumerateDeviceLayerProperties", &wine_vkEnumerateDeviceLayerProperties},
>>      {"vkEnumeratePhysicalDevices", &wine_vkEnumeratePhysicalDevices},
>> +    {"vkGetDisplayModePropertiesKHR", &wine_vkGetDisplayModePropertiesKHR},
>> +    {"vkGetDisplayPlaneCapabilitiesKHR", &wine_vkGetDisplayPlaneCapabilitiesKHR},
>> +    {"vkGetDisplayPlaneSupportedDisplaysKHR", &wine_vkGetDisplayPlaneSupportedDisplaysKHR},
>> +    {"vkGetPhysicalDeviceDisplayPlanePropertiesKHR", &wine_vkGetPhysicalDeviceDisplayPlanePropertiesKHR},
>> +    {"vkGetPhysicalDeviceDisplayPropertiesKHR", &wine_vkGetPhysicalDeviceDisplayPropertiesKHR},
>>      {"vkGetPhysicalDeviceFeatures", &wine_vkGetPhysicalDeviceFeatures},
>>      {"vkGetPhysicalDeviceFeatures2KHR", &wine_vkGetPhysicalDeviceFeatures2KHR},
>>      {"vkGetPhysicalDeviceFormatProperties", &wine_vkGetPhysicalDeviceFormatProperties},
>> @@ -2467,6 +2525,7 @@ static const char * const vk_device_extensions[] =
>>
>>  static const char * const vk_instance_extensions[] =
>>  {
>> +    "VK_KHR_display",
>
> We don't support this extension.

I want it to depend on the intersection with winex11.drv, but indeed
in winex11.drv there is no way to 'blacklist' extensions. Something
like that might be needed long-term if different Wine graphics may
have slightly different features.

>>      "VK_KHR_get_physical_device_properties2",
>>      "VK_KHR_surface",
>>      "VK_KHR_win32_surface",
>> diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h
>> index fb9afdf524..00495d72c0 100644
>> --- a/dlls/winevulkan/vulkan_thunks.h
>> +++ b/dlls/winevulkan/vulkan_thunks.h
>> @@ -26,6 +26,9 @@ VkResult WINAPI wine_vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *p
>>  void WINAPI wine_vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) DECLSPEC_HIDDEN;
>>  PFN_vkVoidFunction WINAPI wine_vkGetDeviceProcAddr(VkDevice device, const char *pName) DECLSPEC_HIDDEN;
>>  void WINAPI wine_vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) DECLSPEC_HIDDEN;
>> +VkResult WINAPI wine_vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) DECLSPEC_HIDDEN;
>> +VkResult WINAPI wine_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties) DECLSPEC_HIDDEN;
>> +VkResult WINAPI wine_vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties) DECLSPEC_HIDDEN;
>>  VkResult WINAPI wine_vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) DECLSPEC_HIDDEN;
>>
>>  typedef struct VkCommandBufferAllocateInfo_host
>> @@ -216,6 +219,20 @@ typedef struct VkDescriptorUpdateTemplateCreateInfoKHR_host
>>      uint32_t set;
>>  } VkDescriptorUpdateTemplateCreateInfoKHR_host;
>>
>> +typedef struct VkDisplaySurfaceCreateInfoKHR_host
>> +{
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkDisplaySurfaceCreateFlagsKHR flags;
>> +    VkDisplayModeKHR displayMode;
>> +    uint32_t planeIndex;
>> +    uint32_t planeStackIndex;
>> +    VkSurfaceTransformFlagBitsKHR transform;
>> +    float globalAlpha;
>> +    VkDisplayPlaneAlphaFlagBitsKHR alphaMode;
>> +    VkExtent2D imageExtent;
>> +} VkDisplaySurfaceCreateInfoKHR_host;
>> +
>>  typedef struct VkFramebufferCreateInfo_host
>>  {
>>      VkStructureType sType;
>> @@ -302,6 +319,12 @@ typedef struct VkMemoryRequirements_host
>>      uint32_t memoryTypeBits;
>>  } VkMemoryRequirements_host;
>>
>> +typedef struct VkDisplayModePropertiesKHR_host
>> +{
>> +    VkDisplayModeKHR displayMode;
>> +    VkDisplayModeParametersKHR parameters;
>> +} VkDisplayModePropertiesKHR_host;
>> +
>>  typedef struct VkSubresourceLayout_host
>>  {
>>      VkDeviceSize offset;
>> @@ -311,6 +334,23 @@ typedef struct VkSubresourceLayout_host
>>      VkDeviceSize depthPitch;
>>  } VkSubresourceLayout_host;
>>
>> +typedef struct VkDisplayPlanePropertiesKHR_host
>> +{
>> +    VkDisplayKHR currentDisplay;
>> +    uint32_t currentStackIndex;
>> +} VkDisplayPlanePropertiesKHR_host;
>> +
>> +typedef struct VkDisplayPropertiesKHR_host
>> +{
>> +    VkDisplayKHR display;
>> +    const char *displayName;
>> +    VkExtent2D physicalDimensions;
>> +    VkExtent2D physicalResolution;
>> +    VkSurfaceTransformFlagsKHR supportedTransforms;
>> +    VkBool32 planeReorderPossible;
>> +    VkBool32 persistentContent;
>> +} VkDisplayPropertiesKHR_host;
>> +
>>  typedef struct VkImageFormatProperties_host
>>  {
>>      VkExtent3D maxExtent;
>> @@ -796,11 +836,34 @@ struct vulkan_device_funcs
>>  struct vulkan_instance_funcs
>>  {
>>      VkResult (*p_vkCreateDevice)(VkPhysicalDevice, const VkDeviceCreateInfo *, const VkAllocationCallbacks *, VkDevice *);
>> +    VkResult (*p_vkCreateDisplayModeKHR)(VkPhysicalDevice, VkDisplayKHR, const VkDisplayModeCreateInfoKHR *, const VkAllocationCallbacks *, VkDisplayModeKHR *);
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult (*p_vkCreateDisplayPlaneSurfaceKHR)(VkInstance, const VkDisplaySurfaceCreateInfoKHR_host *, const VkAllocationCallbacks *, VkSurfaceKHR *);
>> +#else
>> +    VkResult (*p_vkCreateDisplayPlaneSurfaceKHR)(VkInstance, const VkDisplaySurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *);
>> +#endif
>>      VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *);
>>      void (*p_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *);
>>      VkResult (*p_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice, const char *, uint32_t *, VkExtensionProperties *);
>>      VkResult (*p_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice, uint32_t *, VkLayerProperties *);
>>      VkResult (*p_vkEnumeratePhysicalDevices)(VkInstance, uint32_t *, VkPhysicalDevice *);
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult (*p_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice, VkDisplayKHR, uint32_t *, VkDisplayModePropertiesKHR_host *);
>> +#else
>> +    VkResult (*p_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice, VkDisplayKHR, uint32_t *, VkDisplayModePropertiesKHR *);
>> +#endif
>> +    VkResult (*p_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDevice, VkDisplayModeKHR, uint32_t, VkDisplayPlaneCapabilitiesKHR *);
>> +    VkResult (*p_vkGetDisplayPlaneSupportedDisplaysKHR)(VkPhysicalDevice, uint32_t, uint32_t *, VkDisplayKHR *);
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPlanePropertiesKHR_host *);
>> +#else
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPlanePropertiesKHR *);
>> +#endif
>> +#if defined(USE_STRUCT_CONVERSION)
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPropertiesKHR_host *);
>> +#else
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPropertiesKHR *);
>> +#endif
>>      void (*p_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice, VkPhysicalDeviceFeatures *);
>>      void (*p_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice, VkPhysicalDeviceFeatures2KHR *);
>>      void (*p_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice, VkFormat, VkFormatProperties *);
>> @@ -985,11 +1048,18 @@ struct vulkan_instance_funcs
>>
>>  #define ALL_VK_INSTANCE_FUNCS() \
>>      USE_VK_FUNC(vkCreateDevice) \
>> +    USE_VK_FUNC(vkCreateDisplayModeKHR) \
>> +    USE_VK_FUNC(vkCreateDisplayPlaneSurfaceKHR) \
>>      USE_VK_FUNC(vkCreateWin32SurfaceKHR) \
>>      USE_VK_FUNC(vkDestroySurfaceKHR) \
>>      USE_VK_FUNC(vkEnumerateDeviceExtensionProperties) \
>>      USE_VK_FUNC(vkEnumerateDeviceLayerProperties) \
>>      USE_VK_FUNC(vkEnumeratePhysicalDevices) \
>> +    USE_VK_FUNC(vkGetDisplayModePropertiesKHR) \
>> +    USE_VK_FUNC(vkGetDisplayPlaneCapabilitiesKHR) \
>> +    USE_VK_FUNC(vkGetDisplayPlaneSupportedDisplaysKHR) \
>> +    USE_VK_FUNC(vkGetPhysicalDeviceDisplayPlanePropertiesKHR) \
>> +    USE_VK_FUNC(vkGetPhysicalDeviceDisplayPropertiesKHR) \
>>      USE_VK_FUNC(vkGetPhysicalDeviceFeatures) \
>>      USE_VK_FUNC(vkGetPhysicalDeviceFeatures2KHR) \
>>      USE_VK_FUNC(vkGetPhysicalDeviceFormatProperties) \
>> diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
>> index c633579286..deefe67fdc 100644
>> --- a/dlls/winex11.drv/vulkan.c
>> +++ b/dlls/winex11.drv/vulkan.c
>> @@ -233,6 +233,23 @@ static VkResult X11DRV_vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swa
>>      return pvkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, index);
>>  }
>>
>> +static VkResult X11DRV_vkCreateDisplayModeKHR(VkPhysicalDevice phys_dev,
>> +        VkDisplayKHR display, const VkDisplayModeCreateInfoKHR *create_info,
>> +        const VkAllocationCallbacks *allocator, VkDisplayModeKHR *mode)
>> +{
>> +    FIXME("stub: %p 0x%s %p %p %p\n", phys_dev, wine_dbgstr_longlong(display),
>> +            create_info, allocator, mode);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>> +static VkResult X11DRV_vkCreateDisplayPlaneSurfaceKHR(VkInstance instance,
>> +        const VkDisplaySurfaceCreateInfoKHR *create_info,
>> +        const VkAllocationCallbacks *allocator, VkSurfaceKHR *surface)
>> +{
>> +    FIXME("stub: %p %p %p %p\n", instance, create_info, allocator, surface);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>>  static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *create_info,
>>          const VkAllocationCallbacks *allocator, VkInstance *instance)
>>  {
>> @@ -410,7 +427,30 @@ static void *X11DRV_vkGetDeviceProcAddr(VkDevice device, const char *name)
>>      return pvkGetDeviceProcAddr(device, name);
>>  }
>>
>> -static void *X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char *name)
>> +static VkResult X11DRV_vkGetDisplayModePropertiesKHR(VkPhysicalDevice phys_dev,
>> +        VkDisplayKHR display, uint32_t *count, VkDisplayModePropertiesKHR *properties)
>> +{
>> +    FIXME("stub: %p 0x%s %p %p\n", phys_dev, wine_dbgstr_longlong(display), count,
>> +            properties);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>> +static VkResult X11DRV_vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice phys_dev,
>> +        VkDisplayModeKHR mode, uint32_t index, VkDisplayPlaneCapabilitiesKHR *capabilities)
>> +{
>> +    FIXME("stub: %p 0x%s %u %p\n", phys_dev, wine_dbgstr_longlong(mode), index,
>> +            capabilities);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>> +static VkResult X11DRV_vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice phys_dev,
>> +        uint32_t index, uint32_t *count, VkDisplayKHR *displays)
>> +{
>> +    FIXME("stub: %p %u %p %p\n", phys_dev, index, count, displays);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>> +static void * X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char *name)
>>  {
>>      void *proc_addr;
>>
>> @@ -422,6 +462,20 @@ static void *X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char *name)
>>      return pvkGetInstanceProcAddr(instance, name);
>>  }
>>
>> +static VkResult X11DRV_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice phys_dev,
>> +        uint32_t *count, VkDisplayPlanePropertiesKHR *properties)
>> +{
>> +    FIXME("stub: %p %p %p\n", phys_dev, count, properties);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>> +static VkResult X11DRV_vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice phys_dev,
>> +        uint32_t *count, VkDisplayPropertiesKHR *properties)
>> +{
>> +    FIXME("stub: %p %p %p\n", phys_dev, count, properties);
>> +    return VK_ERROR_OUT_OF_HOST_MEMORY;
>> +}
>> +
>>  static VkResult X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev,
>>          VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities)
>>  {
>> @@ -491,6 +545,8 @@ static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *
>>  static const struct vulkan_funcs vulkan_funcs =
>>  {
>>      X11DRV_vkAcquireNextImageKHR,
>> +    X11DRV_vkCreateDisplayModeKHR,
>> +    X11DRV_vkCreateDisplayPlaneSurfaceKHR,
>>      X11DRV_vkCreateInstance,
>>      X11DRV_vkCreateSwapchainKHR,
>>      X11DRV_vkCreateWin32SurfaceKHR,
>> @@ -499,7 +555,12 @@ static const struct vulkan_funcs vulkan_funcs =
>>      X11DRV_vkDestroySwapchainKHR,
>>      X11DRV_vkEnumerateInstanceExtensionProperties,
>>      X11DRV_vkGetDeviceProcAddr,
>> +    X11DRV_vkGetDisplayModePropertiesKHR,
>> +    X11DRV_vkGetDisplayPlaneCapabilitiesKHR,
>> +    X11DRV_vkGetDisplayPlaneSupportedDisplaysKHR,
>>      X11DRV_vkGetInstanceProcAddr,
>> +    X11DRV_vkGetPhysicalDeviceDisplayPlanePropertiesKHR,
>> +    X11DRV_vkGetPhysicalDeviceDisplayPropertiesKHR,
>>      X11DRV_vkGetPhysicalDeviceSurfaceCapabilitiesKHR,
>>      X11DRV_vkGetPhysicalDeviceSurfaceFormatsKHR,
>>      X11DRV_vkGetPhysicalDeviceSurfacePresentModesKHR,
>> @@ -525,14 +586,28 @@ static void *get_vulkan_driver_instance_proc_addr(const struct vulkan_funcs *vul
>>      if (!instance)
>>          return NULL;
>>
>> +    if (!strcmp(name, "vkCreateDisplayModeKHR"))
>> +        return vulkan_funcs->p_vkCreateDisplayModeKHR;
>
> The "vk" prefix has to be removed from strings in strcmp() in order
> for this to work.
>
>> +    if (!strcmp(name, "vkCreateDisplayPlaneSurfaceKHR"))
>> +        return vulkan_funcs->p_vkCreateDisplayPlaneSurfaceKHR;
>>      if (!strcmp(name, "CreateWin32SurfaceKHR"))
>>          return vulkan_funcs->p_vkCreateWin32SurfaceKHR;
>>      if (!strcmp(name, "DestroyInstance"))
>>          return vulkan_funcs->p_vkDestroyInstance;
>>      if (!strcmp(name, "DestroySurfaceKHR"))
>>          return vulkan_funcs->p_vkDestroySurfaceKHR;
>> +    if (!strcmp(name, "vkGetDisplayModePropertiesKHR"))
>> +        return vulkan_funcs->p_vkGetDisplayModePropertiesKHR;
>> +    if (!strcmp(name, "vkGetDisplayPlaneCapabilitiesKHR"))
>> +        return vulkan_funcs->p_vkGetDisplayPlaneCapabilitiesKHR;
>> +    if (!strcmp(name, "vkGetDisplayPlaneSupportedDisplaysKHR"))
>> +        return vulkan_funcs->p_vkGetDisplayPlaneSupportedDisplaysKHR;
>>      if (!strcmp(name, "GetInstanceProcAddr"))
>>          return vulkan_funcs->p_vkGetInstanceProcAddr;
>> +    if (!strcmp(name, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"))
>> +        return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
>> +    if (!strcmp(name, "vkGetPhysicalDeviceDisplayPropertiesKHR"))
>> +        return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPropertiesKHR;
>>      if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR"))
>>          return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
>>      if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))
>> diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h
>> index fcc31bc3c9..07bcd1279c 100644
>> --- a/include/wine/vulkan.h
>> +++ b/include/wine/vulkan.h
>> @@ -60,6 +60,8 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout)
>>  VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplateKHR)
>>  VK_DEFINE_HANDLE(VkDevice)
>>  VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory)
>> +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR)
>> +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR)
>>  VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent)
>>  VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence)
>>  VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)
>> @@ -406,6 +408,15 @@ typedef enum VkDescriptorUpdateTemplateTypeKHR
>>      VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_KHR_MAX_ENUM = 0x7fffffff,
>>  } VkDescriptorUpdateTemplateTypeKHR;
>>
>> +typedef enum VkDisplayPlaneAlphaFlagBitsKHR
>> +{
>> +    VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,
>> +    VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0x00000002,
>> +    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0x00000004,
>> +    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0x00000008,
>> +    VK_DISPLAY_PLANE_ALPHA_FLAG_BITS_KHR_MAX_ENUM = 0x7fffffff,
>> +} VkDisplayPlaneAlphaFlagBitsKHR;
>> +
>>  typedef enum VkDynamicState
>>  {
>>      VK_DYNAMIC_STATE_VIEWPORT = 0,
>> @@ -817,6 +828,8 @@ typedef enum VkObjectType
>>      VK_OBJECT_TYPE_COMMAND_POOL = 25,
>>      VK_OBJECT_TYPE_SURFACE_KHR = 1000000000,
>>      VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000,
>> +    VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
>> +    VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
>>      VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = 1000085000,
>>      VK_OBJECT_TYPE_MAX_ENUM = 0x7fffffff,
>>  } VkObjectType;
>> @@ -1103,6 +1116,8 @@ typedef enum VkStructureType
>>      VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48,
>>      VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
>>      VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
>> +    VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000,
>> +    VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001,
>>      VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
>>      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000,
>>      VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
>> @@ -1326,33 +1341,40 @@ typedef struct VkDispatchIndirectCommand
>>      uint32_t z;
>>  } VkDispatchIndirectCommand;
>>
>> -typedef struct VkDrawIndirectCommand
>> +typedef struct VkDisplayPlanePropertiesKHR
>>  {
>> -    uint32_t vertexCount;
>> +    VkDisplayKHR WINE_VK_ALIGN(8) currentDisplay;
>> +    uint32_t currentStackIndex;
>> +} VkDisplayPlanePropertiesKHR;
>> +
>> +typedef struct VkDrawIndexedIndirectCommand
>> +{
>> +    uint32_t indexCount;
>>      uint32_t instanceCount;
>> -    uint32_t firstVertex;
>> +    uint32_t firstIndex;
>> +    int32_t vertexOffset;
>>      uint32_t firstInstance;
>> -} VkDrawIndirectCommand;
>> +} VkDrawIndexedIndirectCommand;
>>
>> -typedef struct VkExtensionProperties
>> +typedef struct VkEventCreateInfo
>>  {
>> -    char extensionName[VK_MAX_EXTENSION_NAME_SIZE];
>> -    uint32_t specVersion;
>> -} VkExtensionProperties;
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkEventCreateFlags flags;
>> +} VkEventCreateInfo;
>>
>> -typedef struct VkExtent3D
>> +typedef struct VkExtent2D
>>  {
>>      uint32_t width;
>>      uint32_t height;
>> -    uint32_t depth;
>> -} VkExtent3D;
>> +} VkExtent2D;
>>
>> -typedef struct VkFormatProperties
>> +typedef struct VkFenceCreateInfo
>>  {
>> -    VkFormatFeatureFlags linearTilingFeatures;
>> -    VkFormatFeatureFlags optimalTilingFeatures;
>> -    VkFormatFeatureFlags bufferFeatures;
>> -} VkFormatProperties;
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkFenceCreateFlags flags;
>> +} VkFenceCreateInfo;
>>
>>  typedef struct VkFramebufferCreateInfo
>>  {
>> @@ -1367,25 +1389,6 @@ typedef struct VkFramebufferCreateInfo
>>      uint32_t layers;
>>  } VkFramebufferCreateInfo;
>>
>> -typedef struct VkImageCreateInfo
>> -{
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkImageCreateFlags flags;
>> -    VkImageType imageType;
>> -    VkFormat format;
>> -    VkExtent3D extent;
>> -    uint32_t mipLevels;
>> -    uint32_t arrayLayers;
>> -    VkSampleCountFlagBits samples;
>> -    VkImageTiling tiling;
>> -    VkImageUsageFlags usage;
>> -    VkSharingMode sharingMode;
>> -    uint32_t queueFamilyIndexCount;
>> -    const uint32_t *pQueueFamilyIndices;
>> -    VkImageLayout initialLayout;
>> -} VkImageCreateInfo;
>> -
>>  typedef struct VkImageSubresource
>>  {
>>      VkImageAspectFlags aspectMask;
>> @@ -1600,32 +1603,6 @@ typedef struct VkSemaphoreCreateInfo
>>      VkSemaphoreCreateFlags flags;
>>  } VkSemaphoreCreateInfo;
>>
>> -typedef struct VkSparseImageFormatProperties
>> -{
>> -    VkImageAspectFlags aspectMask;
>> -    VkExtent3D imageGranularity;
>> -    VkSparseImageFormatFlags flags;
>> -} VkSparseImageFormatProperties;
>> -
>> -typedef struct VkSparseImageMemoryBind
>> -{
>> -    VkImageSubresource subresource;
>> -    VkOffset3D offset;
>> -    VkExtent3D extent;
>> -    VkDeviceMemory WINE_VK_ALIGN(8) memory;
>> -    VkDeviceSize WINE_VK_ALIGN(8) memoryOffset;
>> -    VkSparseMemoryBindFlags flags;
>> -} VkSparseImageMemoryBind;
>> -
>> -typedef struct VkSparseImageMemoryRequirements
>> -{
>> -    VkSparseImageFormatProperties formatProperties;
>> -    uint32_t imageMipTailFirstLod;
>> -    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailSize;
>> -    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailOffset;
>> -    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailStride;
>> -} VkSparseImageMemoryRequirements;
>> -
>>  typedef struct VkSparseMemoryBind
>>  {
>>      VkDeviceSize WINE_VK_ALIGN(8) resourceOffset;
>> @@ -1761,34 +1738,51 @@ typedef struct VkDescriptorUpdateTemplateCreateInfoKHR
>>      uint32_t set;
>>  } VkDescriptorUpdateTemplateCreateInfoKHR;
>>
>> -typedef struct VkEventCreateInfo
>> +typedef struct VkDisplayModeParametersKHR
>> +{
>> +    VkExtent2D visibleRegion;
>> +    uint32_t refreshRate;
>> +} VkDisplayModeParametersKHR;
>> +
>> +typedef struct VkDisplaySurfaceCreateInfoKHR
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkEventCreateFlags flags;
>> -} VkEventCreateInfo;
>> +    VkDisplaySurfaceCreateFlagsKHR flags;
>> +    VkDisplayModeKHR WINE_VK_ALIGN(8) displayMode;
>> +    uint32_t planeIndex;
>> +    uint32_t planeStackIndex;
>> +    VkSurfaceTransformFlagBitsKHR transform;
>> +    float globalAlpha;
>> +    VkDisplayPlaneAlphaFlagBitsKHR alphaMode;
>> +    VkExtent2D imageExtent;
>> +} VkDisplaySurfaceCreateInfoKHR;
>>
>> -typedef struct VkExtent2D
>> +typedef struct VkExtent3D
>>  {
>>      uint32_t width;
>>      uint32_t height;
>> -} VkExtent2D;
>> +    uint32_t depth;
>> +} VkExtent3D;
>>
>> -typedef struct VkFormatProperties2KHR
>> +typedef struct VkImageCreateInfo
>>  {
>>      VkStructureType sType;
>> -    void *pNext;
>> -    VkFormatProperties formatProperties;
>> -} VkFormatProperties2KHR;
>> -
>> -typedef struct VkImageFormatProperties
>> -{
>> -    VkExtent3D maxExtent;
>> -    uint32_t maxMipLevels;
>> -    uint32_t maxArrayLayers;
>> -    VkSampleCountFlags sampleCounts;
>> -    VkDeviceSize WINE_VK_ALIGN(8) maxResourceSize;
>> -} VkImageFormatProperties;
>> +    const void *pNext;
>> +    VkImageCreateFlags flags;
>> +    VkImageType imageType;
>> +    VkFormat format;
>> +    VkExtent3D extent;
>> +    uint32_t mipLevels;
>> +    uint32_t arrayLayers;
>> +    VkSampleCountFlagBits samples;
>> +    VkImageTiling tiling;
>> +    VkImageUsageFlags usage;
>> +    VkSharingMode sharingMode;
>> +    uint32_t queueFamilyIndexCount;
>> +    const uint32_t *pQueueFamilyIndices;
>> +    VkImageLayout initialLayout;
>> +} VkImageCreateInfo;
>>
>>  typedef struct VkImageMemoryBarrier
>>  {
>> @@ -1912,61 +1906,105 @@ typedef struct VkSparseBufferMemoryBindInfo
>>      const VkSparseMemoryBind *pBinds;
>>  } VkSparseBufferMemoryBindInfo;
>>
>> -typedef struct VkSparseImageMemoryBindInfo
>> +typedef struct VkSparseImageMemoryBind
>> +{
>> +    VkImageSubresource subresource;
>> +    VkOffset3D offset;
>> +    VkExtent3D extent;
>> +    VkDeviceMemory WINE_VK_ALIGN(8) memory;
>> +    VkDeviceSize WINE_VK_ALIGN(8) memoryOffset;
>> +    VkSparseMemoryBindFlags flags;
>> +} VkSparseImageMemoryBind;
>> +
>> +typedef struct VkSparseImageOpaqueMemoryBindInfo
>>  {
>>      VkImage WINE_VK_ALIGN(8) image;
>>      uint32_t bindCount;
>> -    const VkSparseImageMemoryBind *pBinds;
>> -} VkSparseImageMemoryBindInfo;
>> +    const VkSparseMemoryBind *pBinds;
>> +} VkSparseImageOpaqueMemoryBindInfo;
>>
>> -typedef struct VkSpecializationInfo
>> +typedef struct VkStencilOpState
>>  {
>> -    uint32_t mapEntryCount;
>> -    const VkSpecializationMapEntry *pMapEntries;
>> -    size_t dataSize;
>> -    const void *pData;
>> -} VkSpecializationInfo;
>> +    VkStencilOp failOp;
>> +    VkStencilOp passOp;
>> +    VkStencilOp depthFailOp;
>> +    VkCompareOp compareOp;
>> +    uint32_t compareMask;
>> +    uint32_t writeMask;
>> +    uint32_t reference;
>> +} VkStencilOpState;
>>
>> -typedef struct VkSubpassDependency
>> +typedef struct VkSubpassDescription
>>  {
>> -    uint32_t srcSubpass;
>> -    uint32_t dstSubpass;
>> -    VkPipelineStageFlags srcStageMask;
>> -    VkPipelineStageFlags dstStageMask;
>> -    VkAccessFlags srcAccessMask;
>> -    VkAccessFlags dstAccessMask;
>> -    VkDependencyFlags dependencyFlags;
>> -} VkSubpassDependency;
>> +    VkSubpassDescriptionFlags flags;
>> +    VkPipelineBindPoint pipelineBindPoint;
>> +    uint32_t inputAttachmentCount;
>> +    const VkAttachmentReference *pInputAttachments;
>> +    uint32_t colorAttachmentCount;
>> +    const VkAttachmentReference *pColorAttachments;
>> +    const VkAttachmentReference *pResolveAttachments;
>> +    const VkAttachmentReference *pDepthStencilAttachment;
>> +    uint32_t preserveAttachmentCount;
>> +    const uint32_t *pPreserveAttachments;
>> +} VkSubpassDescription;
>>
>> -typedef struct VkSurfaceFormatKHR
>> +typedef struct VkSurfaceCapabilitiesKHR
>>  {
>> -    VkFormat format;
>> -    VkColorSpaceKHR colorSpace;
>> -} VkSurfaceFormatKHR;
>> +    uint32_t minImageCount;
>> +    uint32_t maxImageCount;
>> +    VkExtent2D currentExtent;
>> +    VkExtent2D minImageExtent;
>> +    VkExtent2D maxImageExtent;
>> +    uint32_t maxImageArrayLayers;
>> +    VkSurfaceTransformFlagsKHR supportedTransforms;
>> +    VkSurfaceTransformFlagBitsKHR currentTransform;
>> +    VkCompositeAlphaFlagsKHR supportedCompositeAlpha;
>> +    VkImageUsageFlags supportedUsageFlags;
>> +} VkSurfaceCapabilitiesKHR;
>>
>> -typedef struct VkViewport
>> +typedef struct VkSwapchainCreateInfoKHR
>>  {
>> -    float x;
>> -    float y;
>> -    float width;
>> -    float height;
>> -    float minDepth;
>> -    float maxDepth;
>> -} VkViewport;
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkSwapchainCreateFlagsKHR flags;
>> +    VkSurfaceKHR WINE_VK_ALIGN(8) surface;
>> +    uint32_t minImageCount;
>> +    VkFormat imageFormat;
>> +    VkColorSpaceKHR imageColorSpace;
>> +    VkExtent2D imageExtent;
>> +    uint32_t imageArrayLayers;
>> +    VkImageUsageFlags imageUsage;
>> +    VkSharingMode imageSharingMode;
>> +    uint32_t queueFamilyIndexCount;
>> +    const uint32_t *pQueueFamilyIndices;
>> +    VkSurfaceTransformFlagBitsKHR preTransform;
>> +    VkCompositeAlphaFlagBitsKHR compositeAlpha;
>> +    VkPresentModeKHR presentMode;
>> +    VkBool32 clipped;
>> +    VkSwapchainKHR WINE_VK_ALIGN(8) oldSwapchain;
>> +} VkSwapchainCreateInfoKHR;
>>
>> -typedef struct VkWriteDescriptorSet
>> +typedef struct VkVertexInputBindingDescription
>> +{
>> +    uint32_t binding;
>> +    uint32_t stride;
>> +    VkVertexInputRate inputRate;
>> +} VkVertexInputBindingDescription;
>> +
>> +typedef struct VkViewportWScalingNV
>> +{
>> +    float xcoeff;
>> +    float ycoeff;
>> +} VkViewportWScalingNV;
>> +
>> +typedef struct VkWin32SurfaceCreateInfoKHR
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkDescriptorSet WINE_VK_ALIGN(8) dstSet;
>> -    uint32_t dstBinding;
>> -    uint32_t dstArrayElement;
>> -    uint32_t descriptorCount;
>> -    VkDescriptorType descriptorType;
>> -    const VkDescriptorImageInfo *pImageInfo;
>> -    const VkDescriptorBufferInfo *pBufferInfo;
>> -    const VkBufferView *pTexelBufferView;
>> -} VkWriteDescriptorSet;
>> +    VkWin32SurfaceCreateFlagsKHR flags;
>> +    HINSTANCE hinstance;
>> +    HWND hwnd;
>> +} VkWin32SurfaceCreateInfoKHR;
>>
>>  typedef struct VkApplicationInfo
>>  {
>> @@ -2009,51 +2047,223 @@ typedef struct VkDeviceQueueCreateInfo
>>      const float *pQueuePriorities;
>>  } VkDeviceQueueCreateInfo;
>>
>> -typedef struct VkFenceCreateInfo
>> +typedef struct VkDisplayModePropertiesKHR
>>  {
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkFenceCreateFlags flags;
>> -} VkFenceCreateInfo;
>> +    VkDisplayModeKHR WINE_VK_ALIGN(8) displayMode;
>> +    VkDisplayModeParametersKHR parameters;
>> +} VkDisplayModePropertiesKHR;
>>
>> -typedef struct VkImageBlit
>> +typedef struct VkDisplayPropertiesKHR
>>  {
>> -    VkImageSubresourceLayers srcSubresource;
>> -    VkOffset3D srcOffsets[2];
>> -    VkImageSubresourceLayers dstSubresource;
>> -    VkOffset3D dstOffsets[2];
>> +    VkDisplayKHR WINE_VK_ALIGN(8) display;
>> +    const char *displayName;
>> +    VkExtent2D physicalDimensions;
>> +    VkExtent2D physicalResolution;
>> +    VkSurfaceTransformFlagsKHR supportedTransforms;
>> +    VkBool32 planeReorderPossible;
>> +    VkBool32 persistentContent;
>> +} VkDisplayPropertiesKHR;
>> +
>> +typedef struct VkFormatProperties
>> +{
>> +    VkFormatFeatureFlags linearTilingFeatures;
>> +    VkFormatFeatureFlags optimalTilingFeatures;
>> +    VkFormatFeatureFlags bufferFeatures;
>> +} VkFormatProperties;
>> +
>> +typedef struct VkImageBlit
>> +{
>> +    VkImageSubresourceLayers srcSubresource;
>> +    VkOffset3D srcOffsets[2];
>> +    VkImageSubresourceLayers dstSubresource;
>> +    VkOffset3D dstOffsets[2];
>>  } VkImageBlit;
>>
>> -typedef struct VkImageFormatProperties2KHR
>> +typedef struct VkImageFormatProperties
>> +{
>> +    VkExtent3D maxExtent;
>> +    uint32_t maxMipLevels;
>> +    uint32_t maxArrayLayers;
>> +    VkSampleCountFlags sampleCounts;
>> +    VkDeviceSize WINE_VK_ALIGN(8) maxResourceSize;
>> +} VkImageFormatProperties;
>> +
>> +typedef struct VkImageResolve
>> +{
>> +    VkImageSubresourceLayers srcSubresource;
>> +    VkOffset3D srcOffset;
>> +    VkImageSubresourceLayers dstSubresource;
>> +    VkOffset3D dstOffset;
>> +    VkExtent3D extent;
>> +} VkImageResolve;
>> +
>> +typedef struct VkInstanceCreateInfo
>>  {
>>      VkStructureType sType;
>> -    void *pNext;
>> -    VkImageFormatProperties WINE_VK_ALIGN(8) imageFormatProperties;
>> -} VkImageFormatProperties2KHR;
>> +    const void *pNext;
>> +    VkInstanceCreateFlags flags;
>> +    const VkApplicationInfo *pApplicationInfo;
>> +    uint32_t enabledLayerCount;
>> +    const char * const*ppEnabledLayerNames;
>> +    uint32_t enabledExtensionCount;
>> +    const char * const*ppEnabledExtensionNames;
>> +} VkInstanceCreateInfo;
>>
>> -typedef struct VkOffset2D
>> +typedef struct VkMemoryHeap
>>  {
>> -    int32_t x;
>> -    int32_t y;
>> -} VkOffset2D;
>> +    VkDeviceSize WINE_VK_ALIGN(8) size;
>> +    VkMemoryHeapFlags flags;
>> +} VkMemoryHeap;
>>
>> -typedef struct VkPhysicalDeviceFeatures2KHR
>> +typedef struct VkPhysicalDeviceLimits
>> +{
>> +    uint32_t maxImageDimension1D;
>> +    uint32_t maxImageDimension2D;
>> +    uint32_t maxImageDimension3D;
>> +    uint32_t maxImageDimensionCube;
>> +    uint32_t maxImageArrayLayers;
>> +    uint32_t maxTexelBufferElements;
>> +    uint32_t maxUniformBufferRange;
>> +    uint32_t maxStorageBufferRange;
>> +    uint32_t maxPushConstantsSize;
>> +    uint32_t maxMemoryAllocationCount;
>> +    uint32_t maxSamplerAllocationCount;
>> +    VkDeviceSize WINE_VK_ALIGN(8) bufferImageGranularity;
>> +    VkDeviceSize WINE_VK_ALIGN(8) sparseAddressSpaceSize;
>> +    uint32_t maxBoundDescriptorSets;
>> +    uint32_t maxPerStageDescriptorSamplers;
>> +    uint32_t maxPerStageDescriptorUniformBuffers;
>> +    uint32_t maxPerStageDescriptorStorageBuffers;
>> +    uint32_t maxPerStageDescriptorSampledImages;
>> +    uint32_t maxPerStageDescriptorStorageImages;
>> +    uint32_t maxPerStageDescriptorInputAttachments;
>> +    uint32_t maxPerStageResources;
>> +    uint32_t maxDescriptorSetSamplers;
>> +    uint32_t maxDescriptorSetUniformBuffers;
>> +    uint32_t maxDescriptorSetUniformBuffersDynamic;
>> +    uint32_t maxDescriptorSetStorageBuffers;
>> +    uint32_t maxDescriptorSetStorageBuffersDynamic;
>> +    uint32_t maxDescriptorSetSampledImages;
>> +    uint32_t maxDescriptorSetStorageImages;
>> +    uint32_t maxDescriptorSetInputAttachments;
>> +    uint32_t maxVertexInputAttributes;
>> +    uint32_t maxVertexInputBindings;
>> +    uint32_t maxVertexInputAttributeOffset;
>> +    uint32_t maxVertexInputBindingStride;
>> +    uint32_t maxVertexOutputComponents;
>> +    uint32_t maxTessellationGenerationLevel;
>> +    uint32_t maxTessellationPatchSize;
>> +    uint32_t maxTessellationControlPerVertexInputComponents;
>> +    uint32_t maxTessellationControlPerVertexOutputComponents;
>> +    uint32_t maxTessellationControlPerPatchOutputComponents;
>> +    uint32_t maxTessellationControlTotalOutputComponents;
>> +    uint32_t maxTessellationEvaluationInputComponents;
>> +    uint32_t maxTessellationEvaluationOutputComponents;
>> +    uint32_t maxGeometryShaderInvocations;
>> +    uint32_t maxGeometryInputComponents;
>> +    uint32_t maxGeometryOutputComponents;
>> +    uint32_t maxGeometryOutputVertices;
>> +    uint32_t maxGeometryTotalOutputComponents;
>> +    uint32_t maxFragmentInputComponents;
>> +    uint32_t maxFragmentOutputAttachments;
>> +    uint32_t maxFragmentDualSrcAttachments;
>> +    uint32_t maxFragmentCombinedOutputResources;
>> +    uint32_t maxComputeSharedMemorySize;
>> +    uint32_t maxComputeWorkGroupCount[3];
>> +    uint32_t maxComputeWorkGroupInvocations;
>> +    uint32_t maxComputeWorkGroupSize[3];
>> +    uint32_t subPixelPrecisionBits;
>> +    uint32_t subTexelPrecisionBits;
>> +    uint32_t mipmapPrecisionBits;
>> +    uint32_t maxDrawIndexedIndexValue;
>> +    uint32_t maxDrawIndirectCount;
>> +    float maxSamplerLodBias;
>> +    float maxSamplerAnisotropy;
>> +    uint32_t maxViewports;
>> +    uint32_t maxViewportDimensions[2];
>> +    float viewportBoundsRange[2];
>> +    uint32_t viewportSubPixelBits;
>> +    size_t minMemoryMapAlignment;
>> +    VkDeviceSize WINE_VK_ALIGN(8) minTexelBufferOffsetAlignment;
>> +    VkDeviceSize WINE_VK_ALIGN(8) minUniformBufferOffsetAlignment;
>> +    VkDeviceSize WINE_VK_ALIGN(8) minStorageBufferOffsetAlignment;
>> +    int32_t minTexelOffset;
>> +    uint32_t maxTexelOffset;
>> +    int32_t minTexelGatherOffset;
>> +    uint32_t maxTexelGatherOffset;
>> +    float minInterpolationOffset;
>> +    float maxInterpolationOffset;
>> +    uint32_t subPixelInterpolationOffsetBits;
>> +    uint32_t maxFramebufferWidth;
>> +    uint32_t maxFramebufferHeight;
>> +    uint32_t maxFramebufferLayers;
>> +    VkSampleCountFlags framebufferColorSampleCounts;
>> +    VkSampleCountFlags framebufferDepthSampleCounts;
>> +    VkSampleCountFlags framebufferStencilSampleCounts;
>> +    VkSampleCountFlags framebufferNoAttachmentsSampleCounts;
>> +    uint32_t maxColorAttachments;
>> +    VkSampleCountFlags sampledImageColorSampleCounts;
>> +    VkSampleCountFlags sampledImageIntegerSampleCounts;
>> +    VkSampleCountFlags sampledImageDepthSampleCounts;
>> +    VkSampleCountFlags sampledImageStencilSampleCounts;
>> +    VkSampleCountFlags storageImageSampleCounts;
>> +    uint32_t maxSampleMaskWords;
>> +    VkBool32 timestampComputeAndGraphics;
>> +    float timestampPeriod;
>> +    uint32_t maxClipDistances;
>> +    uint32_t maxCullDistances;
>> +    uint32_t maxCombinedClipAndCullDistances;
>> +    uint32_t discreteQueuePriorities;
>> +    float pointSizeRange[2];
>> +    float lineWidthRange[2];
>> +    float pointSizeGranularity;
>> +    float lineWidthGranularity;
>> +    VkBool32 strictLines;
>> +    VkBool32 standardSampleLocations;
>> +    VkDeviceSize WINE_VK_ALIGN(8) optimalBufferCopyOffsetAlignment;
>> +    VkDeviceSize WINE_VK_ALIGN(8) optimalBufferCopyRowPitchAlignment;
>> +    VkDeviceSize WINE_VK_ALIGN(8) nonCoherentAtomSize;
>> +} VkPhysicalDeviceLimits;
>> +
>> +typedef struct VkPhysicalDeviceProperties
>> +{
>> +    uint32_t apiVersion;
>> +    uint32_t driverVersion;
>> +    uint32_t vendorID;
>> +    uint32_t deviceID;
>> +    VkPhysicalDeviceType deviceType;
>> +    char deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];
>> +    uint8_t pipelineCacheUUID[VK_UUID_SIZE];
>> +    VkPhysicalDeviceLimits WINE_VK_ALIGN(8) limits;
>> +    VkPhysicalDeviceSparseProperties sparseProperties;
>> +} VkPhysicalDeviceProperties;
>> +
>> +typedef struct VkPipelineDepthStencilStateCreateInfo
>>  {
>>      VkStructureType sType;
>> -    void *pNext;
>> -    VkPhysicalDeviceFeatures features;
>> -} VkPhysicalDeviceFeatures2KHR;
>> +    const void *pNext;
>> +    VkPipelineDepthStencilStateCreateFlags flags;
>> +    VkBool32 depthTestEnable;
>> +    VkBool32 depthWriteEnable;
>> +    VkCompareOp depthCompareOp;
>> +    VkBool32 depthBoundsTestEnable;
>> +    VkBool32 stencilTestEnable;
>> +    VkStencilOpState front;
>> +    VkStencilOpState back;
>> +    float minDepthBounds;
>> +    float maxDepthBounds;
>> +} VkPipelineDepthStencilStateCreateInfo;
>>
>> -typedef struct VkPipelineShaderStageCreateInfo
>> +typedef struct VkPipelineVertexInputStateCreateInfo
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkPipelineShaderStageCreateFlags flags;
>> -    VkShaderStageFlagBits stage;
>> -    VkShaderModule WINE_VK_ALIGN(8) module;
>> -    const char *pName;
>> -    const VkSpecializationInfo *pSpecializationInfo;
>> -} VkPipelineShaderStageCreateInfo;
>> +    VkPipelineVertexInputStateCreateFlags flags;
>> +    uint32_t vertexBindingDescriptionCount;
>> +    const VkVertexInputBindingDescription *pVertexBindingDescriptions;
>> +    uint32_t vertexAttributeDescriptionCount;
>> +    const VkVertexInputAttributeDescription *pVertexAttributeDescriptions;
>> +} VkPipelineVertexInputStateCreateInfo;
>>
>>  typedef struct VkQueueFamilyProperties2KHR
>>  {
>> @@ -2071,54 +2281,20 @@ typedef struct VkShaderModuleCreateInfo
>>      const uint32_t *pCode;
>>  } VkShaderModuleCreateInfo;
>>
>> -typedef struct VkSparseImageOpaqueMemoryBindInfo
>> +typedef struct VkSparseImageMemoryBindInfo
>>  {
>>      VkImage WINE_VK_ALIGN(8) image;
>>      uint32_t bindCount;
>> -    const VkSparseMemoryBind *pBinds;
>> -} VkSparseImageOpaqueMemoryBindInfo;
>> -
>> -typedef struct VkSubpassDescription
>> -{
>> -    VkSubpassDescriptionFlags flags;
>> -    VkPipelineBindPoint pipelineBindPoint;
>> -    uint32_t inputAttachmentCount;
>> -    const VkAttachmentReference *pInputAttachments;
>> -    uint32_t colorAttachmentCount;
>> -    const VkAttachmentReference *pColorAttachments;
>> -    const VkAttachmentReference *pResolveAttachments;
>> -    const VkAttachmentReference *pDepthStencilAttachment;
>> -    uint32_t preserveAttachmentCount;
>> -    const uint32_t *pPreserveAttachments;
>> -} VkSubpassDescription;
>> -
>> -typedef struct VkSwapchainCreateInfoKHR
>> -{
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkSwapchainCreateFlagsKHR flags;
>> -    VkSurfaceKHR WINE_VK_ALIGN(8) surface;
>> -    uint32_t minImageCount;
>> -    VkFormat imageFormat;
>> -    VkColorSpaceKHR imageColorSpace;
>> -    VkExtent2D imageExtent;
>> -    uint32_t imageArrayLayers;
>> -    VkImageUsageFlags imageUsage;
>> -    VkSharingMode imageSharingMode;
>> -    uint32_t queueFamilyIndexCount;
>> -    const uint32_t *pQueueFamilyIndices;
>> -    VkSurfaceTransformFlagBitsKHR preTransform;
>> -    VkCompositeAlphaFlagBitsKHR compositeAlpha;
>> -    VkPresentModeKHR presentMode;
>> -    VkBool32 clipped;
>> -    VkSwapchainKHR WINE_VK_ALIGN(8) oldSwapchain;
>> -} VkSwapchainCreateInfoKHR;
>> +    const VkSparseImageMemoryBind *pBinds;
>> +} VkSparseImageMemoryBindInfo;
>>
>> -typedef struct VkViewportWScalingNV
>> +typedef struct VkSpecializationInfo
>>  {
>> -    float xcoeff;
>> -    float ycoeff;
>> -} VkViewportWScalingNV;
>> +    uint32_t mapEntryCount;
>> +    const VkSpecializationMapEntry *pMapEntries;
>> +    size_t dataSize;
>> +    const void *pData;
>> +} VkSpecializationInfo;
>>
>>  typedef struct VkClearAttachment
>>  {
>> @@ -2149,6 +2325,22 @@ typedef struct VkDeviceCreateInfo
>>      const VkPhysicalDeviceFeatures *pEnabledFeatures;
>>  } VkDeviceCreateInfo;
>>
>> +typedef struct VkDisplayModeCreateInfoKHR
>> +{
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkDisplayModeCreateFlagsKHR flags;
>> +    VkDisplayModeParametersKHR parameters;
>> +} VkDisplayModeCreateInfoKHR;
>> +
>> +typedef struct VkDrawIndirectCommand
>> +{
>> +    uint32_t vertexCount;
>> +    uint32_t instanceCount;
>> +    uint32_t firstVertex;
>> +    uint32_t firstInstance;
>> +} VkDrawIndirectCommand;
>> +
>>  typedef struct VkImageCopy
>>  {
>>      VkImageSubresourceLayers srcSubresource;
>> @@ -2158,11 +2350,11 @@ typedef struct VkImageCopy
>>      VkExtent3D extent;
>>  } VkImageCopy;
>>
>> -typedef struct VkMemoryHeap
>> +typedef struct VkOffset2D
>>  {
>> -    VkDeviceSize WINE_VK_ALIGN(8) size;
>> -    VkMemoryHeapFlags flags;
>> -} VkMemoryHeap;
>> +    int32_t x;
>> +    int32_t y;
>> +} VkOffset2D;
>>
>>  typedef struct VkPhysicalDeviceMemoryProperties
>>  {
>> @@ -2172,17 +2364,23 @@ typedef struct VkPhysicalDeviceMemoryProperties
>>      VkMemoryHeap WINE_VK_ALIGN(8) memoryHeaps[VK_MAX_MEMORY_HEAPS];
>>  } VkPhysicalDeviceMemoryProperties;
>>
>> -typedef struct VkPipelineColorBlendStateCreateInfo
>> +typedef struct VkPhysicalDeviceProperties2KHR
>> +{
>> +    VkStructureType sType;
>> +    void *pNext;
>> +    VkPhysicalDeviceProperties WINE_VK_ALIGN(8) properties;
>> +} VkPhysicalDeviceProperties2KHR;
>> +
>> +typedef struct VkPipelineShaderStageCreateInfo
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkPipelineColorBlendStateCreateFlags flags;
>> -    VkBool32 logicOpEnable;
>> -    VkLogicOp logicOp;
>> -    uint32_t attachmentCount;
>> -    const VkPipelineColorBlendAttachmentState *pAttachments;
>> -    float blendConstants[4];
>> -} VkPipelineColorBlendStateCreateInfo;
>> +    VkPipelineShaderStageCreateFlags flags;
>> +    VkShaderStageFlagBits stage;
>> +    VkShaderModule WINE_VK_ALIGN(8) module;
>> +    const char *pName;
>> +    const VkSpecializationInfo *pSpecializationInfo;
>> +} VkPipelineShaderStageCreateInfo;
>>
>>  typedef struct VkPushConstantRange
>>  {
>> @@ -2191,36 +2389,41 @@ typedef struct VkPushConstantRange
>>      uint32_t size;
>>  } VkPushConstantRange;
>>
>> -typedef struct VkRenderPassCreateInfo
>> +typedef struct VkSparseImageFormatProperties
>>  {
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkRenderPassCreateFlags flags;
>> -    uint32_t attachmentCount;
>> -    const VkAttachmentDescription *pAttachments;
>> -    uint32_t subpassCount;
>> -    const VkSubpassDescription *pSubpasses;
>> -    uint32_t dependencyCount;
>> -    const VkSubpassDependency *pDependencies;
>> -} VkRenderPassCreateInfo;
>> +    VkImageAspectFlags aspectMask;
>> +    VkExtent3D imageGranularity;
>> +    VkSparseImageFormatFlags flags;
>> +} VkSparseImageFormatProperties;
>>
>> -typedef struct VkStencilOpState
>> +typedef struct VkSparseImageMemoryRequirements
>>  {
>> -    VkStencilOp failOp;
>> -    VkStencilOp passOp;
>> -    VkStencilOp depthFailOp;
>> -    VkCompareOp compareOp;
>> -    uint32_t compareMask;
>> -    uint32_t writeMask;
>> -    uint32_t reference;
>> -} VkStencilOpState;
>> +    VkSparseImageFormatProperties formatProperties;
>> +    uint32_t imageMipTailFirstLod;
>> +    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailSize;
>> +    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailOffset;
>> +    VkDeviceSize WINE_VK_ALIGN(8) imageMipTailStride;
>> +} VkSparseImageMemoryRequirements;
>>
>> -typedef struct VkVertexInputBindingDescription
>> +typedef struct VkSurfaceFormatKHR
>>  {
>> -    uint32_t binding;
>> -    uint32_t stride;
>> -    VkVertexInputRate inputRate;
>> -} VkVertexInputBindingDescription;
>> +    VkFormat format;
>> +    VkColorSpaceKHR colorSpace;
>> +} VkSurfaceFormatKHR;
>> +
>> +typedef struct VkWriteDescriptorSet
>> +{
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkDescriptorSet WINE_VK_ALIGN(8) dstSet;
>> +    uint32_t dstBinding;
>> +    uint32_t dstArrayElement;
>> +    uint32_t descriptorCount;
>> +    VkDescriptorType descriptorType;
>> +    const VkDescriptorImageInfo *pImageInfo;
>> +    const VkDescriptorBufferInfo *pBufferInfo;
>> +    const VkBufferView *pTexelBufferView;
>> +} VkWriteDescriptorSet;
>>
>>  typedef struct VkBindSparseInfo
>>  {
>> @@ -2249,48 +2452,36 @@ typedef struct VkComputePipelineCreateInfo
>>      int32_t basePipelineIndex;
>>  } VkComputePipelineCreateInfo;
>>
>> -typedef struct VkImageResolve
>> +typedef struct VkExtensionProperties
>>  {
>> -    VkImageSubresourceLayers srcSubresource;
>> -    VkOffset3D srcOffset;
>> -    VkImageSubresourceLayers dstSubresource;
>> -    VkOffset3D dstOffset;
>> -    VkExtent3D extent;
>> -} VkImageResolve;
>> +    char extensionName[VK_MAX_EXTENSION_NAME_SIZE];
>> +    uint32_t specVersion;
>> +} VkExtensionProperties;
>>
>> -typedef struct VkPhysicalDeviceMemoryProperties2KHR
>> +typedef struct VkImageFormatProperties2KHR
>>  {
>>      VkStructureType sType;
>>      void *pNext;
>> -    VkPhysicalDeviceMemoryProperties WINE_VK_ALIGN(8) memoryProperties;
>> -} VkPhysicalDeviceMemoryProperties2KHR;
>> +    VkImageFormatProperties WINE_VK_ALIGN(8) imageFormatProperties;
>> +} VkImageFormatProperties2KHR;
>>
>> -typedef struct VkPipelineDepthStencilStateCreateInfo
>> +typedef struct VkPhysicalDeviceMemoryProperties2KHR
>>  {
>>      VkStructureType sType;
>> -    const void *pNext;
>> -    VkPipelineDepthStencilStateCreateFlags flags;
>> -    VkBool32 depthTestEnable;
>> -    VkBool32 depthWriteEnable;
>> -    VkCompareOp depthCompareOp;
>> -    VkBool32 depthBoundsTestEnable;
>> -    VkBool32 stencilTestEnable;
>> -    VkStencilOpState front;
>> -    VkStencilOpState back;
>> -    float minDepthBounds;
>> -    float maxDepthBounds;
>> -} VkPipelineDepthStencilStateCreateInfo;
>> +    void *pNext;
>> +    VkPhysicalDeviceMemoryProperties WINE_VK_ALIGN(8) memoryProperties;
>> +} VkPhysicalDeviceMemoryProperties2KHR;
>>
>> -typedef struct VkPipelineVertexInputStateCreateInfo
>> +typedef struct VkPipelineLayoutCreateInfo
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkPipelineVertexInputStateCreateFlags flags;
>> -    uint32_t vertexBindingDescriptionCount;
>> -    const VkVertexInputBindingDescription *pVertexBindingDescriptions;
>> -    uint32_t vertexAttributeDescriptionCount;
>> -    const VkVertexInputAttributeDescription *pVertexAttributeDescriptions;
>> -} VkPipelineVertexInputStateCreateInfo;
>> +    VkPipelineLayoutCreateFlags flags;
>> +    uint32_t setLayoutCount;
>> +    const VkDescriptorSetLayout *pSetLayouts;
>> +    uint32_t pushConstantRangeCount;
>> +    const VkPushConstantRange *pPushConstantRanges;
>> +} VkPipelineLayoutCreateInfo;
>>
>>  typedef struct VkRect2D
>>  {
>> @@ -2305,14 +2496,15 @@ typedef struct VkSparseImageFormatProperties2KHR
>>      VkSparseImageFormatProperties properties;
>>  } VkSparseImageFormatProperties2KHR;
>>
>> -typedef struct VkWin32SurfaceCreateInfoKHR
>> +typedef struct VkViewport
>>  {
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkWin32SurfaceCreateFlagsKHR flags;
>> -    HINSTANCE hinstance;
>> -    HWND hwnd;
>> -} VkWin32SurfaceCreateInfoKHR;
>> +    float x;
>> +    float y;
>> +    float width;
>> +    float height;
>> +    float minDepth;
>> +    float maxDepth;
>> +} VkViewport;
>>
>>  typedef struct VkClearRect
>>  {
>> @@ -2321,37 +2513,30 @@ typedef struct VkClearRect
>>      uint32_t layerCount;
>>  } VkClearRect;
>>
>> -typedef struct VkDrawIndexedIndirectCommand
>> -{
>> -    uint32_t indexCount;
>> -    uint32_t instanceCount;
>> -    uint32_t firstIndex;
>> -    int32_t vertexOffset;
>> -    uint32_t firstInstance;
>> -} VkDrawIndexedIndirectCommand;
>> -
>> -typedef struct VkInstanceCreateInfo
>> +typedef struct VkDisplayPlaneCapabilitiesKHR
>>  {
>> -    VkStructureType sType;
>> -    const void *pNext;
>> -    VkInstanceCreateFlags flags;
>> -    const VkApplicationInfo *pApplicationInfo;
>> -    uint32_t enabledLayerCount;
>> -    const char * const*ppEnabledLayerNames;
>> -    uint32_t enabledExtensionCount;
>> -    const char * const*ppEnabledExtensionNames;
>> -} VkInstanceCreateInfo;
>> +    VkDisplayPlaneAlphaFlagsKHR supportedAlpha;
>> +    VkOffset2D minSrcPosition;
>> +    VkOffset2D maxSrcPosition;
>> +    VkExtent2D minSrcExtent;
>> +    VkExtent2D maxSrcExtent;
>> +    VkOffset2D minDstPosition;
>> +    VkOffset2D maxDstPosition;
>> +    VkExtent2D minDstExtent;
>> +    VkExtent2D maxDstExtent;
>> +} VkDisplayPlaneCapabilitiesKHR;
>>
>> -typedef struct VkPipelineLayoutCreateInfo
>> +typedef struct VkPipelineColorBlendStateCreateInfo
>>  {
>>      VkStructureType sType;
>>      const void *pNext;
>> -    VkPipelineLayoutCreateFlags flags;
>> -    uint32_t setLayoutCount;
>> -    const VkDescriptorSetLayout *pSetLayouts;
>> -    uint32_t pushConstantRangeCount;
>> -    const VkPushConstantRange *pPushConstantRanges;
>> -} VkPipelineLayoutCreateInfo;
>> +    VkPipelineColorBlendStateCreateFlags flags;
>> +    VkBool32 logicOpEnable;
>> +    VkLogicOp logicOp;
>> +    uint32_t attachmentCount;
>> +    const VkPipelineColorBlendAttachmentState *pAttachments;
>> +    float blendConstants[4];
>> +} VkPipelineColorBlendStateCreateInfo;
>>
>>  typedef struct VkRenderPassBeginInfo
>>  {
>> @@ -2364,6 +2549,17 @@ typedef struct VkRenderPassBeginInfo
>>      const VkClearValue *pClearValues;
>>  } VkRenderPassBeginInfo;
>>
>> +typedef struct VkSubpassDependency
>> +{
>> +    uint32_t srcSubpass;
>> +    uint32_t dstSubpass;
>> +    VkPipelineStageFlags srcStageMask;
>> +    VkPipelineStageFlags dstStageMask;
>> +    VkAccessFlags srcAccessMask;
>> +    VkAccessFlags dstAccessMask;
>> +    VkDependencyFlags dependencyFlags;
>> +} VkSubpassDependency;
>> +
>>  typedef struct VkDescriptorSetLayoutCreateInfo
>>  {
>>      VkStructureType sType;
>> @@ -2373,115 +2569,32 @@ typedef struct VkDescriptorSetLayoutCreateInfo
>>      const VkDescriptorSetLayoutBinding *pBindings;
>>  } VkDescriptorSetLayoutCreateInfo;
>>
>> -typedef struct VkPhysicalDeviceLimits
>> +typedef struct VkPhysicalDeviceFeatures2KHR
>>  {
>> -    uint32_t maxImageDimension1D;
>> -    uint32_t maxImageDimension2D;
>> -    uint32_t maxImageDimension3D;
>> -    uint32_t maxImageDimensionCube;
>> -    uint32_t maxImageArrayLayers;
>> -    uint32_t maxTexelBufferElements;
>> -    uint32_t maxUniformBufferRange;
>> -    uint32_t maxStorageBufferRange;
>> -    uint32_t maxPushConstantsSize;
>> -    uint32_t maxMemoryAllocationCount;
>> -    uint32_t maxSamplerAllocationCount;
>> -    VkDeviceSize WINE_VK_ALIGN(8) bufferImageGranularity;
>> -    VkDeviceSize WINE_VK_ALIGN(8) sparseAddressSpaceSize;
>> -    uint32_t maxBoundDescriptorSets;
>> -    uint32_t maxPerStageDescriptorSamplers;
>> -    uint32_t maxPerStageDescriptorUniformBuffers;
>> -    uint32_t maxPerStageDescriptorStorageBuffers;
>> -    uint32_t maxPerStageDescriptorSampledImages;
>> -    uint32_t maxPerStageDescriptorStorageImages;
>> -    uint32_t maxPerStageDescriptorInputAttachments;
>> -    uint32_t maxPerStageResources;
>> -    uint32_t maxDescriptorSetSamplers;
>> -    uint32_t maxDescriptorSetUniformBuffers;
>> -    uint32_t maxDescriptorSetUniformBuffersDynamic;
>> -    uint32_t maxDescriptorSetStorageBuffers;
>> -    uint32_t maxDescriptorSetStorageBuffersDynamic;
>> -    uint32_t maxDescriptorSetSampledImages;
>> -    uint32_t maxDescriptorSetStorageImages;
>> -    uint32_t maxDescriptorSetInputAttachments;
>> -    uint32_t maxVertexInputAttributes;
>> -    uint32_t maxVertexInputBindings;
>> -    uint32_t maxVertexInputAttributeOffset;
>> -    uint32_t maxVertexInputBindingStride;
>> -    uint32_t maxVertexOutputComponents;
>> -    uint32_t maxTessellationGenerationLevel;
>> -    uint32_t maxTessellationPatchSize;
>> -    uint32_t maxTessellationControlPerVertexInputComponents;
>> -    uint32_t maxTessellationControlPerVertexOutputComponents;
>> -    uint32_t maxTessellationControlPerPatchOutputComponents;
>> -    uint32_t maxTessellationControlTotalOutputComponents;
>> -    uint32_t maxTessellationEvaluationInputComponents;
>> -    uint32_t maxTessellationEvaluationOutputComponents;
>> -    uint32_t maxGeometryShaderInvocations;
>> -    uint32_t maxGeometryInputComponents;
>> -    uint32_t maxGeometryOutputComponents;
>> -    uint32_t maxGeometryOutputVertices;
>> -    uint32_t maxGeometryTotalOutputComponents;
>> -    uint32_t maxFragmentInputComponents;
>> -    uint32_t maxFragmentOutputAttachments;
>> -    uint32_t maxFragmentDualSrcAttachments;
>> -    uint32_t maxFragmentCombinedOutputResources;
>> -    uint32_t maxComputeSharedMemorySize;
>> -    uint32_t maxComputeWorkGroupCount[3];
>> -    uint32_t maxComputeWorkGroupInvocations;
>> -    uint32_t maxComputeWorkGroupSize[3];
>> -    uint32_t subPixelPrecisionBits;
>> -    uint32_t subTexelPrecisionBits;
>> -    uint32_t mipmapPrecisionBits;
>> -    uint32_t maxDrawIndexedIndexValue;
>> -    uint32_t maxDrawIndirectCount;
>> -    float maxSamplerLodBias;
>> -    float maxSamplerAnisotropy;
>> -    uint32_t maxViewports;
>> -    uint32_t maxViewportDimensions[2];
>> -    float viewportBoundsRange[2];
>> -    uint32_t viewportSubPixelBits;
>> -    size_t minMemoryMapAlignment;
>> -    VkDeviceSize WINE_VK_ALIGN(8) minTexelBufferOffsetAlignment;
>> -    VkDeviceSize WINE_VK_ALIGN(8) minUniformBufferOffsetAlignment;
>> -    VkDeviceSize WINE_VK_ALIGN(8) minStorageBufferOffsetAlignment;
>> -    int32_t minTexelOffset;
>> -    uint32_t maxTexelOffset;
>> -    int32_t minTexelGatherOffset;
>> -    uint32_t maxTexelGatherOffset;
>> -    float minInterpolationOffset;
>> -    float maxInterpolationOffset;
>> -    uint32_t subPixelInterpolationOffsetBits;
>> -    uint32_t maxFramebufferWidth;
>> -    uint32_t maxFramebufferHeight;
>> -    uint32_t maxFramebufferLayers;
>> -    VkSampleCountFlags framebufferColorSampleCounts;
>> -    VkSampleCountFlags framebufferDepthSampleCounts;
>> -    VkSampleCountFlags framebufferStencilSampleCounts;
>> -    VkSampleCountFlags framebufferNoAttachmentsSampleCounts;
>> -    uint32_t maxColorAttachments;
>> -    VkSampleCountFlags sampledImageColorSampleCounts;
>> -    VkSampleCountFlags sampledImageIntegerSampleCounts;
>> -    VkSampleCountFlags sampledImageDepthSampleCounts;
>> -    VkSampleCountFlags sampledImageStencilSampleCounts;
>> -    VkSampleCountFlags storageImageSampleCounts;
>> -    uint32_t maxSampleMaskWords;
>> -    VkBool32 timestampComputeAndGraphics;
>> -    float timestampPeriod;
>> -    uint32_t maxClipDistances;
>> -    uint32_t maxCullDistances;
>> -    uint32_t maxCombinedClipAndCullDistances;
>> -    uint32_t discreteQueuePriorities;
>> -    float pointSizeRange[2];
>> -    float lineWidthRange[2];
>> -    float pointSizeGranularity;
>> -    float lineWidthGranularity;
>> -    VkBool32 strictLines;
>> -    VkBool32 standardSampleLocations;
>> -    VkDeviceSize WINE_VK_ALIGN(8) optimalBufferCopyOffsetAlignment;
>> -    VkDeviceSize WINE_VK_ALIGN(8) optimalBufferCopyRowPitchAlignment;
>> -    VkDeviceSize WINE_VK_ALIGN(8) nonCoherentAtomSize;
>> -} VkPhysicalDeviceLimits;
>> +    VkStructureType sType;
>> +    void *pNext;
>> +    VkPhysicalDeviceFeatures features;
>> +} VkPhysicalDeviceFeatures2KHR;
>> +
>> +typedef struct VkRenderPassCreateInfo
>> +{
>> +    VkStructureType sType;
>> +    const void *pNext;
>> +    VkRenderPassCreateFlags flags;
>> +    uint32_t attachmentCount;
>> +    const VkAttachmentDescription *pAttachments;
>> +    uint32_t subpassCount;
>> +    const VkSubpassDescription *pSubpasses;
>> +    uint32_t dependencyCount;
>> +    const VkSubpassDependency *pDependencies;
>> +} VkRenderPassCreateInfo;
>> +
>> +typedef struct VkFormatProperties2KHR
>> +{
>> +    VkStructureType sType;
>> +    void *pNext;
>> +    VkFormatProperties formatProperties;
>> +} VkFormatProperties2KHR;
>>
>>  typedef struct VkPipelineViewportStateCreateInfo
>>  {
>> @@ -2517,40 +2630,6 @@ typedef struct VkGraphicsPipelineCreateInfo
>>      int32_t basePipelineIndex;
>>  } VkGraphicsPipelineCreateInfo;
>>
>> -typedef struct VkSurfaceCapabilitiesKHR
>> -{
>> -    uint32_t minImageCount;
>> -    uint32_t maxImageCount;
>> -    VkExtent2D currentExtent;
>> -    VkExtent2D minImageExtent;
>> -    VkExtent2D maxImageExtent;
>> -    uint32_t maxImageArrayLayers;
>> -    VkSurfaceTransformFlagsKHR supportedTransforms;
>> -    VkSurfaceTransformFlagBitsKHR currentTransform;
>> -    VkCompositeAlphaFlagsKHR supportedCompositeAlpha;
>> -    VkImageUsageFlags supportedUsageFlags;
>> -} VkSurfaceCapabilitiesKHR;
>> -
>> -typedef struct VkPhysicalDeviceProperties
>> -{
>> -    uint32_t apiVersion;
>> -    uint32_t driverVersion;
>> -    uint32_t vendorID;
>> -    uint32_t deviceID;
>> -    VkPhysicalDeviceType deviceType;
>> -    char deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];
>> -    uint8_t pipelineCacheUUID[VK_UUID_SIZE];
>> -    VkPhysicalDeviceLimits WINE_VK_ALIGN(8) limits;
>> -    VkPhysicalDeviceSparseProperties sparseProperties;
>> -} VkPhysicalDeviceProperties;
>> -
>> -typedef struct VkPhysicalDeviceProperties2KHR
>> -{
>> -    VkStructureType sType;
>> -    void *pNext;
>> -    VkPhysicalDeviceProperties WINE_VK_ALIGN(8) properties;
>> -} VkPhysicalDeviceProperties2KHR;
>> -
>>  VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex);
>>  VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers);
>>  VkResult VKAPI_CALL vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets);
>> @@ -2616,6 +2695,8 @@ VkResult VKAPI_CALL vkCreateDescriptorPool(VkDevice device, const VkDescriptorPo
>>  VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout);
>>  VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate);
>>  VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice);
>> +VkResult VKAPI_CALL vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode);
>> +VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface);
>>  VkResult VKAPI_CALL vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent);
>>  VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence);
>>  VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer);
>> @@ -2670,12 +2751,17 @@ void VKAPI_CALL vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
>>  void VKAPI_CALL vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes);
>>  PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *pName);
>>  void VKAPI_CALL vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue);
>> +VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties);
>> +VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities);
>> +VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t *pDisplayCount, VkDisplayKHR *pDisplays);
>>  VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event);
>>  VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence);
>>  void VKAPI_CALL vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements);
>>  void VKAPI_CALL vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements *pSparseMemoryRequirements);
>>  void VKAPI_CALL vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout);
>>  PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName);
>> +VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties);
>> +VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties);
>>  void VKAPI_CALL vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures);
>>  void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures);
>>  void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties);
>> diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h
>> index 60d16dd52a..d130d2f11b 100644
>> --- a/include/wine/vulkan_driver.h
>> +++ b/include/wine/vulkan_driver.h
>> @@ -4,7 +4,7 @@
>>  #define __WINE_VULKAN_DRIVER_H
>>
>>  /* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */
>> -#define WINE_VULKAN_DRIVER_VERSION 3
>> +#define WINE_VULKAN_DRIVER_VERSION 4
>>
>>  struct vulkan_funcs
>>  {
>> @@ -13,6 +13,8 @@ struct vulkan_funcs
>>       * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice.
>>       */
>>      VkResult (*p_vkAcquireNextImageKHR)(VkDevice, VkSwapchainKHR, uint64_t, VkSemaphore, VkFence, uint32_t *);
>> +    VkResult (*p_vkCreateDisplayModeKHR)(VkPhysicalDevice, VkDisplayKHR, const VkDisplayModeCreateInfoKHR *, const VkAllocationCallbacks *, VkDisplayModeKHR *);
>> +    VkResult (*p_vkCreateDisplayPlaneSurfaceKHR)(VkInstance, const VkDisplaySurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *);
>>      VkResult (*p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *);
>>      VkResult (*p_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *);
>>      VkResult (*p_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *);
>> @@ -21,7 +23,12 @@ struct vulkan_funcs
>>      void (*p_vkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *);
>>      VkResult (*p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *);
>>      void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *);
>> +    VkResult (*p_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice, VkDisplayKHR, uint32_t *, VkDisplayModePropertiesKHR *);
>> +    VkResult (*p_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDevice, VkDisplayModeKHR, uint32_t, VkDisplayPlaneCapabilitiesKHR *);
>> +    VkResult (*p_vkGetDisplayPlaneSupportedDisplaysKHR)(VkPhysicalDevice, uint32_t, uint32_t *, VkDisplayKHR *);
>>      void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *);
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPlanePropertiesKHR *);
>> +    VkResult (*p_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice, uint32_t *, VkDisplayPropertiesKHR *);
>>      VkResult (*p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *);
>>      VkResult (*p_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *);
>>      VkResult (*p_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkPresentModeKHR *);
>> --
>> 2.14.3
>>
>>
>>



More information about the wine-devel mailing list