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

Józef Kucia joseph.kucia at gmail.com
Tue Mar 27 17:35:56 CDT 2018


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).

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()?

> +
> +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.

>      "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