Hi all,
This patch series adds a minimal vulkan-1 implementation, which is sufficient to run cube, vulkaninfo and Wolfenstein.
Compared to the official Vulkan loader I'm taking some shortcuts by only handling a single ICD (winevulkan), which allows us to skip aggregating of results from multiple ICDs. Layers are not supported either.
Thanks to these simplifications, creating a vulkan loader was simple. We could just store a global function pointer table and not deal with dispatch tables.
The official Vulkan loader still works and will continue to work. At some point we may provide an optional package to add it.
Thanks, Roderick
Roderick Colenbrander (5): winevulkan/winex11: Add VK_KHR_display stub implementation. vulkan-1: Add stub implementation. vulkan-1: Implement vkEnumerateInstanceExtensionProperties. vulkan-1: Implement thunks for Vulkan Core functions. vulkan-1: Implement vkGetInstanceProcAddr.
configure.ac | 1 + dlls/vulkan-1/Makefile.in | 6 + dlls/vulkan-1/version.rc | 27 ++ dlls/vulkan-1/vulkan-1.spec | 158 +++++++ dlls/vulkan-1/vulkan.c | 143 ++++++ dlls/winevulkan/make_vulkan | 166 ++++++- 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 +- 12 files changed, 1340 insertions(+), 445 deletions(-) create mode 100644 dlls/vulkan-1/Makefile.in create mode 100644 dlls/vulkan-1/version.rc create mode 100644 dlls/vulkan-1/vulkan-1.spec create mode 100644 dlls/vulkan-1/vulkan.c
Signed-off-by: Roderick Colenbrander thunderbird2k@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 +} + +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", "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; + 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 *);
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@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@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"))
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;return vulkan_funcs->p_vkCreateDisplayPlaneSurfaceKHR;
- if (!strcmp(name, "vkGetDisplayModePropertiesKHR"))
return vulkan_funcs->p_vkGetDisplayModePropertiesKHR;
- if (!strcmp(name, "vkGetDisplayPlaneCapabilitiesKHR"))
return vulkan_funcs->p_vkGetDisplayPlaneCapabilitiesKHR;
- if (!strcmp(name, "vkGetDisplayPlaneSupportedDisplaysKHR"))
if (!strcmp(name, "GetInstanceProcAddr")) return vulkan_funcs->p_vkGetInstanceProcAddr;return vulkan_funcs->p_vkGetDisplayPlaneSupportedDisplaysKHR;
- if (!strcmp(name, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"))
return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
- if (!strcmp(name, "vkGetPhysicalDeviceDisplayPropertiesKHR"))
if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPropertiesKHR;
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
On Tue, Mar 27, 2018 at 3:35 PM, Józef Kucia joseph.kucia@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@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@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"))
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;return vulkan_funcs->p_vkCreateDisplayPlaneSurfaceKHR;
- if (!strcmp(name, "vkGetDisplayModePropertiesKHR"))
return vulkan_funcs->p_vkGetDisplayModePropertiesKHR;
- if (!strcmp(name, "vkGetDisplayPlaneCapabilitiesKHR"))
return vulkan_funcs->p_vkGetDisplayPlaneCapabilitiesKHR;
- if (!strcmp(name, "vkGetDisplayPlaneSupportedDisplaysKHR"))
if (!strcmp(name, "GetInstanceProcAddr")) return vulkan_funcs->p_vkGetInstanceProcAddr;return vulkan_funcs->p_vkGetDisplayPlaneSupportedDisplaysKHR;
- if (!strcmp(name, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"))
return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
- if (!strcmp(name, "vkGetPhysicalDeviceDisplayPropertiesKHR"))
if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilitiesKHR")) return vulkan_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; if (!strcmp(name, "GetPhysicalDeviceSurfaceFormatsKHR"))return vulkan_funcs->p_vkGetPhysicalDeviceDisplayPropertiesKHR;
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
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com --- configure.ac | 1 + dlls/vulkan-1/Makefile.in | 6 ++ dlls/vulkan-1/version.rc | 27 ++++++++ dlls/vulkan-1/vulkan-1.spec | 158 ++++++++++++++++++++++++++++++++++++++++++++ dlls/vulkan-1/vulkan.c | 70 ++++++++++++++++++++ dlls/winevulkan/make_vulkan | 81 ++++++++++++++++++++--- 6 files changed, 335 insertions(+), 8 deletions(-) create mode 100644 dlls/vulkan-1/Makefile.in create mode 100644 dlls/vulkan-1/version.rc create mode 100644 dlls/vulkan-1/vulkan-1.spec create mode 100644 dlls/vulkan-1/vulkan.c
diff --git a/configure.ac b/configure.ac index 6a30601ca0..60c410c1f1 100644 --- a/configure.ac +++ b/configure.ac @@ -3692,6 +3692,7 @@ WINE_CONFIG_MAKEFILE(dlls/vnbt.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/vnetbios.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/vssapi) WINE_CONFIG_MAKEFILE(dlls/vtdapi.vxd,enable_win16) +WINE_CONFIG_MAKEFILE(dlls/vulkan-1) WINE_CONFIG_MAKEFILE(dlls/vwin32.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/w32skrnl,enable_win16) WINE_CONFIG_MAKEFILE(dlls/w32sys.dll16,enable_win16) diff --git a/dlls/vulkan-1/Makefile.in b/dlls/vulkan-1/Makefile.in new file mode 100644 index 0000000000..e137fd277f --- /dev/null +++ b/dlls/vulkan-1/Makefile.in @@ -0,0 +1,6 @@ +MODULE = vulkan-1.dll + +C_SRCS = \ + vulkan.c + +RC_SRCS = version.rc diff --git a/dlls/vulkan-1/version.rc b/dlls/vulkan-1/version.rc new file mode 100644 index 0000000000..ec75462ddf --- /dev/null +++ b/dlls/vulkan-1/version.rc @@ -0,0 +1,27 @@ +/* + * Copyright 2018 Roderick Colenbrander + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" /* Needed to get PACKAGE_VERSION */ + +#define WINE_FILEDESCRIPTION_STR "Wine Vulkan Loader" +#define WINE_FILENAME_STR "vulkan-1.dll" +#define WINE_FILEVERSION_STR PACKAGE_VERSION +#define WINE_PRODUCTVERSION_STR PACKAGE_VERSION +#define WINE_PRODUCTNAME_STR "Wine Vulkan" + +#include "wine/wine_common_ver.rc" diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec new file mode 100644 index 0000000000..088a3f23ac --- /dev/null +++ b/dlls/vulkan-1/vulkan-1.spec @@ -0,0 +1,158 @@ +# Automatically generated from Vulkan vk.xml; DO NOT EDIT! + +@ stub vkAcquireNextImageKHR +@ stub vkAllocateCommandBuffers +@ stub vkAllocateDescriptorSets +@ stub vkAllocateMemory +@ stub vkBeginCommandBuffer +@ stub vkBindBufferMemory +@ stub vkBindImageMemory +@ stub vkCmdBeginQuery +@ stub vkCmdBeginRenderPass +@ stub vkCmdBindDescriptorSets +@ stub vkCmdBindIndexBuffer +@ stub vkCmdBindPipeline +@ stub vkCmdBindVertexBuffers +@ stub vkCmdBlitImage +@ stub vkCmdClearAttachments +@ stub vkCmdClearColorImage +@ stub vkCmdClearDepthStencilImage +@ stub vkCmdCopyBuffer +@ stub vkCmdCopyBufferToImage +@ stub vkCmdCopyImage +@ stub vkCmdCopyImageToBuffer +@ stub vkCmdCopyQueryPoolResults +@ stub vkCmdDispatch +@ stub vkCmdDispatchIndirect +@ stub vkCmdDraw +@ stub vkCmdDrawIndexed +@ stub vkCmdDrawIndexedIndirect +@ stub vkCmdDrawIndirect +@ stub vkCmdEndQuery +@ stub vkCmdEndRenderPass +@ stub vkCmdExecuteCommands +@ stub vkCmdFillBuffer +@ stub vkCmdNextSubpass +@ stub vkCmdPipelineBarrier +@ stub vkCmdPushConstants +@ stub vkCmdResetEvent +@ stub vkCmdResetQueryPool +@ stub vkCmdResolveImage +@ stub vkCmdSetBlendConstants +@ stub vkCmdSetDepthBias +@ stub vkCmdSetDepthBounds +@ stub vkCmdSetEvent +@ stub vkCmdSetLineWidth +@ stub vkCmdSetScissor +@ stub vkCmdSetStencilCompareMask +@ stub vkCmdSetStencilReference +@ stub vkCmdSetStencilWriteMask +@ stub vkCmdSetViewport +@ stub vkCmdUpdateBuffer +@ stub vkCmdWaitEvents +@ stub vkCmdWriteTimestamp +@ stub vkCreateBuffer +@ stub vkCreateBufferView +@ stub vkCreateCommandPool +@ stub vkCreateComputePipelines +@ stub vkCreateDescriptorPool +@ stub vkCreateDescriptorSetLayout +@ stub vkCreateDevice +@ stub vkCreateDisplayModeKHR +@ stub vkCreateDisplayPlaneSurfaceKHR +@ stub vkCreateEvent +@ stub vkCreateFence +@ stub vkCreateFramebuffer +@ stub vkCreateGraphicsPipelines +@ stub vkCreateImage +@ stub vkCreateImageView +@ stdcall vkCreateInstance(ptr ptr ptr) +@ stub vkCreatePipelineCache +@ stub vkCreatePipelineLayout +@ stub vkCreateQueryPool +@ stub vkCreateRenderPass +@ stub vkCreateSampler +@ stub vkCreateSemaphore +@ stub vkCreateShaderModule +@ stub vkCreateSwapchainKHR +@ stub vkCreateWin32SurfaceKHR +@ stub vkDestroyBuffer +@ stub vkDestroyBufferView +@ stub vkDestroyCommandPool +@ stub vkDestroyDescriptorPool +@ stub vkDestroyDescriptorSetLayout +@ stub vkDestroyDevice +@ stub vkDestroyEvent +@ stub vkDestroyFence +@ stub vkDestroyFramebuffer +@ stub vkDestroyImage +@ stub vkDestroyImageView +@ stub vkDestroyInstance +@ stub vkDestroyPipeline +@ stub vkDestroyPipelineCache +@ stub vkDestroyPipelineLayout +@ stub vkDestroyQueryPool +@ stub vkDestroyRenderPass +@ stub vkDestroySampler +@ stub vkDestroySemaphore +@ stub vkDestroyShaderModule +@ stub vkDestroySurfaceKHR +@ stub vkDestroySwapchainKHR +@ stub vkDeviceWaitIdle +@ stub vkEndCommandBuffer +@ stub vkEnumerateDeviceExtensionProperties +@ stub vkEnumerateDeviceLayerProperties +@ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr) +@ stdcall vkEnumerateInstanceLayerProperties(ptr ptr) +@ stub vkEnumeratePhysicalDevices +@ stub vkFlushMappedMemoryRanges +@ stub vkFreeCommandBuffers +@ stub vkFreeDescriptorSets +@ stub vkFreeMemory +@ stub vkGetBufferMemoryRequirements +@ stub vkGetDeviceMemoryCommitment +@ stub vkGetDeviceProcAddr +@ stub vkGetDeviceQueue +@ stub vkGetDisplayModePropertiesKHR +@ stub vkGetDisplayPlaneCapabilitiesKHR +@ stub vkGetDisplayPlaneSupportedDisplaysKHR +@ stub vkGetEventStatus +@ stub vkGetFenceStatus +@ stub vkGetImageMemoryRequirements +@ stub vkGetImageSparseMemoryRequirements +@ stub vkGetImageSubresourceLayout +@ stdcall vkGetInstanceProcAddr(ptr str) +@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR +@ stub vkGetPhysicalDeviceDisplayPropertiesKHR +@ stub vkGetPhysicalDeviceFeatures +@ stub vkGetPhysicalDeviceFormatProperties +@ stub vkGetPhysicalDeviceImageFormatProperties +@ stub vkGetPhysicalDeviceMemoryProperties +@ stub vkGetPhysicalDeviceProperties +@ stub vkGetPhysicalDeviceQueueFamilyProperties +@ stub vkGetPhysicalDeviceSparseImageFormatProperties +@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR +@ stub vkGetPhysicalDeviceSurfaceFormatsKHR +@ stub vkGetPhysicalDeviceSurfacePresentModesKHR +@ stub vkGetPhysicalDeviceSurfaceSupportKHR +@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR +@ stub vkGetPipelineCacheData +@ stub vkGetQueryPoolResults +@ stub vkGetRenderAreaGranularity +@ stub vkGetSwapchainImagesKHR +@ stub vkInvalidateMappedMemoryRanges +@ stub vkMapMemory +@ stub vkMergePipelineCaches +@ stub vkQueueBindSparse +@ stub vkQueuePresentKHR +@ stub vkQueueSubmit +@ stub vkQueueWaitIdle +@ stub vkResetCommandBuffer +@ stub vkResetCommandPool +@ stub vkResetDescriptorPool +@ stub vkResetEvent +@ stub vkResetFences +@ stub vkSetEvent +@ stub vkUnmapMemory +@ stub vkUpdateDescriptorSets +@ stub vkWaitForFences diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c new file mode 100644 index 0000000000..b8db08a312 --- /dev/null +++ b/dlls/vulkan-1/vulkan.c @@ -0,0 +1,70 @@ +/* Wine Vulkan loader implementation + * + * Copyright 2018 Roderick Colenbrander + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" + +#include "wine/debug.h" +#include "wine/vulkan.h" + +WINE_DEFAULT_DEBUG_CHANNEL(vulkan); + +VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, + const VkAllocationCallbacks *allocator, VkInstance *instance) +{ + FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); + return VK_ERROR_OUT_OF_HOST_MEMORY; +} + +VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, + uint32_t *count, VkExtensionProperties *properties) +{ + FIXME("stub: %p %p %p\n", layer_name, count, properties); + return VK_ERROR_OUT_OF_HOST_MEMORY; +} + +VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) +{ + TRACE("%p, %p\n", count, properties); + + /* We don't support any layers. */ + *count = 0; + return VK_SUCCESS; +} + +PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char *name) +{ + FIXME("stub: %p %s\n", instance, debugstr_a(name)); + return NULL; +} + +BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +{ + TRACE("(%p, %u, %p)\n", hinst, reason, reserved); + + switch (reason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinst); + return TRUE; + } + return TRUE; +} diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index bb02b2aa92..b7b37f42cc 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -65,6 +65,7 @@ LOGGER.addHandler(logging.StreamHandler()) # Filenames to create. WINE_VULKAN_H = "../../include/wine/vulkan.h" WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h" +WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec" WINE_VULKAN_THUNKS_C = "vulkan_thunks.c" WINE_VULKAN_THUNKS_H = "vulkan_thunks.h"
@@ -107,6 +108,15 @@ BLACKLISTED_EXTENSIONS = [ "VK_NV_external_memory_win32" ]
+# The Vulkan provides entry-points for core functionality and some important +# extension. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51. +CORE_EXTENSIONS = [ + "VK_KHR_display", + "VK_KHR_surface", + "VK_KHR_swapchain", + "VK_KHR_win32_surface" +] + # Functions part of our winevulkan graphics driver interface. # DRIVER_VERSION should be bumped on any change to driver interface # in FUNCTION_OVERRIDES @@ -382,6 +392,21 @@ class VkFunction(object):
return conversions
+ def is_core_func(self): + """ Returns if the function is a Vulkan core function. + We consider core functions to be functions any global, instance or + device functions not belonging to an extension in addition to a few + KHR WSI extensions exported by the loader. + """ + + if self.extension is None: + return True + + if self.extension in CORE_EXTENSIONS: + return True + + return False + def is_device_func(self): # If none of the other, it must be a device function return not self.is_global_func() and not self.is_instance_func() @@ -555,6 +580,11 @@ class VkFunction(object):
return body
+ def spec(self): + """ Generate spec file entry for this function. """ + params = " ".join([p.spec() for p in self.params]) + return "@ stdcall {0}({1})\n".format(self.name, params) + def stub(self, call_conv=None, prefix=None): stub = self.prototype(call_conv=call_conv, prefix=prefix) stub += "\n{\n" @@ -1300,6 +1330,28 @@ class VkParam(object): def needs_output_conversion(self): return self.output_conv is not None
+ def spec(self): + """ Generate spec file entry for this parameter. """ + + if self.type_info["category"] == "bitmask": + return "long" + if self.type_info["category"] == "enum": + return "long" + if self.is_pointer() and self.type == "char": + return "str" + if self.is_dispatchable() or self.is_pointer() or self.is_static_array(): + return "ptr" + if self.is_handle() and not self.is_dispatchable(): + return "int64" + if self.type == "float": + return "float" + if self.type in ["int", "int32_t", "size_t", "uint32_t", "VkBool32"]: + return "long" + if self.type in ["uint64_t", "VkDeviceSize"]: + return "int64" + + LOGGER.error("Unhandled spec conversion for type: {0}".format(self.type)) + def variable(self, conv=False): """ Returns 'glue' code during generation of a function call on how to access the variable. This function handles various scenarios such as 'unwrapping' if dispatchable objects and @@ -2061,6 +2113,17 @@ class VkGenerator(object): f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n") f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
+ def generate_vulkan_loader_spec(self, f): + f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n") + + for func in self.registry.funcs.values(): + if not func.is_core_func(): + continue + + if func.is_global_func(): + f.write(func.spec()) + else: + f.write("@ stub {0}\n".format(func.name))
class VkRegistry(object): def __init__(self, reg_filename): @@ -2201,6 +2264,13 @@ class VkRegistry(object): for ext in exts: ext_name = ext.attrib["name"]
+ # Set extension name on any functions calls part of this extension as we + # were not aware of the name during initial parsing. + commands = ext.findall("require/command") + for command in commands: + cmd_name = command.attrib["name"] + self.funcs[cmd_name].extension = ext_name + # Some extensions are not ready or have numbers reserved as a place holder. if ext.attrib["supported"] == "disabled": LOGGER.debug("Skipping disabled extension: {0}".format(ext_name)) @@ -2267,20 +2337,12 @@ class VkRegistry(object): ext_info = {"name" : ext_name, "type" : ext_type} extensions.append(ext_info)
- commands = ext.findall("require/command") - if not commands: - continue - # Pull in any commands we need. We infer types to pull in from the command # as well. for command in commands: cmd_name = command.attrib["name"] self._mark_command_required(cmd_name)
- # Set extension name on the function call as we were not aware of the - # name during initial parsing. - self.funcs[cmd_name].extension = ext_name - # Sort in alphabetical order. self.extensions = sorted(extensions, key=lambda ext: ext["name"])
@@ -2444,5 +2506,8 @@ def main(): with open(WINE_VULKAN_THUNKS_C, "w") as f: generator.generate_thunks_c(f, "wine_")
+ with open(WINE_VULKAN_LOADER_SPEC, "w") as f: + generator.generate_vulkan_loader_spec(f) + if __name__ == "__main__": main()
On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com
configure.ac | 1 + dlls/vulkan-1/Makefile.in | 6 ++ dlls/vulkan-1/version.rc | 27 ++++++++ dlls/vulkan-1/vulkan-1.spec | 158 ++++++++++++++++++++++++++++++++++++++++++++ dlls/vulkan-1/vulkan.c | 70 ++++++++++++++++++++ dlls/winevulkan/make_vulkan | 81 ++++++++++++++++++++--- 6 files changed, 335 insertions(+), 8 deletions(-) create mode 100644 dlls/vulkan-1/Makefile.in create mode 100644 dlls/vulkan-1/version.rc create mode 100644 dlls/vulkan-1/vulkan-1.spec create mode 100644 dlls/vulkan-1/vulkan.c
diff --git a/configure.ac b/configure.ac index 6a30601ca0..60c410c1f1 100644 --- a/configure.ac +++ b/configure.ac @@ -3692,6 +3692,7 @@ WINE_CONFIG_MAKEFILE(dlls/vnbt.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/vnetbios.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/vssapi) WINE_CONFIG_MAKEFILE(dlls/vtdapi.vxd,enable_win16) +WINE_CONFIG_MAKEFILE(dlls/vulkan-1) WINE_CONFIG_MAKEFILE(dlls/vwin32.vxd,enable_win16) WINE_CONFIG_MAKEFILE(dlls/w32skrnl,enable_win16) WINE_CONFIG_MAKEFILE(dlls/w32sys.dll16,enable_win16) diff --git a/dlls/vulkan-1/Makefile.in b/dlls/vulkan-1/Makefile.in new file mode 100644 index 0000000000..e137fd277f --- /dev/null +++ b/dlls/vulkan-1/Makefile.in @@ -0,0 +1,6 @@ +MODULE = vulkan-1.dll
+C_SRCS = \
vulkan.c
+RC_SRCS = version.rc diff --git a/dlls/vulkan-1/version.rc b/dlls/vulkan-1/version.rc new file mode 100644 index 0000000000..ec75462ddf --- /dev/null +++ b/dlls/vulkan-1/version.rc @@ -0,0 +1,27 @@ +/*
- Copyright 2018 Roderick Colenbrander
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
+#include "config.h" /* Needed to get PACKAGE_VERSION */
+#define WINE_FILEDESCRIPTION_STR "Wine Vulkan Loader" +#define WINE_FILENAME_STR "vulkan-1.dll" +#define WINE_FILEVERSION_STR PACKAGE_VERSION +#define WINE_PRODUCTVERSION_STR PACKAGE_VERSION +#define WINE_PRODUCTNAME_STR "Wine Vulkan"
+#include "wine/wine_common_ver.rc" diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec new file mode 100644 index 0000000000..088a3f23ac --- /dev/null +++ b/dlls/vulkan-1/vulkan-1.spec @@ -0,0 +1,158 @@ +# Automatically generated from Vulkan vk.xml; DO NOT EDIT!
+@ stub vkAcquireNextImageKHR +@ stub vkAllocateCommandBuffers +@ stub vkAllocateDescriptorSets +@ stub vkAllocateMemory +@ stub vkBeginCommandBuffer +@ stub vkBindBufferMemory +@ stub vkBindImageMemory +@ stub vkCmdBeginQuery +@ stub vkCmdBeginRenderPass +@ stub vkCmdBindDescriptorSets +@ stub vkCmdBindIndexBuffer +@ stub vkCmdBindPipeline +@ stub vkCmdBindVertexBuffers +@ stub vkCmdBlitImage +@ stub vkCmdClearAttachments +@ stub vkCmdClearColorImage +@ stub vkCmdClearDepthStencilImage +@ stub vkCmdCopyBuffer +@ stub vkCmdCopyBufferToImage +@ stub vkCmdCopyImage +@ stub vkCmdCopyImageToBuffer +@ stub vkCmdCopyQueryPoolResults +@ stub vkCmdDispatch +@ stub vkCmdDispatchIndirect +@ stub vkCmdDraw +@ stub vkCmdDrawIndexed +@ stub vkCmdDrawIndexedIndirect +@ stub vkCmdDrawIndirect +@ stub vkCmdEndQuery +@ stub vkCmdEndRenderPass +@ stub vkCmdExecuteCommands +@ stub vkCmdFillBuffer +@ stub vkCmdNextSubpass +@ stub vkCmdPipelineBarrier +@ stub vkCmdPushConstants +@ stub vkCmdResetEvent +@ stub vkCmdResetQueryPool +@ stub vkCmdResolveImage +@ stub vkCmdSetBlendConstants +@ stub vkCmdSetDepthBias +@ stub vkCmdSetDepthBounds +@ stub vkCmdSetEvent +@ stub vkCmdSetLineWidth +@ stub vkCmdSetScissor +@ stub vkCmdSetStencilCompareMask +@ stub vkCmdSetStencilReference +@ stub vkCmdSetStencilWriteMask +@ stub vkCmdSetViewport +@ stub vkCmdUpdateBuffer +@ stub vkCmdWaitEvents +@ stub vkCmdWriteTimestamp +@ stub vkCreateBuffer +@ stub vkCreateBufferView +@ stub vkCreateCommandPool +@ stub vkCreateComputePipelines +@ stub vkCreateDescriptorPool +@ stub vkCreateDescriptorSetLayout +@ stub vkCreateDevice +@ stub vkCreateDisplayModeKHR +@ stub vkCreateDisplayPlaneSurfaceKHR +@ stub vkCreateEvent +@ stub vkCreateFence +@ stub vkCreateFramebuffer +@ stub vkCreateGraphicsPipelines +@ stub vkCreateImage +@ stub vkCreateImageView +@ stdcall vkCreateInstance(ptr ptr ptr) +@ stub vkCreatePipelineCache +@ stub vkCreatePipelineLayout +@ stub vkCreateQueryPool +@ stub vkCreateRenderPass +@ stub vkCreateSampler +@ stub vkCreateSemaphore +@ stub vkCreateShaderModule +@ stub vkCreateSwapchainKHR +@ stub vkCreateWin32SurfaceKHR +@ stub vkDestroyBuffer +@ stub vkDestroyBufferView +@ stub vkDestroyCommandPool +@ stub vkDestroyDescriptorPool +@ stub vkDestroyDescriptorSetLayout +@ stub vkDestroyDevice +@ stub vkDestroyEvent +@ stub vkDestroyFence +@ stub vkDestroyFramebuffer +@ stub vkDestroyImage +@ stub vkDestroyImageView +@ stub vkDestroyInstance +@ stub vkDestroyPipeline +@ stub vkDestroyPipelineCache +@ stub vkDestroyPipelineLayout +@ stub vkDestroyQueryPool +@ stub vkDestroyRenderPass +@ stub vkDestroySampler +@ stub vkDestroySemaphore +@ stub vkDestroyShaderModule +@ stub vkDestroySurfaceKHR +@ stub vkDestroySwapchainKHR +@ stub vkDeviceWaitIdle +@ stub vkEndCommandBuffer +@ stub vkEnumerateDeviceExtensionProperties +@ stub vkEnumerateDeviceLayerProperties +@ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr) +@ stdcall vkEnumerateInstanceLayerProperties(ptr ptr) +@ stub vkEnumeratePhysicalDevices +@ stub vkFlushMappedMemoryRanges +@ stub vkFreeCommandBuffers +@ stub vkFreeDescriptorSets +@ stub vkFreeMemory +@ stub vkGetBufferMemoryRequirements +@ stub vkGetDeviceMemoryCommitment +@ stub vkGetDeviceProcAddr +@ stub vkGetDeviceQueue +@ stub vkGetDisplayModePropertiesKHR +@ stub vkGetDisplayPlaneCapabilitiesKHR +@ stub vkGetDisplayPlaneSupportedDisplaysKHR +@ stub vkGetEventStatus +@ stub vkGetFenceStatus +@ stub vkGetImageMemoryRequirements +@ stub vkGetImageSparseMemoryRequirements +@ stub vkGetImageSubresourceLayout +@ stdcall vkGetInstanceProcAddr(ptr str) +@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR +@ stub vkGetPhysicalDeviceDisplayPropertiesKHR +@ stub vkGetPhysicalDeviceFeatures +@ stub vkGetPhysicalDeviceFormatProperties +@ stub vkGetPhysicalDeviceImageFormatProperties +@ stub vkGetPhysicalDeviceMemoryProperties +@ stub vkGetPhysicalDeviceProperties +@ stub vkGetPhysicalDeviceQueueFamilyProperties +@ stub vkGetPhysicalDeviceSparseImageFormatProperties +@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR +@ stub vkGetPhysicalDeviceSurfaceFormatsKHR +@ stub vkGetPhysicalDeviceSurfacePresentModesKHR +@ stub vkGetPhysicalDeviceSurfaceSupportKHR +@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR +@ stub vkGetPipelineCacheData +@ stub vkGetQueryPoolResults +@ stub vkGetRenderAreaGranularity +@ stub vkGetSwapchainImagesKHR +@ stub vkInvalidateMappedMemoryRanges +@ stub vkMapMemory +@ stub vkMergePipelineCaches +@ stub vkQueueBindSparse +@ stub vkQueuePresentKHR +@ stub vkQueueSubmit +@ stub vkQueueWaitIdle +@ stub vkResetCommandBuffer +@ stub vkResetCommandPool +@ stub vkResetDescriptorPool +@ stub vkResetEvent +@ stub vkResetFences +@ stub vkSetEvent +@ stub vkUnmapMemory +@ stub vkUpdateDescriptorSets +@ stub vkWaitForFences diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c new file mode 100644 index 0000000000..b8db08a312 --- /dev/null +++ b/dlls/vulkan-1/vulkan.c @@ -0,0 +1,70 @@ +/* Wine Vulkan loader implementation
- Copyright 2018 Roderick Colenbrander
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
+#include <stdarg.h>
+#include "windef.h" +#include "winbase.h"
+#include "wine/debug.h" +#include "wine/vulkan.h"
+WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info,
const VkAllocationCallbacks *allocator, VkInstance *instance)
+{
- FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name,
uint32_t *count, VkExtensionProperties *properties)
+{
- FIXME("stub: %p %p %p\n", layer_name, count, properties);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) +{
- TRACE("%p, %p\n", count, properties);
- /* We don't support any layers. */
- *count = 0;
- return VK_SUCCESS;
+}
+PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char *name) +{
- FIXME("stub: %p %s\n", instance, debugstr_a(name));
- return NULL;
+}
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +{
- TRACE("(%p, %u, %p)\n", hinst, reason, reserved);
- switch (reason)
- {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinst);
return TRUE;
- }
- return TRUE;
+}
I think we should prefer native Vulkan loader.
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index bb02b2aa92..b7b37f42cc 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -65,6 +65,7 @@ LOGGER.addHandler(logging.StreamHandler()) # Filenames to create. WINE_VULKAN_H = "../../include/wine/vulkan.h" WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h" +WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec" WINE_VULKAN_THUNKS_C = "vulkan_thunks.c" WINE_VULKAN_THUNKS_H = "vulkan_thunks.h"
@@ -107,6 +108,15 @@ BLACKLISTED_EXTENSIONS = [ "VK_NV_external_memory_win32" ]
+# The Vulkan provides entry-points for core functionality and some important +# extension. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51. +CORE_EXTENSIONS = [
- "VK_KHR_display",
- "VK_KHR_surface",
- "VK_KHR_swapchain",
- "VK_KHR_win32_surface"
+]
Please add VK_KHR_display_swapchain to "CORE_EXTENSIONS".
# Functions part of our winevulkan graphics driver interface. # DRIVER_VERSION should be bumped on any change to driver interface # in FUNCTION_OVERRIDES @@ -382,6 +392,21 @@ class VkFunction(object):
return conversions
- def is_core_func(self):
""" Returns if the function is a Vulkan core function.
We consider core functions to be functions any global, instance or
device functions not belonging to an extension in addition to a few
KHR WSI extensions exported by the loader.
"""
Please fix the comment above.
if self.extension is None:
return True
if self.extension in CORE_EXTENSIONS:
return True
return False
- def is_device_func(self): # If none of the other, it must be a device function return not self.is_global_func() and not self.is_instance_func()
@@ -555,6 +580,11 @@ class VkFunction(object):
return body
- def spec(self):
""" Generate spec file entry for this function. """
params = " ".join([p.spec() for p in self.params])
return "@ stdcall {0}({1})\n".format(self.name, params)
- def stub(self, call_conv=None, prefix=None): stub = self.prototype(call_conv=call_conv, prefix=prefix) stub += "\n{\n"
@@ -1300,6 +1330,28 @@ class VkParam(object): def needs_output_conversion(self): return self.output_conv is not None
- def spec(self):
""" Generate spec file entry for this parameter. """
if self.type_info["category"] == "bitmask":
return "long"
if self.type_info["category"] == "enum":
return "long"
It could be rewritten as:
if self.type_info["category"] in ["bitmask", "enum"]: return "long"
if self.is_pointer() and self.type == "char":
return "str"
if self.is_dispatchable() or self.is_pointer() or self.is_static_array():
return "ptr"
if self.is_handle() and not self.is_dispatchable():
return "int64"
if self.type == "float":
return "float"
if self.type in ["int", "int32_t", "size_t", "uint32_t", "VkBool32"]:
return "long"
if self.type in ["uint64_t", "VkDeviceSize"]:
return "int64"
LOGGER.error("Unhandled spec conversion for type: {0}".format(self.type))
- def variable(self, conv=False): """ Returns 'glue' code during generation of a function call on how to access the variable. This function handles various scenarios such as 'unwrapping' if dispatchable objects and
@@ -2061,6 +2113,17 @@ class VkGenerator(object): f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n") f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
- def generate_vulkan_loader_spec(self, f):
f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n")
for func in self.registry.funcs.values():
if not func.is_core_func():
continue
if func.is_global_func():
f.write(func.spec())
else:
f.write("@ stub {0}\n".format(func.name))
class VkRegistry(object): def __init__(self, reg_filename): @@ -2201,6 +2264,13 @@ class VkRegistry(object): for ext in exts: ext_name = ext.attrib["name"]
# Set extension name on any functions calls part of this extension as we
# were not aware of the name during initial parsing.
commands = ext.findall("require/command")
for command in commands:
cmd_name = command.attrib["name"]
self.funcs[cmd_name].extension = ext_name
# Some extensions are not ready or have numbers reserved as a place holder. if ext.attrib["supported"] == "disabled": LOGGER.debug("Skipping disabled extension: {0}".format(ext_name))
@@ -2267,20 +2337,12 @@ class VkRegistry(object): ext_info = {"name" : ext_name, "type" : ext_type} extensions.append(ext_info)
commands = ext.findall("require/command")
if not commands:
continue
# Pull in any commands we need. We infer types to pull in from the command # as well. for command in commands: cmd_name = command.attrib["name"] self._mark_command_required(cmd_name)
# Set extension name on the function call as we were not aware of the
# name during initial parsing.
self.funcs[cmd_name].extension = ext_name
# Sort in alphabetical order. self.extensions = sorted(extensions, key=lambda ext: ext["name"])
@@ -2444,5 +2506,8 @@ def main(): with open(WINE_VULKAN_THUNKS_C, "w") as f: generator.generate_thunks_c(f, "wine_")
- with open(WINE_VULKAN_LOADER_SPEC, "w") as f:
generator.generate_vulkan_loader_spec(f)
if __name__ == "__main__": main() -- 2.14.3
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com --- dlls/vulkan-1/vulkan.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index b8db08a312..e3981b63ef 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -27,6 +27,32 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); +static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *); + +static BOOL vk_loader_init(void) +{ + HMODULE icd_handle = NULL; + + icd_handle = LoadLibraryA("winevulkan.dll"); + if (!icd_handle) + { + ERR("Failed to load Vulkan ICD (winevulkan.dll).\n"); + return FALSE; + } + + p_vk_icdGetInstanceProcAddr = (void *)GetProcAddress(icd_handle, "vk_icdGetInstanceProcAddr"); + if (!p_vk_icdGetInstanceProcAddr) + return FALSE; + + p_vkEnumerateInstanceExtensionProperties = p_vk_icdGetInstanceProcAddr(NULL, + "vkEnumerateInstanceExtensionProperties"); + if (!p_vkEnumerateInstanceExtensionProperties) + return FALSE; + + return TRUE; +} + VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) { @@ -37,8 +63,12 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count, VkExtensionProperties *properties) { - FIXME("stub: %p %p %p\n", layer_name, count, properties); - return VK_ERROR_OUT_OF_HOST_MEMORY; + TRACE("%p %p %p\n", layer_name, count, properties); + + if (layer_name) + return VK_ERROR_LAYER_NOT_PRESENT; + + return p_vkEnumerateInstanceExtensionProperties(NULL, count, properties); }
VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) @@ -64,7 +94,7 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinst); - return TRUE; + return vk_loader_init(); } return TRUE; }
On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com
dlls/vulkan-1/vulkan.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index b8db08a312..e3981b63ef 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -27,6 +27,32 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); +static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *);
+static BOOL vk_loader_init(void) +{
- HMODULE icd_handle = NULL;
- icd_handle = LoadLibraryA("winevulkan.dll");
- if (!icd_handle)
- {
ERR("Failed to load Vulkan ICD (winevulkan.dll).\n");
return FALSE;
- }
- p_vk_icdGetInstanceProcAddr = (void *)GetProcAddress(icd_handle, "vk_icdGetInstanceProcAddr");
- if (!p_vk_icdGetInstanceProcAddr)
return FALSE;
Is there a reason to load winevulkan.dll dynamically? We could simplify code by linking to winevulkan.dll. Otherwise, we should probably take care of unloading winevulkan.dll, e.g. in case of failures.
- p_vkEnumerateInstanceExtensionProperties = p_vk_icdGetInstanceProcAddr(NULL,
"vkEnumerateInstanceExtensionProperties");
- if (!p_vkEnumerateInstanceExtensionProperties)
return FALSE;
- return TRUE;
+}
VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) { @@ -37,8 +63,12 @@ VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count, VkExtensionProperties *properties) {
- FIXME("stub: %p %p %p\n", layer_name, count, properties);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
- TRACE("%p %p %p\n", layer_name, count, properties);
- if (layer_name)
return VK_ERROR_LAYER_NOT_PRESENT;
- return p_vkEnumerateInstanceExtensionProperties(NULL, count, properties);
}
VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerProperties *properties) @@ -64,7 +94,7 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinst);
return TRUE;
} return TRUE;return vk_loader_init();
}
2.14.3
On Tue, Mar 27, 2018 at 3:40 PM, Józef Kucia joseph.kucia@gmail.com wrote:
On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com
dlls/vulkan-1/vulkan.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index b8db08a312..e3981b63ef 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -27,6 +27,32 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); +static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *);
+static BOOL vk_loader_init(void) +{
- HMODULE icd_handle = NULL;
- icd_handle = LoadLibraryA("winevulkan.dll");
- if (!icd_handle)
- {
ERR("Failed to load Vulkan ICD (winevulkan.dll).\n");
return FALSE;
- }
- p_vk_icdGetInstanceProcAddr = (void *)GetProcAddress(icd_handle, "vk_icdGetInstanceProcAddr");
- if (!p_vk_icdGetInstanceProcAddr)
return FALSE;
Is there a reason to load winevulkan.dll dynamically? We could simplify code by linking to winevulkan.dll. Otherwise, we should probably take care of unloading winevulkan.dll, e.g. in case of failures.
Linking should be fine I think, easy to change.
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com --- dlls/vulkan-1/vulkan-1.spec | 304 ++++++++++++++++++++++---------------------- dlls/vulkan-1/vulkan.c | 30 ++++- dlls/winevulkan/make_vulkan | 79 +++++++++++- 3 files changed, 255 insertions(+), 158 deletions(-)
diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec index 088a3f23ac..5fed8850e8 100644 --- a/dlls/vulkan-1/vulkan-1.spec +++ b/dlls/vulkan-1/vulkan-1.spec @@ -1,158 +1,158 @@ # Automatically generated from Vulkan vk.xml; DO NOT EDIT!
-@ stub vkAcquireNextImageKHR -@ stub vkAllocateCommandBuffers -@ stub vkAllocateDescriptorSets -@ stub vkAllocateMemory -@ stub vkBeginCommandBuffer -@ stub vkBindBufferMemory -@ stub vkBindImageMemory -@ stub vkCmdBeginQuery -@ stub vkCmdBeginRenderPass -@ stub vkCmdBindDescriptorSets -@ stub vkCmdBindIndexBuffer -@ stub vkCmdBindPipeline -@ stub vkCmdBindVertexBuffers -@ stub vkCmdBlitImage -@ stub vkCmdClearAttachments -@ stub vkCmdClearColorImage -@ stub vkCmdClearDepthStencilImage -@ stub vkCmdCopyBuffer -@ stub vkCmdCopyBufferToImage -@ stub vkCmdCopyImage -@ stub vkCmdCopyImageToBuffer -@ stub vkCmdCopyQueryPoolResults -@ stub vkCmdDispatch -@ stub vkCmdDispatchIndirect -@ stub vkCmdDraw -@ stub vkCmdDrawIndexed -@ stub vkCmdDrawIndexedIndirect -@ stub vkCmdDrawIndirect -@ stub vkCmdEndQuery -@ stub vkCmdEndRenderPass -@ stub vkCmdExecuteCommands -@ stub vkCmdFillBuffer -@ stub vkCmdNextSubpass -@ stub vkCmdPipelineBarrier -@ stub vkCmdPushConstants -@ stub vkCmdResetEvent -@ stub vkCmdResetQueryPool -@ stub vkCmdResolveImage -@ stub vkCmdSetBlendConstants -@ stub vkCmdSetDepthBias -@ stub vkCmdSetDepthBounds -@ stub vkCmdSetEvent -@ stub vkCmdSetLineWidth -@ stub vkCmdSetScissor -@ stub vkCmdSetStencilCompareMask -@ stub vkCmdSetStencilReference -@ stub vkCmdSetStencilWriteMask -@ stub vkCmdSetViewport -@ stub vkCmdUpdateBuffer -@ stub vkCmdWaitEvents -@ stub vkCmdWriteTimestamp -@ stub vkCreateBuffer -@ stub vkCreateBufferView -@ stub vkCreateCommandPool -@ stub vkCreateComputePipelines -@ stub vkCreateDescriptorPool -@ stub vkCreateDescriptorSetLayout -@ stub vkCreateDevice -@ stub vkCreateDisplayModeKHR -@ stub vkCreateDisplayPlaneSurfaceKHR -@ stub vkCreateEvent -@ stub vkCreateFence -@ stub vkCreateFramebuffer -@ stub vkCreateGraphicsPipelines -@ stub vkCreateImage -@ stub vkCreateImageView +@ stdcall vkAcquireNextImageKHR(ptr int64 int64 int64 int64 ptr) +@ stdcall vkAllocateCommandBuffers(ptr ptr ptr) +@ stdcall vkAllocateDescriptorSets(ptr ptr ptr) +@ stdcall vkAllocateMemory(ptr ptr ptr ptr) +@ stdcall vkBeginCommandBuffer(ptr ptr) +@ stdcall vkBindBufferMemory(ptr int64 int64 int64) +@ stdcall vkBindImageMemory(ptr int64 int64 int64) +@ stdcall vkCmdBeginQuery(ptr int64 long long) +@ stdcall vkCmdBeginRenderPass(ptr ptr long) +@ stdcall vkCmdBindDescriptorSets(ptr long int64 long long ptr long ptr) +@ stdcall vkCmdBindIndexBuffer(ptr int64 int64 long) +@ stdcall vkCmdBindPipeline(ptr long int64) +@ stdcall vkCmdBindVertexBuffers(ptr long long ptr ptr) +@ stdcall vkCmdBlitImage(ptr int64 long int64 long long ptr long) +@ stdcall vkCmdClearAttachments(ptr long ptr long ptr) +@ stdcall vkCmdClearColorImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdClearDepthStencilImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdCopyBuffer(ptr int64 int64 long ptr) +@ stdcall vkCmdCopyBufferToImage(ptr int64 int64 long long ptr) +@ stdcall vkCmdCopyImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdCopyImageToBuffer(ptr int64 long int64 long ptr) +@ stdcall vkCmdCopyQueryPoolResults(ptr int64 long long int64 int64 int64 long) +@ stdcall vkCmdDispatch(ptr long long long) +@ stdcall vkCmdDispatchIndirect(ptr int64 int64) +@ stdcall vkCmdDraw(ptr long long long long) +@ stdcall vkCmdDrawIndexed(ptr long long long long long) +@ stdcall vkCmdDrawIndexedIndirect(ptr int64 int64 long long) +@ stdcall vkCmdDrawIndirect(ptr int64 int64 long long) +@ stdcall vkCmdEndQuery(ptr int64 long) +@ stdcall vkCmdEndRenderPass(ptr) +@ stdcall vkCmdExecuteCommands(ptr long ptr) +@ stdcall vkCmdFillBuffer(ptr int64 int64 int64 long) +@ stdcall vkCmdNextSubpass(ptr long) +@ stdcall vkCmdPipelineBarrier(ptr long long long long ptr long ptr long ptr) +@ stdcall vkCmdPushConstants(ptr int64 long long long ptr) +@ stdcall vkCmdResetEvent(ptr int64 long) +@ stdcall vkCmdResetQueryPool(ptr int64 long long) +@ stdcall vkCmdResolveImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdSetBlendConstants(ptr ptr) +@ stdcall vkCmdSetDepthBias(ptr float float float) +@ stdcall vkCmdSetDepthBounds(ptr float float) +@ stdcall vkCmdSetEvent(ptr int64 long) +@ stdcall vkCmdSetLineWidth(ptr float) +@ stdcall vkCmdSetScissor(ptr long long ptr) +@ stdcall vkCmdSetStencilCompareMask(ptr long long) +@ stdcall vkCmdSetStencilReference(ptr long long) +@ stdcall vkCmdSetStencilWriteMask(ptr long long) +@ stdcall vkCmdSetViewport(ptr long long ptr) +@ stdcall vkCmdUpdateBuffer(ptr int64 int64 int64 ptr) +@ stdcall vkCmdWaitEvents(ptr long ptr long long long ptr long ptr long ptr) +@ stdcall vkCmdWriteTimestamp(ptr long int64 long) +@ stdcall vkCreateBuffer(ptr ptr ptr ptr) +@ stdcall vkCreateBufferView(ptr ptr ptr ptr) +@ stdcall vkCreateCommandPool(ptr ptr ptr ptr) +@ stdcall vkCreateComputePipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateDescriptorPool(ptr ptr ptr ptr) +@ stdcall vkCreateDescriptorSetLayout(ptr ptr ptr ptr) +@ stdcall vkCreateDevice(ptr ptr ptr ptr) +@ stdcall vkCreateDisplayModeKHR(ptr int64 ptr ptr ptr) +@ stdcall vkCreateDisplayPlaneSurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkCreateEvent(ptr ptr ptr ptr) +@ stdcall vkCreateFence(ptr ptr ptr ptr) +@ stdcall vkCreateFramebuffer(ptr ptr ptr ptr) +@ stdcall vkCreateGraphicsPipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateImage(ptr ptr ptr ptr) +@ stdcall vkCreateImageView(ptr ptr ptr ptr) @ stdcall vkCreateInstance(ptr ptr ptr) -@ stub vkCreatePipelineCache -@ stub vkCreatePipelineLayout -@ stub vkCreateQueryPool -@ stub vkCreateRenderPass -@ stub vkCreateSampler -@ stub vkCreateSemaphore -@ stub vkCreateShaderModule -@ stub vkCreateSwapchainKHR -@ stub vkCreateWin32SurfaceKHR -@ stub vkDestroyBuffer -@ stub vkDestroyBufferView -@ stub vkDestroyCommandPool -@ stub vkDestroyDescriptorPool -@ stub vkDestroyDescriptorSetLayout -@ stub vkDestroyDevice -@ stub vkDestroyEvent -@ stub vkDestroyFence -@ stub vkDestroyFramebuffer -@ stub vkDestroyImage -@ stub vkDestroyImageView -@ stub vkDestroyInstance -@ stub vkDestroyPipeline -@ stub vkDestroyPipelineCache -@ stub vkDestroyPipelineLayout -@ stub vkDestroyQueryPool -@ stub vkDestroyRenderPass -@ stub vkDestroySampler -@ stub vkDestroySemaphore -@ stub vkDestroyShaderModule -@ stub vkDestroySurfaceKHR -@ stub vkDestroySwapchainKHR -@ stub vkDeviceWaitIdle -@ stub vkEndCommandBuffer -@ stub vkEnumerateDeviceExtensionProperties -@ stub vkEnumerateDeviceLayerProperties +@ stdcall vkCreatePipelineCache(ptr ptr ptr ptr) +@ stdcall vkCreatePipelineLayout(ptr ptr ptr ptr) +@ stdcall vkCreateQueryPool(ptr ptr ptr ptr) +@ stdcall vkCreateRenderPass(ptr ptr ptr ptr) +@ stdcall vkCreateSampler(ptr ptr ptr ptr) +@ stdcall vkCreateSemaphore(ptr ptr ptr ptr) +@ stdcall vkCreateShaderModule(ptr ptr ptr ptr) +@ stdcall vkCreateSwapchainKHR(ptr ptr ptr ptr) +@ stdcall vkCreateWin32SurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkDestroyBuffer(ptr int64 ptr) +@ stdcall vkDestroyBufferView(ptr int64 ptr) +@ stdcall vkDestroyCommandPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorSetLayout(ptr int64 ptr) +@ stdcall vkDestroyDevice(ptr ptr) +@ stdcall vkDestroyEvent(ptr int64 ptr) +@ stdcall vkDestroyFence(ptr int64 ptr) +@ stdcall vkDestroyFramebuffer(ptr int64 ptr) +@ stdcall vkDestroyImage(ptr int64 ptr) +@ stdcall vkDestroyImageView(ptr int64 ptr) +@ stdcall vkDestroyInstance(ptr ptr) +@ stdcall vkDestroyPipeline(ptr int64 ptr) +@ stdcall vkDestroyPipelineCache(ptr int64 ptr) +@ stdcall vkDestroyPipelineLayout(ptr int64 ptr) +@ stdcall vkDestroyQueryPool(ptr int64 ptr) +@ stdcall vkDestroyRenderPass(ptr int64 ptr) +@ stdcall vkDestroySampler(ptr int64 ptr) +@ stdcall vkDestroySemaphore(ptr int64 ptr) +@ stdcall vkDestroyShaderModule(ptr int64 ptr) +@ stdcall vkDestroySurfaceKHR(ptr int64 ptr) +@ stdcall vkDestroySwapchainKHR(ptr int64 ptr) +@ stdcall vkDeviceWaitIdle(ptr) +@ stdcall vkEndCommandBuffer(ptr) +@ stdcall vkEnumerateDeviceExtensionProperties(ptr str ptr ptr) +@ stdcall vkEnumerateDeviceLayerProperties(ptr ptr ptr) @ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr) @ stdcall vkEnumerateInstanceLayerProperties(ptr ptr) -@ stub vkEnumeratePhysicalDevices -@ stub vkFlushMappedMemoryRanges -@ stub vkFreeCommandBuffers -@ stub vkFreeDescriptorSets -@ stub vkFreeMemory -@ stub vkGetBufferMemoryRequirements -@ stub vkGetDeviceMemoryCommitment -@ stub vkGetDeviceProcAddr -@ stub vkGetDeviceQueue -@ stub vkGetDisplayModePropertiesKHR -@ stub vkGetDisplayPlaneCapabilitiesKHR -@ stub vkGetDisplayPlaneSupportedDisplaysKHR -@ stub vkGetEventStatus -@ stub vkGetFenceStatus -@ stub vkGetImageMemoryRequirements -@ stub vkGetImageSparseMemoryRequirements -@ stub vkGetImageSubresourceLayout +@ stdcall vkEnumeratePhysicalDevices(ptr ptr ptr) +@ stdcall vkFlushMappedMemoryRanges(ptr long ptr) +@ stdcall vkFreeCommandBuffers(ptr int64 long ptr) +@ stdcall vkFreeDescriptorSets(ptr int64 long ptr) +@ stdcall vkFreeMemory(ptr int64 ptr) +@ stdcall vkGetBufferMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetDeviceMemoryCommitment(ptr int64 ptr) +@ stdcall vkGetDeviceProcAddr(ptr str) +@ stdcall vkGetDeviceQueue(ptr long long ptr) +@ stdcall vkGetDisplayModePropertiesKHR(ptr int64 ptr ptr) +@ stdcall vkGetDisplayPlaneCapabilitiesKHR(ptr int64 long ptr) +@ stdcall vkGetDisplayPlaneSupportedDisplaysKHR(ptr long ptr ptr) +@ stdcall vkGetEventStatus(ptr int64) +@ stdcall vkGetFenceStatus(ptr int64) +@ stdcall vkGetImageMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetImageSparseMemoryRequirements(ptr int64 ptr ptr) +@ stdcall vkGetImageSubresourceLayout(ptr int64 ptr ptr) @ stdcall vkGetInstanceProcAddr(ptr str) -@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR -@ stub vkGetPhysicalDeviceDisplayPropertiesKHR -@ stub vkGetPhysicalDeviceFeatures -@ stub vkGetPhysicalDeviceFormatProperties -@ stub vkGetPhysicalDeviceImageFormatProperties -@ stub vkGetPhysicalDeviceMemoryProperties -@ stub vkGetPhysicalDeviceProperties -@ stub vkGetPhysicalDeviceQueueFamilyProperties -@ stub vkGetPhysicalDeviceSparseImageFormatProperties -@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR -@ stub vkGetPhysicalDeviceSurfaceFormatsKHR -@ stub vkGetPhysicalDeviceSurfacePresentModesKHR -@ stub vkGetPhysicalDeviceSurfaceSupportKHR -@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR -@ stub vkGetPipelineCacheData -@ stub vkGetQueryPoolResults -@ stub vkGetRenderAreaGranularity -@ stub vkGetSwapchainImagesKHR -@ stub vkInvalidateMappedMemoryRanges -@ stub vkMapMemory -@ stub vkMergePipelineCaches -@ stub vkQueueBindSparse -@ stub vkQueuePresentKHR -@ stub vkQueueSubmit -@ stub vkQueueWaitIdle -@ stub vkResetCommandBuffer -@ stub vkResetCommandPool -@ stub vkResetDescriptorPool -@ stub vkResetEvent -@ stub vkResetFences -@ stub vkSetEvent -@ stub vkUnmapMemory -@ stub vkUpdateDescriptorSets -@ stub vkWaitForFences +@ stdcall vkGetPhysicalDeviceDisplayPlanePropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceDisplayPropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceFeatures(ptr ptr) +@ stdcall vkGetPhysicalDeviceFormatProperties(ptr long ptr) +@ stdcall vkGetPhysicalDeviceImageFormatProperties(ptr long long long long long ptr) +@ stdcall vkGetPhysicalDeviceMemoryProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceQueueFamilyProperties(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceSparseImageFormatProperties(ptr long long long long long ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfaceCapabilitiesKHR(ptr int64 ptr) +@ stdcall vkGetPhysicalDeviceSurfaceFormatsKHR(ptr int64 ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfacePresentModesKHR(ptr int64 ptr long) +@ stdcall vkGetPhysicalDeviceSurfaceSupportKHR(ptr long int64 ptr) +@ stdcall vkGetPhysicalDeviceWin32PresentationSupportKHR(ptr long) +@ stdcall vkGetPipelineCacheData(ptr int64 ptr ptr) +@ stdcall vkGetQueryPoolResults(ptr int64 long long long ptr int64 long) +@ stdcall vkGetRenderAreaGranularity(ptr int64 ptr) +@ stdcall vkGetSwapchainImagesKHR(ptr int64 ptr ptr) +@ stdcall vkInvalidateMappedMemoryRanges(ptr long ptr) +@ stdcall vkMapMemory(ptr int64 int64 int64 long ptr) +@ stdcall vkMergePipelineCaches(ptr int64 long ptr) +@ stdcall vkQueueBindSparse(ptr long ptr int64) +@ stdcall vkQueuePresentKHR(ptr ptr) +@ stdcall vkQueueSubmit(ptr long ptr int64) +@ stdcall vkQueueWaitIdle(ptr) +@ stdcall vkResetCommandBuffer(ptr long) +@ stdcall vkResetCommandPool(ptr int64 long) +@ stdcall vkResetDescriptorPool(ptr int64 long) +@ stdcall vkResetEvent(ptr int64) +@ stdcall vkResetFences(ptr long ptr) +@ stdcall vkSetEvent(ptr int64) +@ stdcall vkUnmapMemory(ptr int64) +@ stdcall vkUpdateDescriptorSets(ptr long ptr long ptr) +@ stdcall vkWaitForFences(ptr long ptr long int64) diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index e3981b63ef..879504f6ee 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -24,12 +24,16 @@
#include "wine/debug.h" #include "wine/vulkan.h" +#include "vulkan_thunks.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *);
+struct vulkan_funcs vk_funcs; + static BOOL vk_loader_init(void) { HMODULE icd_handle = NULL; @@ -45,6 +49,10 @@ static BOOL vk_loader_init(void) if (!p_vk_icdGetInstanceProcAddr) return FALSE;
+ p_vkCreateInstance = p_vk_icdGetInstanceProcAddr(NULL, "vkCreateInstance"); + if (!p_vkCreateInstance) + return FALSE; + p_vkEnumerateInstanceExtensionProperties = p_vk_icdGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); if (!p_vkEnumerateInstanceExtensionProperties) @@ -56,8 +64,26 @@ static BOOL vk_loader_init(void) VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) { - FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); - return VK_ERROR_OUT_OF_HOST_MEMORY; + VkResult res; + TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); + + res = p_vkCreateInstance(create_info, allocator, instance); + if (res != VK_SUCCESS) + return res; + + /* Winevulkan function pointers are generic and can thus be shared. + * There is no need to store a dispatch table at start of 'instance' like + * the official Vulkan loader does. + */ + if (!vk_funcs.p_vkGetInstanceProcAddr) + { + TRACE("Loading Vulkan Core functions\n"); +#define USE_VK_FUNC(name) vk_funcs.p_##name = (void *)p_vk_icdGetInstanceProcAddr(*instance, #name); + ALL_VK_CORE_FUNCS() +#undef USE_VK_FUNC + } + + return res; }
VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index b7b37f42cc..5b11d875c0 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -65,6 +65,8 @@ LOGGER.addHandler(logging.StreamHandler()) # Filenames to create. WINE_VULKAN_H = "../../include/wine/vulkan.h" WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h" +WINE_VULKAN_LOADER_C = "../vulkan-1/vulkan_thunks.c" +WINE_VULKAN_LOADER_H = "../vulkan-1/vulkan_thunks.h" WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec" WINE_VULKAN_THUNKS_C = "vulkan_thunks.c" WINE_VULKAN_THUNKS_H = "vulkan_thunks.h" @@ -600,6 +602,21 @@ class VkFunction(object): stub += "}\n\n" return stub
+ def loader_thunk(self, call_conv=None, prefix=None): + thunk = self.prototype(call_conv=call_conv, prefix=prefix) + thunk += "\n{\n" + thunk += " {0}".format(self.trace()) + + params = ", ".join([p.name for p in self.params]) + + if self.type != "void": + thunk += " return vk_funcs.p_{0}({1});\n".format(self.name, params) + else: + thunk += " vk_funcs.p_{0}({1});\n".format(self.name, params) + + thunk += "}\n\n" + return thunk + def thunk(self, call_conv=None, prefix=None): thunk = self.prototype(call_conv=call_conv, prefix=prefix) thunk += "\n{\n" @@ -2113,6 +2130,57 @@ class VkGenerator(object): f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n") f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
+ def generate_vulkan_loader_c(self, f): + f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n") + + f.write("#include "config.h"\n") + f.write("#include "wine/port.h"\n\n") + + f.write("#include "wine/debug.h"\n") + f.write("#include "wine/vulkan.h"\n") + f.write("#include "vulkan_thunks.h"\n\n") + + f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n") + + for func in self.registry.funcs.values(): + if not func.is_required(): + continue + + # Global functions need custom implementation. + if func.is_global_func(): + continue + + if not func.is_core_func(): + continue + + f.write(func.loader_thunk(call_conv="WINAPI")) + + def generate_vulkan_loader_h(self, f): + f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n") + + f.write("struct vulkan_funcs\n{\n") + for func in self.registry.funcs.values(): + if not func.is_core_func(): + continue + + f.write(" {0};\n".format(func.pfn(call_conv="WINAPI"))) + f.write("};\n\n") + + f.write("#define ALL_VK_CORE_FUNCS() \\n") + first = True + for func in self.registry.funcs.values(): + if not func.is_core_func(): + continue + + if first: + f.write(" USE_VK_FUNC({0})".format(func.name)) + first = False + else: + f.write(" \\n USE_VK_FUNC({0})".format(func.name)) + f.write("\n\n") + + f.write("extern struct vulkan_funcs vk_funcs DECLSPEC_HIDDEN;\n") + def generate_vulkan_loader_spec(self, f): f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n")
@@ -2120,10 +2188,7 @@ class VkGenerator(object): if not func.is_core_func(): continue
- if func.is_global_func(): - f.write(func.spec()) - else: - f.write("@ stub {0}\n".format(func.name)) + f.write(func.spec())
class VkRegistry(object): def __init__(self, reg_filename): @@ -2506,6 +2571,12 @@ def main(): with open(WINE_VULKAN_THUNKS_C, "w") as f: generator.generate_thunks_c(f, "wine_")
+ with open(WINE_VULKAN_LOADER_C, "w") as f: + generator.generate_vulkan_loader_c(f) + + with open(WINE_VULKAN_LOADER_H, "w") as f: + generator.generate_vulkan_loader_h(f) + with open(WINE_VULKAN_LOADER_SPEC, "w") as f: generator.generate_vulkan_loader_spec(f)
I wonder if we can simplify our Vulkan loader further. We could potentially export all core Vulkan functions from winevulkan.dll with the "wine_" prefix. The Vulkan loader documentation allows exporting Vulkan functions from ICD under different names. It would allow us to simply forward most of the functions directly to winevulkan.dll (even in the spec file). The proposed solution would make our vulkan-1.dll really minimal and simple, and would also avoid the race condition mentioned in the comment below. Thoughts?
On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com
dlls/vulkan-1/vulkan-1.spec | 304 ++++++++++++++++++++++---------------------- dlls/vulkan-1/vulkan.c | 30 ++++- dlls/winevulkan/make_vulkan | 79 +++++++++++- 3 files changed, 255 insertions(+), 158 deletions(-)
diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec index 088a3f23ac..5fed8850e8 100644 --- a/dlls/vulkan-1/vulkan-1.spec +++ b/dlls/vulkan-1/vulkan-1.spec @@ -1,158 +1,158 @@ # Automatically generated from Vulkan vk.xml; DO NOT EDIT!
-@ stub vkAcquireNextImageKHR -@ stub vkAllocateCommandBuffers -@ stub vkAllocateDescriptorSets -@ stub vkAllocateMemory -@ stub vkBeginCommandBuffer -@ stub vkBindBufferMemory -@ stub vkBindImageMemory -@ stub vkCmdBeginQuery -@ stub vkCmdBeginRenderPass -@ stub vkCmdBindDescriptorSets -@ stub vkCmdBindIndexBuffer -@ stub vkCmdBindPipeline -@ stub vkCmdBindVertexBuffers -@ stub vkCmdBlitImage -@ stub vkCmdClearAttachments -@ stub vkCmdClearColorImage -@ stub vkCmdClearDepthStencilImage -@ stub vkCmdCopyBuffer -@ stub vkCmdCopyBufferToImage -@ stub vkCmdCopyImage -@ stub vkCmdCopyImageToBuffer -@ stub vkCmdCopyQueryPoolResults -@ stub vkCmdDispatch -@ stub vkCmdDispatchIndirect -@ stub vkCmdDraw -@ stub vkCmdDrawIndexed -@ stub vkCmdDrawIndexedIndirect -@ stub vkCmdDrawIndirect -@ stub vkCmdEndQuery -@ stub vkCmdEndRenderPass -@ stub vkCmdExecuteCommands -@ stub vkCmdFillBuffer -@ stub vkCmdNextSubpass -@ stub vkCmdPipelineBarrier -@ stub vkCmdPushConstants -@ stub vkCmdResetEvent -@ stub vkCmdResetQueryPool -@ stub vkCmdResolveImage -@ stub vkCmdSetBlendConstants -@ stub vkCmdSetDepthBias -@ stub vkCmdSetDepthBounds -@ stub vkCmdSetEvent -@ stub vkCmdSetLineWidth -@ stub vkCmdSetScissor -@ stub vkCmdSetStencilCompareMask -@ stub vkCmdSetStencilReference -@ stub vkCmdSetStencilWriteMask -@ stub vkCmdSetViewport -@ stub vkCmdUpdateBuffer -@ stub vkCmdWaitEvents -@ stub vkCmdWriteTimestamp -@ stub vkCreateBuffer -@ stub vkCreateBufferView -@ stub vkCreateCommandPool -@ stub vkCreateComputePipelines -@ stub vkCreateDescriptorPool -@ stub vkCreateDescriptorSetLayout -@ stub vkCreateDevice -@ stub vkCreateDisplayModeKHR -@ stub vkCreateDisplayPlaneSurfaceKHR -@ stub vkCreateEvent -@ stub vkCreateFence -@ stub vkCreateFramebuffer -@ stub vkCreateGraphicsPipelines -@ stub vkCreateImage -@ stub vkCreateImageView +@ stdcall vkAcquireNextImageKHR(ptr int64 int64 int64 int64 ptr) +@ stdcall vkAllocateCommandBuffers(ptr ptr ptr) +@ stdcall vkAllocateDescriptorSets(ptr ptr ptr) +@ stdcall vkAllocateMemory(ptr ptr ptr ptr) +@ stdcall vkBeginCommandBuffer(ptr ptr) +@ stdcall vkBindBufferMemory(ptr int64 int64 int64) +@ stdcall vkBindImageMemory(ptr int64 int64 int64) +@ stdcall vkCmdBeginQuery(ptr int64 long long) +@ stdcall vkCmdBeginRenderPass(ptr ptr long) +@ stdcall vkCmdBindDescriptorSets(ptr long int64 long long ptr long ptr) +@ stdcall vkCmdBindIndexBuffer(ptr int64 int64 long) +@ stdcall vkCmdBindPipeline(ptr long int64) +@ stdcall vkCmdBindVertexBuffers(ptr long long ptr ptr) +@ stdcall vkCmdBlitImage(ptr int64 long int64 long long ptr long) +@ stdcall vkCmdClearAttachments(ptr long ptr long ptr) +@ stdcall vkCmdClearColorImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdClearDepthStencilImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdCopyBuffer(ptr int64 int64 long ptr) +@ stdcall vkCmdCopyBufferToImage(ptr int64 int64 long long ptr) +@ stdcall vkCmdCopyImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdCopyImageToBuffer(ptr int64 long int64 long ptr) +@ stdcall vkCmdCopyQueryPoolResults(ptr int64 long long int64 int64 int64 long) +@ stdcall vkCmdDispatch(ptr long long long) +@ stdcall vkCmdDispatchIndirect(ptr int64 int64) +@ stdcall vkCmdDraw(ptr long long long long) +@ stdcall vkCmdDrawIndexed(ptr long long long long long) +@ stdcall vkCmdDrawIndexedIndirect(ptr int64 int64 long long) +@ stdcall vkCmdDrawIndirect(ptr int64 int64 long long) +@ stdcall vkCmdEndQuery(ptr int64 long) +@ stdcall vkCmdEndRenderPass(ptr) +@ stdcall vkCmdExecuteCommands(ptr long ptr) +@ stdcall vkCmdFillBuffer(ptr int64 int64 int64 long) +@ stdcall vkCmdNextSubpass(ptr long) +@ stdcall vkCmdPipelineBarrier(ptr long long long long ptr long ptr long ptr) +@ stdcall vkCmdPushConstants(ptr int64 long long long ptr) +@ stdcall vkCmdResetEvent(ptr int64 long) +@ stdcall vkCmdResetQueryPool(ptr int64 long long) +@ stdcall vkCmdResolveImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdSetBlendConstants(ptr ptr) +@ stdcall vkCmdSetDepthBias(ptr float float float) +@ stdcall vkCmdSetDepthBounds(ptr float float) +@ stdcall vkCmdSetEvent(ptr int64 long) +@ stdcall vkCmdSetLineWidth(ptr float) +@ stdcall vkCmdSetScissor(ptr long long ptr) +@ stdcall vkCmdSetStencilCompareMask(ptr long long) +@ stdcall vkCmdSetStencilReference(ptr long long) +@ stdcall vkCmdSetStencilWriteMask(ptr long long) +@ stdcall vkCmdSetViewport(ptr long long ptr) +@ stdcall vkCmdUpdateBuffer(ptr int64 int64 int64 ptr) +@ stdcall vkCmdWaitEvents(ptr long ptr long long long ptr long ptr long ptr) +@ stdcall vkCmdWriteTimestamp(ptr long int64 long) +@ stdcall vkCreateBuffer(ptr ptr ptr ptr) +@ stdcall vkCreateBufferView(ptr ptr ptr ptr) +@ stdcall vkCreateCommandPool(ptr ptr ptr ptr) +@ stdcall vkCreateComputePipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateDescriptorPool(ptr ptr ptr ptr) +@ stdcall vkCreateDescriptorSetLayout(ptr ptr ptr ptr) +@ stdcall vkCreateDevice(ptr ptr ptr ptr) +@ stdcall vkCreateDisplayModeKHR(ptr int64 ptr ptr ptr) +@ stdcall vkCreateDisplayPlaneSurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkCreateEvent(ptr ptr ptr ptr) +@ stdcall vkCreateFence(ptr ptr ptr ptr) +@ stdcall vkCreateFramebuffer(ptr ptr ptr ptr) +@ stdcall vkCreateGraphicsPipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateImage(ptr ptr ptr ptr) +@ stdcall vkCreateImageView(ptr ptr ptr ptr) @ stdcall vkCreateInstance(ptr ptr ptr) -@ stub vkCreatePipelineCache -@ stub vkCreatePipelineLayout -@ stub vkCreateQueryPool -@ stub vkCreateRenderPass -@ stub vkCreateSampler -@ stub vkCreateSemaphore -@ stub vkCreateShaderModule -@ stub vkCreateSwapchainKHR -@ stub vkCreateWin32SurfaceKHR -@ stub vkDestroyBuffer -@ stub vkDestroyBufferView -@ stub vkDestroyCommandPool -@ stub vkDestroyDescriptorPool -@ stub vkDestroyDescriptorSetLayout -@ stub vkDestroyDevice -@ stub vkDestroyEvent -@ stub vkDestroyFence -@ stub vkDestroyFramebuffer -@ stub vkDestroyImage -@ stub vkDestroyImageView -@ stub vkDestroyInstance -@ stub vkDestroyPipeline -@ stub vkDestroyPipelineCache -@ stub vkDestroyPipelineLayout -@ stub vkDestroyQueryPool -@ stub vkDestroyRenderPass -@ stub vkDestroySampler -@ stub vkDestroySemaphore -@ stub vkDestroyShaderModule -@ stub vkDestroySurfaceKHR -@ stub vkDestroySwapchainKHR -@ stub vkDeviceWaitIdle -@ stub vkEndCommandBuffer -@ stub vkEnumerateDeviceExtensionProperties -@ stub vkEnumerateDeviceLayerProperties +@ stdcall vkCreatePipelineCache(ptr ptr ptr ptr) +@ stdcall vkCreatePipelineLayout(ptr ptr ptr ptr) +@ stdcall vkCreateQueryPool(ptr ptr ptr ptr) +@ stdcall vkCreateRenderPass(ptr ptr ptr ptr) +@ stdcall vkCreateSampler(ptr ptr ptr ptr) +@ stdcall vkCreateSemaphore(ptr ptr ptr ptr) +@ stdcall vkCreateShaderModule(ptr ptr ptr ptr) +@ stdcall vkCreateSwapchainKHR(ptr ptr ptr ptr) +@ stdcall vkCreateWin32SurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkDestroyBuffer(ptr int64 ptr) +@ stdcall vkDestroyBufferView(ptr int64 ptr) +@ stdcall vkDestroyCommandPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorSetLayout(ptr int64 ptr) +@ stdcall vkDestroyDevice(ptr ptr) +@ stdcall vkDestroyEvent(ptr int64 ptr) +@ stdcall vkDestroyFence(ptr int64 ptr) +@ stdcall vkDestroyFramebuffer(ptr int64 ptr) +@ stdcall vkDestroyImage(ptr int64 ptr) +@ stdcall vkDestroyImageView(ptr int64 ptr) +@ stdcall vkDestroyInstance(ptr ptr) +@ stdcall vkDestroyPipeline(ptr int64 ptr) +@ stdcall vkDestroyPipelineCache(ptr int64 ptr) +@ stdcall vkDestroyPipelineLayout(ptr int64 ptr) +@ stdcall vkDestroyQueryPool(ptr int64 ptr) +@ stdcall vkDestroyRenderPass(ptr int64 ptr) +@ stdcall vkDestroySampler(ptr int64 ptr) +@ stdcall vkDestroySemaphore(ptr int64 ptr) +@ stdcall vkDestroyShaderModule(ptr int64 ptr) +@ stdcall vkDestroySurfaceKHR(ptr int64 ptr) +@ stdcall vkDestroySwapchainKHR(ptr int64 ptr) +@ stdcall vkDeviceWaitIdle(ptr) +@ stdcall vkEndCommandBuffer(ptr) +@ stdcall vkEnumerateDeviceExtensionProperties(ptr str ptr ptr) +@ stdcall vkEnumerateDeviceLayerProperties(ptr ptr ptr) @ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr) @ stdcall vkEnumerateInstanceLayerProperties(ptr ptr) -@ stub vkEnumeratePhysicalDevices -@ stub vkFlushMappedMemoryRanges -@ stub vkFreeCommandBuffers -@ stub vkFreeDescriptorSets -@ stub vkFreeMemory -@ stub vkGetBufferMemoryRequirements -@ stub vkGetDeviceMemoryCommitment -@ stub vkGetDeviceProcAddr -@ stub vkGetDeviceQueue -@ stub vkGetDisplayModePropertiesKHR -@ stub vkGetDisplayPlaneCapabilitiesKHR -@ stub vkGetDisplayPlaneSupportedDisplaysKHR -@ stub vkGetEventStatus -@ stub vkGetFenceStatus -@ stub vkGetImageMemoryRequirements -@ stub vkGetImageSparseMemoryRequirements -@ stub vkGetImageSubresourceLayout +@ stdcall vkEnumeratePhysicalDevices(ptr ptr ptr) +@ stdcall vkFlushMappedMemoryRanges(ptr long ptr) +@ stdcall vkFreeCommandBuffers(ptr int64 long ptr) +@ stdcall vkFreeDescriptorSets(ptr int64 long ptr) +@ stdcall vkFreeMemory(ptr int64 ptr) +@ stdcall vkGetBufferMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetDeviceMemoryCommitment(ptr int64 ptr) +@ stdcall vkGetDeviceProcAddr(ptr str) +@ stdcall vkGetDeviceQueue(ptr long long ptr) +@ stdcall vkGetDisplayModePropertiesKHR(ptr int64 ptr ptr) +@ stdcall vkGetDisplayPlaneCapabilitiesKHR(ptr int64 long ptr) +@ stdcall vkGetDisplayPlaneSupportedDisplaysKHR(ptr long ptr ptr) +@ stdcall vkGetEventStatus(ptr int64) +@ stdcall vkGetFenceStatus(ptr int64) +@ stdcall vkGetImageMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetImageSparseMemoryRequirements(ptr int64 ptr ptr) +@ stdcall vkGetImageSubresourceLayout(ptr int64 ptr ptr) @ stdcall vkGetInstanceProcAddr(ptr str) -@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR -@ stub vkGetPhysicalDeviceDisplayPropertiesKHR -@ stub vkGetPhysicalDeviceFeatures -@ stub vkGetPhysicalDeviceFormatProperties -@ stub vkGetPhysicalDeviceImageFormatProperties -@ stub vkGetPhysicalDeviceMemoryProperties -@ stub vkGetPhysicalDeviceProperties -@ stub vkGetPhysicalDeviceQueueFamilyProperties -@ stub vkGetPhysicalDeviceSparseImageFormatProperties -@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR -@ stub vkGetPhysicalDeviceSurfaceFormatsKHR -@ stub vkGetPhysicalDeviceSurfacePresentModesKHR -@ stub vkGetPhysicalDeviceSurfaceSupportKHR -@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR -@ stub vkGetPipelineCacheData -@ stub vkGetQueryPoolResults -@ stub vkGetRenderAreaGranularity -@ stub vkGetSwapchainImagesKHR -@ stub vkInvalidateMappedMemoryRanges -@ stub vkMapMemory -@ stub vkMergePipelineCaches -@ stub vkQueueBindSparse -@ stub vkQueuePresentKHR -@ stub vkQueueSubmit -@ stub vkQueueWaitIdle -@ stub vkResetCommandBuffer -@ stub vkResetCommandPool -@ stub vkResetDescriptorPool -@ stub vkResetEvent -@ stub vkResetFences -@ stub vkSetEvent -@ stub vkUnmapMemory -@ stub vkUpdateDescriptorSets -@ stub vkWaitForFences +@ stdcall vkGetPhysicalDeviceDisplayPlanePropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceDisplayPropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceFeatures(ptr ptr) +@ stdcall vkGetPhysicalDeviceFormatProperties(ptr long ptr) +@ stdcall vkGetPhysicalDeviceImageFormatProperties(ptr long long long long long ptr) +@ stdcall vkGetPhysicalDeviceMemoryProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceQueueFamilyProperties(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceSparseImageFormatProperties(ptr long long long long long ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfaceCapabilitiesKHR(ptr int64 ptr) +@ stdcall vkGetPhysicalDeviceSurfaceFormatsKHR(ptr int64 ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfacePresentModesKHR(ptr int64 ptr long) +@ stdcall vkGetPhysicalDeviceSurfaceSupportKHR(ptr long int64 ptr) +@ stdcall vkGetPhysicalDeviceWin32PresentationSupportKHR(ptr long) +@ stdcall vkGetPipelineCacheData(ptr int64 ptr ptr) +@ stdcall vkGetQueryPoolResults(ptr int64 long long long ptr int64 long) +@ stdcall vkGetRenderAreaGranularity(ptr int64 ptr) +@ stdcall vkGetSwapchainImagesKHR(ptr int64 ptr ptr) +@ stdcall vkInvalidateMappedMemoryRanges(ptr long ptr) +@ stdcall vkMapMemory(ptr int64 int64 int64 long ptr) +@ stdcall vkMergePipelineCaches(ptr int64 long ptr) +@ stdcall vkQueueBindSparse(ptr long ptr int64) +@ stdcall vkQueuePresentKHR(ptr ptr) +@ stdcall vkQueueSubmit(ptr long ptr int64) +@ stdcall vkQueueWaitIdle(ptr) +@ stdcall vkResetCommandBuffer(ptr long) +@ stdcall vkResetCommandPool(ptr int64 long) +@ stdcall vkResetDescriptorPool(ptr int64 long) +@ stdcall vkResetEvent(ptr int64) +@ stdcall vkResetFences(ptr long ptr) +@ stdcall vkSetEvent(ptr int64) +@ stdcall vkUnmapMemory(ptr int64) +@ stdcall vkUpdateDescriptorSets(ptr long ptr long ptr) +@ stdcall vkWaitForFences(ptr long ptr long int64) diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index e3981b63ef..879504f6ee 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -24,12 +24,16 @@
#include "wine/debug.h" #include "wine/vulkan.h" +#include "vulkan_thunks.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *);
+struct vulkan_funcs vk_funcs;
It's slightly confusing to use "vulkan_funcs" name. struct vulkan_funcs is defined in vulkan_driver.h. We could rename it to "loader_vulkan_funcs", or rename the driver struct to driver_vulkan_funcs to improve clarity.
static BOOL vk_loader_init(void) { HMODULE icd_handle = NULL; @@ -45,6 +49,10 @@ static BOOL vk_loader_init(void) if (!p_vk_icdGetInstanceProcAddr) return FALSE;
- p_vkCreateInstance = p_vk_icdGetInstanceProcAddr(NULL, "vkCreateInstance");
- if (!p_vkCreateInstance)
return FALSE;
- p_vkEnumerateInstanceExtensionProperties = p_vk_icdGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); if (!p_vkEnumerateInstanceExtensionProperties)
@@ -56,8 +64,26 @@ static BOOL vk_loader_init(void) VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) {
- FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
- VkResult res;
- TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
- res = p_vkCreateInstance(create_info, allocator, instance);
- if (res != VK_SUCCESS)
return res;
- /* Winevulkan function pointers are generic and can thus be shared.
* There is no need to store a dispatch table at start of 'instance' like
* the official Vulkan loader does.
*/
- if (!vk_funcs.p_vkGetInstanceProcAddr)
- {
TRACE("Loading Vulkan Core functions\n");
+#define USE_VK_FUNC(name) vk_funcs.p_##name = (void *)p_vk_icdGetInstanceProcAddr(*instance, #name);
ALL_VK_CORE_FUNCS()
+#undef USE_VK_FUNC
- }
There is a race condition. Multiple threads can call vkCreateInstance(), and one thread can call vulkan-1.dll thunk before vk_funcs are fully initialized.
- return res;
}
VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index b7b37f42cc..5b11d875c0 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -65,6 +65,8 @@ LOGGER.addHandler(logging.StreamHandler()) # Filenames to create. WINE_VULKAN_H = "../../include/wine/vulkan.h" WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h" +WINE_VULKAN_LOADER_C = "../vulkan-1/vulkan_thunks.c" +WINE_VULKAN_LOADER_H = "../vulkan-1/vulkan_thunks.h" WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec" WINE_VULKAN_THUNKS_C = "vulkan_thunks.c" WINE_VULKAN_THUNKS_H = "vulkan_thunks.h" @@ -600,6 +602,21 @@ class VkFunction(object): stub += "}\n\n" return stub
- def loader_thunk(self, call_conv=None, prefix=None):
thunk = self.prototype(call_conv=call_conv, prefix=prefix)
thunk += "\n{\n"
thunk += " {0}".format(self.trace())
params = ", ".join([p.name for p in self.params])
if self.type != "void":
thunk += " return vk_funcs.p_{0}({1});\n".format(self.name, params)
else:
thunk += " vk_funcs.p_{0}({1});\n".format(self.name, params)
thunk += "}\n\n"
return thunk
- def thunk(self, call_conv=None, prefix=None): thunk = self.prototype(call_conv=call_conv, prefix=prefix) thunk += "\n{\n"
@@ -2113,6 +2130,57 @@ class VkGenerator(object): f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n") f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
- def generate_vulkan_loader_c(self, f):
f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n")
f.write("#include \"config.h\"\n")
f.write("#include \"wine/port.h\"\n\n")
f.write("#include \"wine/debug.h\"\n")
f.write("#include \"wine/vulkan.h\"\n")
f.write("#include \"vulkan_thunks.h\"\n\n")
f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n")
for func in self.registry.funcs.values():
if not func.is_required():
continue
# Global functions need custom implementation.
if func.is_global_func():
continue
if not func.is_core_func():
continue
f.write(func.loader_thunk(call_conv="WINAPI"))
- def generate_vulkan_loader_h(self, f):
f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n")
f.write("struct vulkan_funcs\n{\n")
for func in self.registry.funcs.values():
if not func.is_core_func():
continue
f.write(" {0};\n".format(func.pfn(call_conv="WINAPI")))
f.write("};\n\n")
f.write("#define ALL_VK_CORE_FUNCS() \\\n")
first = True
for func in self.registry.funcs.values():
if not func.is_core_func():
continue
if first:
f.write(" USE_VK_FUNC({0})".format(func.name))
first = False
else:
f.write(" \\\n USE_VK_FUNC({0})".format(func.name))
f.write("\n\n")
f.write("extern struct vulkan_funcs vk_funcs DECLSPEC_HIDDEN;\n")
- def generate_vulkan_loader_spec(self, f): f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n")
@@ -2120,10 +2188,7 @@ class VkGenerator(object): if not func.is_core_func(): continue
if func.is_global_func():
f.write(func.spec())
else:
f.write("@ stub {0}\n".format(func.name))
f.write(func.spec())
class VkRegistry(object): def __init__(self, reg_filename): @@ -2506,6 +2571,12 @@ def main(): with open(WINE_VULKAN_THUNKS_C, "w") as f: generator.generate_thunks_c(f, "wine_")
- with open(WINE_VULKAN_LOADER_C, "w") as f:
generator.generate_vulkan_loader_c(f)
- with open(WINE_VULKAN_LOADER_H, "w") as f:
generator.generate_vulkan_loader_h(f)
- with open(WINE_VULKAN_LOADER_SPEC, "w") as f: generator.generate_vulkan_loader_spec(f)
-- 2.14.3
On Tue, Mar 27, 2018 at 3:51 PM, Józef Kucia joseph.kucia@gmail.com wrote:
I wonder if we can simplify our Vulkan loader further. We could potentially export all core Vulkan functions from winevulkan.dll with the "wine_" prefix. The Vulkan loader documentation allows exporting Vulkan functions from ICD under different names. It would allow us to simply forward most of the functions directly to winevulkan.dll (even in the spec file). The proposed solution would make our vulkan-1.dll really minimal and simple, and would also avoid the race condition mentioned in the comment below. Thoughts?
I have no problems with the spec approach. Completely forgot about that method. The only thing we would lose out on would be debug traces for loader thunks, but I don't think we care much about those. Not sure which method I prefer most...
On Tue, Mar 27, 2018 at 9:00 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com
dlls/vulkan-1/vulkan-1.spec | 304 ++++++++++++++++++++++---------------------- dlls/vulkan-1/vulkan.c | 30 ++++- dlls/winevulkan/make_vulkan | 79 +++++++++++- 3 files changed, 255 insertions(+), 158 deletions(-)
diff --git a/dlls/vulkan-1/vulkan-1.spec b/dlls/vulkan-1/vulkan-1.spec index 088a3f23ac..5fed8850e8 100644 --- a/dlls/vulkan-1/vulkan-1.spec +++ b/dlls/vulkan-1/vulkan-1.spec @@ -1,158 +1,158 @@ # Automatically generated from Vulkan vk.xml; DO NOT EDIT!
-@ stub vkAcquireNextImageKHR -@ stub vkAllocateCommandBuffers -@ stub vkAllocateDescriptorSets -@ stub vkAllocateMemory -@ stub vkBeginCommandBuffer -@ stub vkBindBufferMemory -@ stub vkBindImageMemory -@ stub vkCmdBeginQuery -@ stub vkCmdBeginRenderPass -@ stub vkCmdBindDescriptorSets -@ stub vkCmdBindIndexBuffer -@ stub vkCmdBindPipeline -@ stub vkCmdBindVertexBuffers -@ stub vkCmdBlitImage -@ stub vkCmdClearAttachments -@ stub vkCmdClearColorImage -@ stub vkCmdClearDepthStencilImage -@ stub vkCmdCopyBuffer -@ stub vkCmdCopyBufferToImage -@ stub vkCmdCopyImage -@ stub vkCmdCopyImageToBuffer -@ stub vkCmdCopyQueryPoolResults -@ stub vkCmdDispatch -@ stub vkCmdDispatchIndirect -@ stub vkCmdDraw -@ stub vkCmdDrawIndexed -@ stub vkCmdDrawIndexedIndirect -@ stub vkCmdDrawIndirect -@ stub vkCmdEndQuery -@ stub vkCmdEndRenderPass -@ stub vkCmdExecuteCommands -@ stub vkCmdFillBuffer -@ stub vkCmdNextSubpass -@ stub vkCmdPipelineBarrier -@ stub vkCmdPushConstants -@ stub vkCmdResetEvent -@ stub vkCmdResetQueryPool -@ stub vkCmdResolveImage -@ stub vkCmdSetBlendConstants -@ stub vkCmdSetDepthBias -@ stub vkCmdSetDepthBounds -@ stub vkCmdSetEvent -@ stub vkCmdSetLineWidth -@ stub vkCmdSetScissor -@ stub vkCmdSetStencilCompareMask -@ stub vkCmdSetStencilReference -@ stub vkCmdSetStencilWriteMask -@ stub vkCmdSetViewport -@ stub vkCmdUpdateBuffer -@ stub vkCmdWaitEvents -@ stub vkCmdWriteTimestamp -@ stub vkCreateBuffer -@ stub vkCreateBufferView -@ stub vkCreateCommandPool -@ stub vkCreateComputePipelines -@ stub vkCreateDescriptorPool -@ stub vkCreateDescriptorSetLayout -@ stub vkCreateDevice -@ stub vkCreateDisplayModeKHR -@ stub vkCreateDisplayPlaneSurfaceKHR -@ stub vkCreateEvent -@ stub vkCreateFence -@ stub vkCreateFramebuffer -@ stub vkCreateGraphicsPipelines -@ stub vkCreateImage -@ stub vkCreateImageView +@ stdcall vkAcquireNextImageKHR(ptr int64 int64 int64 int64 ptr) +@ stdcall vkAllocateCommandBuffers(ptr ptr ptr) +@ stdcall vkAllocateDescriptorSets(ptr ptr ptr) +@ stdcall vkAllocateMemory(ptr ptr ptr ptr) +@ stdcall vkBeginCommandBuffer(ptr ptr) +@ stdcall vkBindBufferMemory(ptr int64 int64 int64) +@ stdcall vkBindImageMemory(ptr int64 int64 int64) +@ stdcall vkCmdBeginQuery(ptr int64 long long) +@ stdcall vkCmdBeginRenderPass(ptr ptr long) +@ stdcall vkCmdBindDescriptorSets(ptr long int64 long long ptr long ptr) +@ stdcall vkCmdBindIndexBuffer(ptr int64 int64 long) +@ stdcall vkCmdBindPipeline(ptr long int64) +@ stdcall vkCmdBindVertexBuffers(ptr long long ptr ptr) +@ stdcall vkCmdBlitImage(ptr int64 long int64 long long ptr long) +@ stdcall vkCmdClearAttachments(ptr long ptr long ptr) +@ stdcall vkCmdClearColorImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdClearDepthStencilImage(ptr int64 long ptr long ptr) +@ stdcall vkCmdCopyBuffer(ptr int64 int64 long ptr) +@ stdcall vkCmdCopyBufferToImage(ptr int64 int64 long long ptr) +@ stdcall vkCmdCopyImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdCopyImageToBuffer(ptr int64 long int64 long ptr) +@ stdcall vkCmdCopyQueryPoolResults(ptr int64 long long int64 int64 int64 long) +@ stdcall vkCmdDispatch(ptr long long long) +@ stdcall vkCmdDispatchIndirect(ptr int64 int64) +@ stdcall vkCmdDraw(ptr long long long long) +@ stdcall vkCmdDrawIndexed(ptr long long long long long) +@ stdcall vkCmdDrawIndexedIndirect(ptr int64 int64 long long) +@ stdcall vkCmdDrawIndirect(ptr int64 int64 long long) +@ stdcall vkCmdEndQuery(ptr int64 long) +@ stdcall vkCmdEndRenderPass(ptr) +@ stdcall vkCmdExecuteCommands(ptr long ptr) +@ stdcall vkCmdFillBuffer(ptr int64 int64 int64 long) +@ stdcall vkCmdNextSubpass(ptr long) +@ stdcall vkCmdPipelineBarrier(ptr long long long long ptr long ptr long ptr) +@ stdcall vkCmdPushConstants(ptr int64 long long long ptr) +@ stdcall vkCmdResetEvent(ptr int64 long) +@ stdcall vkCmdResetQueryPool(ptr int64 long long) +@ stdcall vkCmdResolveImage(ptr int64 long int64 long long ptr) +@ stdcall vkCmdSetBlendConstants(ptr ptr) +@ stdcall vkCmdSetDepthBias(ptr float float float) +@ stdcall vkCmdSetDepthBounds(ptr float float) +@ stdcall vkCmdSetEvent(ptr int64 long) +@ stdcall vkCmdSetLineWidth(ptr float) +@ stdcall vkCmdSetScissor(ptr long long ptr) +@ stdcall vkCmdSetStencilCompareMask(ptr long long) +@ stdcall vkCmdSetStencilReference(ptr long long) +@ stdcall vkCmdSetStencilWriteMask(ptr long long) +@ stdcall vkCmdSetViewport(ptr long long ptr) +@ stdcall vkCmdUpdateBuffer(ptr int64 int64 int64 ptr) +@ stdcall vkCmdWaitEvents(ptr long ptr long long long ptr long ptr long ptr) +@ stdcall vkCmdWriteTimestamp(ptr long int64 long) +@ stdcall vkCreateBuffer(ptr ptr ptr ptr) +@ stdcall vkCreateBufferView(ptr ptr ptr ptr) +@ stdcall vkCreateCommandPool(ptr ptr ptr ptr) +@ stdcall vkCreateComputePipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateDescriptorPool(ptr ptr ptr ptr) +@ stdcall vkCreateDescriptorSetLayout(ptr ptr ptr ptr) +@ stdcall vkCreateDevice(ptr ptr ptr ptr) +@ stdcall vkCreateDisplayModeKHR(ptr int64 ptr ptr ptr) +@ stdcall vkCreateDisplayPlaneSurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkCreateEvent(ptr ptr ptr ptr) +@ stdcall vkCreateFence(ptr ptr ptr ptr) +@ stdcall vkCreateFramebuffer(ptr ptr ptr ptr) +@ stdcall vkCreateGraphicsPipelines(ptr int64 long ptr ptr ptr) +@ stdcall vkCreateImage(ptr ptr ptr ptr) +@ stdcall vkCreateImageView(ptr ptr ptr ptr) @ stdcall vkCreateInstance(ptr ptr ptr) -@ stub vkCreatePipelineCache -@ stub vkCreatePipelineLayout -@ stub vkCreateQueryPool -@ stub vkCreateRenderPass -@ stub vkCreateSampler -@ stub vkCreateSemaphore -@ stub vkCreateShaderModule -@ stub vkCreateSwapchainKHR -@ stub vkCreateWin32SurfaceKHR -@ stub vkDestroyBuffer -@ stub vkDestroyBufferView -@ stub vkDestroyCommandPool -@ stub vkDestroyDescriptorPool -@ stub vkDestroyDescriptorSetLayout -@ stub vkDestroyDevice -@ stub vkDestroyEvent -@ stub vkDestroyFence -@ stub vkDestroyFramebuffer -@ stub vkDestroyImage -@ stub vkDestroyImageView -@ stub vkDestroyInstance -@ stub vkDestroyPipeline -@ stub vkDestroyPipelineCache -@ stub vkDestroyPipelineLayout -@ stub vkDestroyQueryPool -@ stub vkDestroyRenderPass -@ stub vkDestroySampler -@ stub vkDestroySemaphore -@ stub vkDestroyShaderModule -@ stub vkDestroySurfaceKHR -@ stub vkDestroySwapchainKHR -@ stub vkDeviceWaitIdle -@ stub vkEndCommandBuffer -@ stub vkEnumerateDeviceExtensionProperties -@ stub vkEnumerateDeviceLayerProperties +@ stdcall vkCreatePipelineCache(ptr ptr ptr ptr) +@ stdcall vkCreatePipelineLayout(ptr ptr ptr ptr) +@ stdcall vkCreateQueryPool(ptr ptr ptr ptr) +@ stdcall vkCreateRenderPass(ptr ptr ptr ptr) +@ stdcall vkCreateSampler(ptr ptr ptr ptr) +@ stdcall vkCreateSemaphore(ptr ptr ptr ptr) +@ stdcall vkCreateShaderModule(ptr ptr ptr ptr) +@ stdcall vkCreateSwapchainKHR(ptr ptr ptr ptr) +@ stdcall vkCreateWin32SurfaceKHR(ptr ptr ptr ptr) +@ stdcall vkDestroyBuffer(ptr int64 ptr) +@ stdcall vkDestroyBufferView(ptr int64 ptr) +@ stdcall vkDestroyCommandPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorPool(ptr int64 ptr) +@ stdcall vkDestroyDescriptorSetLayout(ptr int64 ptr) +@ stdcall vkDestroyDevice(ptr ptr) +@ stdcall vkDestroyEvent(ptr int64 ptr) +@ stdcall vkDestroyFence(ptr int64 ptr) +@ stdcall vkDestroyFramebuffer(ptr int64 ptr) +@ stdcall vkDestroyImage(ptr int64 ptr) +@ stdcall vkDestroyImageView(ptr int64 ptr) +@ stdcall vkDestroyInstance(ptr ptr) +@ stdcall vkDestroyPipeline(ptr int64 ptr) +@ stdcall vkDestroyPipelineCache(ptr int64 ptr) +@ stdcall vkDestroyPipelineLayout(ptr int64 ptr) +@ stdcall vkDestroyQueryPool(ptr int64 ptr) +@ stdcall vkDestroyRenderPass(ptr int64 ptr) +@ stdcall vkDestroySampler(ptr int64 ptr) +@ stdcall vkDestroySemaphore(ptr int64 ptr) +@ stdcall vkDestroyShaderModule(ptr int64 ptr) +@ stdcall vkDestroySurfaceKHR(ptr int64 ptr) +@ stdcall vkDestroySwapchainKHR(ptr int64 ptr) +@ stdcall vkDeviceWaitIdle(ptr) +@ stdcall vkEndCommandBuffer(ptr) +@ stdcall vkEnumerateDeviceExtensionProperties(ptr str ptr ptr) +@ stdcall vkEnumerateDeviceLayerProperties(ptr ptr ptr) @ stdcall vkEnumerateInstanceExtensionProperties(str ptr ptr) @ stdcall vkEnumerateInstanceLayerProperties(ptr ptr) -@ stub vkEnumeratePhysicalDevices -@ stub vkFlushMappedMemoryRanges -@ stub vkFreeCommandBuffers -@ stub vkFreeDescriptorSets -@ stub vkFreeMemory -@ stub vkGetBufferMemoryRequirements -@ stub vkGetDeviceMemoryCommitment -@ stub vkGetDeviceProcAddr -@ stub vkGetDeviceQueue -@ stub vkGetDisplayModePropertiesKHR -@ stub vkGetDisplayPlaneCapabilitiesKHR -@ stub vkGetDisplayPlaneSupportedDisplaysKHR -@ stub vkGetEventStatus -@ stub vkGetFenceStatus -@ stub vkGetImageMemoryRequirements -@ stub vkGetImageSparseMemoryRequirements -@ stub vkGetImageSubresourceLayout +@ stdcall vkEnumeratePhysicalDevices(ptr ptr ptr) +@ stdcall vkFlushMappedMemoryRanges(ptr long ptr) +@ stdcall vkFreeCommandBuffers(ptr int64 long ptr) +@ stdcall vkFreeDescriptorSets(ptr int64 long ptr) +@ stdcall vkFreeMemory(ptr int64 ptr) +@ stdcall vkGetBufferMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetDeviceMemoryCommitment(ptr int64 ptr) +@ stdcall vkGetDeviceProcAddr(ptr str) +@ stdcall vkGetDeviceQueue(ptr long long ptr) +@ stdcall vkGetDisplayModePropertiesKHR(ptr int64 ptr ptr) +@ stdcall vkGetDisplayPlaneCapabilitiesKHR(ptr int64 long ptr) +@ stdcall vkGetDisplayPlaneSupportedDisplaysKHR(ptr long ptr ptr) +@ stdcall vkGetEventStatus(ptr int64) +@ stdcall vkGetFenceStatus(ptr int64) +@ stdcall vkGetImageMemoryRequirements(ptr int64 ptr) +@ stdcall vkGetImageSparseMemoryRequirements(ptr int64 ptr ptr) +@ stdcall vkGetImageSubresourceLayout(ptr int64 ptr ptr) @ stdcall vkGetInstanceProcAddr(ptr str) -@ stub vkGetPhysicalDeviceDisplayPlanePropertiesKHR -@ stub vkGetPhysicalDeviceDisplayPropertiesKHR -@ stub vkGetPhysicalDeviceFeatures -@ stub vkGetPhysicalDeviceFormatProperties -@ stub vkGetPhysicalDeviceImageFormatProperties -@ stub vkGetPhysicalDeviceMemoryProperties -@ stub vkGetPhysicalDeviceProperties -@ stub vkGetPhysicalDeviceQueueFamilyProperties -@ stub vkGetPhysicalDeviceSparseImageFormatProperties -@ stub vkGetPhysicalDeviceSurfaceCapabilitiesKHR -@ stub vkGetPhysicalDeviceSurfaceFormatsKHR -@ stub vkGetPhysicalDeviceSurfacePresentModesKHR -@ stub vkGetPhysicalDeviceSurfaceSupportKHR -@ stub vkGetPhysicalDeviceWin32PresentationSupportKHR -@ stub vkGetPipelineCacheData -@ stub vkGetQueryPoolResults -@ stub vkGetRenderAreaGranularity -@ stub vkGetSwapchainImagesKHR -@ stub vkInvalidateMappedMemoryRanges -@ stub vkMapMemory -@ stub vkMergePipelineCaches -@ stub vkQueueBindSparse -@ stub vkQueuePresentKHR -@ stub vkQueueSubmit -@ stub vkQueueWaitIdle -@ stub vkResetCommandBuffer -@ stub vkResetCommandPool -@ stub vkResetDescriptorPool -@ stub vkResetEvent -@ stub vkResetFences -@ stub vkSetEvent -@ stub vkUnmapMemory -@ stub vkUpdateDescriptorSets -@ stub vkWaitForFences +@ stdcall vkGetPhysicalDeviceDisplayPlanePropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceDisplayPropertiesKHR(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceFeatures(ptr ptr) +@ stdcall vkGetPhysicalDeviceFormatProperties(ptr long ptr) +@ stdcall vkGetPhysicalDeviceImageFormatProperties(ptr long long long long long ptr) +@ stdcall vkGetPhysicalDeviceMemoryProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceProperties(ptr ptr) +@ stdcall vkGetPhysicalDeviceQueueFamilyProperties(ptr ptr ptr) +@ stdcall vkGetPhysicalDeviceSparseImageFormatProperties(ptr long long long long long ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfaceCapabilitiesKHR(ptr int64 ptr) +@ stdcall vkGetPhysicalDeviceSurfaceFormatsKHR(ptr int64 ptr ptr) +@ stdcall vkGetPhysicalDeviceSurfacePresentModesKHR(ptr int64 ptr long) +@ stdcall vkGetPhysicalDeviceSurfaceSupportKHR(ptr long int64 ptr) +@ stdcall vkGetPhysicalDeviceWin32PresentationSupportKHR(ptr long) +@ stdcall vkGetPipelineCacheData(ptr int64 ptr ptr) +@ stdcall vkGetQueryPoolResults(ptr int64 long long long ptr int64 long) +@ stdcall vkGetRenderAreaGranularity(ptr int64 ptr) +@ stdcall vkGetSwapchainImagesKHR(ptr int64 ptr ptr) +@ stdcall vkInvalidateMappedMemoryRanges(ptr long ptr) +@ stdcall vkMapMemory(ptr int64 int64 int64 long ptr) +@ stdcall vkMergePipelineCaches(ptr int64 long ptr) +@ stdcall vkQueueBindSparse(ptr long ptr int64) +@ stdcall vkQueuePresentKHR(ptr ptr) +@ stdcall vkQueueSubmit(ptr long ptr int64) +@ stdcall vkQueueWaitIdle(ptr) +@ stdcall vkResetCommandBuffer(ptr long) +@ stdcall vkResetCommandPool(ptr int64 long) +@ stdcall vkResetDescriptorPool(ptr int64 long) +@ stdcall vkResetEvent(ptr int64) +@ stdcall vkResetFences(ptr long ptr) +@ stdcall vkSetEvent(ptr int64) +@ stdcall vkUnmapMemory(ptr int64) +@ stdcall vkUpdateDescriptorSets(ptr long ptr long ptr) +@ stdcall vkWaitForFences(ptr long ptr long int64) diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index e3981b63ef..879504f6ee 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -24,12 +24,16 @@
#include "wine/debug.h" #include "wine/vulkan.h" +#include "vulkan_thunks.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
+static VkResult (WINAPI *p_vkCreateInstance)(const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *); static VkResult (WINAPI *p_vkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); static void * (WINAPI *p_vk_icdGetInstanceProcAddr)(VkInstance, const char *);
+struct vulkan_funcs vk_funcs;
It's slightly confusing to use "vulkan_funcs" name. struct vulkan_funcs is defined in vulkan_driver.h. We could rename it to "loader_vulkan_funcs", or rename the driver struct to driver_vulkan_funcs to improve clarity.
static BOOL vk_loader_init(void) { HMODULE icd_handle = NULL; @@ -45,6 +49,10 @@ static BOOL vk_loader_init(void) if (!p_vk_icdGetInstanceProcAddr) return FALSE;
- p_vkCreateInstance = p_vk_icdGetInstanceProcAddr(NULL, "vkCreateInstance");
- if (!p_vkCreateInstance)
return FALSE;
- p_vkEnumerateInstanceExtensionProperties = p_vk_icdGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); if (!p_vkEnumerateInstanceExtensionProperties)
@@ -56,8 +64,26 @@ static BOOL vk_loader_init(void) VkResult WINAPI vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) {
- FIXME("stub: create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
- VkResult res;
- TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
- res = p_vkCreateInstance(create_info, allocator, instance);
- if (res != VK_SUCCESS)
return res;
- /* Winevulkan function pointers are generic and can thus be shared.
* There is no need to store a dispatch table at start of 'instance' like
* the official Vulkan loader does.
*/
- if (!vk_funcs.p_vkGetInstanceProcAddr)
- {
TRACE("Loading Vulkan Core functions\n");
+#define USE_VK_FUNC(name) vk_funcs.p_##name = (void *)p_vk_icdGetInstanceProcAddr(*instance, #name);
ALL_VK_CORE_FUNCS()
+#undef USE_VK_FUNC
- }
There is a race condition. Multiple threads can call vkCreateInstance(), and one thread can call vulkan-1.dll thunk before vk_funcs are fully initialized.
- return res;
}
VkResult WINAPI vkEnumerateInstanceExtensionProperties(const char *layer_name, diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index b7b37f42cc..5b11d875c0 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -65,6 +65,8 @@ LOGGER.addHandler(logging.StreamHandler()) # Filenames to create. WINE_VULKAN_H = "../../include/wine/vulkan.h" WINE_VULKAN_DRIVER_H = "../../include/wine/vulkan_driver.h" +WINE_VULKAN_LOADER_C = "../vulkan-1/vulkan_thunks.c" +WINE_VULKAN_LOADER_H = "../vulkan-1/vulkan_thunks.h" WINE_VULKAN_LOADER_SPEC = "../vulkan-1/vulkan-1.spec" WINE_VULKAN_THUNKS_C = "vulkan_thunks.c" WINE_VULKAN_THUNKS_H = "vulkan_thunks.h" @@ -600,6 +602,21 @@ class VkFunction(object): stub += "}\n\n" return stub
- def loader_thunk(self, call_conv=None, prefix=None):
thunk = self.prototype(call_conv=call_conv, prefix=prefix)
thunk += "\n{\n"
thunk += " {0}".format(self.trace())
params = ", ".join([p.name for p in self.params])
if self.type != "void":
thunk += " return vk_funcs.p_{0}({1});\n".format(self.name, params)
else:
thunk += " vk_funcs.p_{0}({1});\n".format(self.name, params)
thunk += "}\n\n"
return thunk
- def thunk(self, call_conv=None, prefix=None): thunk = self.prototype(call_conv=call_conv, prefix=prefix) thunk += "\n{\n"
@@ -2113,6 +2130,57 @@ class VkGenerator(object): f.write("extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver(HDC hdc, UINT version);\n\n") f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n")
- def generate_vulkan_loader_c(self, f):
f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n")
f.write("#include \"config.h\"\n")
f.write("#include \"wine/port.h\"\n\n")
f.write("#include \"wine/debug.h\"\n")
f.write("#include \"wine/vulkan.h\"\n")
f.write("#include \"vulkan_thunks.h\"\n\n")
f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n")
for func in self.registry.funcs.values():
if not func.is_required():
continue
# Global functions need custom implementation.
if func.is_global_func():
continue
if not func.is_core_func():
continue
f.write(func.loader_thunk(call_conv="WINAPI"))
- def generate_vulkan_loader_h(self, f):
f.write("/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! */\n\n")
f.write("struct vulkan_funcs\n{\n")
for func in self.registry.funcs.values():
if not func.is_core_func():
continue
f.write(" {0};\n".format(func.pfn(call_conv="WINAPI")))
f.write("};\n\n")
f.write("#define ALL_VK_CORE_FUNCS() \\\n")
first = True
for func in self.registry.funcs.values():
if not func.is_core_func():
continue
if first:
f.write(" USE_VK_FUNC({0})".format(func.name))
first = False
else:
f.write(" \\\n USE_VK_FUNC({0})".format(func.name))
f.write("\n\n")
f.write("extern struct vulkan_funcs vk_funcs DECLSPEC_HIDDEN;\n")
- def generate_vulkan_loader_spec(self, f): f.write("# Automatically generated from Vulkan vk.xml; DO NOT EDIT!\n\n")
@@ -2120,10 +2188,7 @@ class VkGenerator(object): if not func.is_core_func(): continue
if func.is_global_func():
f.write(func.spec())
else:
f.write("@ stub {0}\n".format(func.name))
f.write(func.spec())
class VkRegistry(object): def __init__(self, reg_filename): @@ -2506,6 +2571,12 @@ def main(): with open(WINE_VULKAN_THUNKS_C, "w") as f: generator.generate_thunks_c(f, "wine_")
- with open(WINE_VULKAN_LOADER_C, "w") as f:
generator.generate_vulkan_loader_c(f)
- with open(WINE_VULKAN_LOADER_H, "w") as f:
generator.generate_vulkan_loader_h(f)
- with open(WINE_VULKAN_LOADER_SPEC, "w") as f: generator.generate_vulkan_loader_spec(f)
-- 2.14.3
On Wed, Mar 28, 2018 at 2:09 AM, Roderick Colenbrander thunderbird2k@gmail.com wrote:
On Tue, Mar 27, 2018 at 3:51 PM, Józef Kucia joseph.kucia@gmail.com wrote:
I wonder if we can simplify our Vulkan loader further. We could potentially export all core Vulkan functions from winevulkan.dll with the "wine_" prefix. The Vulkan loader documentation allows exporting Vulkan functions from ICD under different names. It would allow us to simply forward most of the functions directly to winevulkan.dll (even in the spec file). The proposed solution would make our vulkan-1.dll really minimal and simple, and would also avoid the race condition mentioned in the comment below. Thoughts?
I have no problems with the spec approach. Completely forgot about that method. The only thing we would lose out on would be debug traces for loader thunks, but I don't think we care much about those. Not sure which method I prefer most...
I don't have a strong preference for either method, but debug traces in the loader thunks aren't necessary.
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com --- dlls/vulkan-1/vulkan.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/dlls/vulkan-1/vulkan.c b/dlls/vulkan-1/vulkan.c index 879504f6ee..a4c91087d0 100644 --- a/dlls/vulkan-1/vulkan.c +++ b/dlls/vulkan-1/vulkan.c @@ -108,8 +108,25 @@ VkResult WINAPI vkEnumerateInstanceLayerProperties(uint32_t *count, VkLayerPrope
PFN_vkVoidFunction WINAPI vkGetInstanceProcAddr(VkInstance instance, const char *name) { - FIXME("stub: %p %s\n", instance, debugstr_a(name)); - return NULL; + TRACE("%p %s\n", instance, debugstr_a(name)); + + if (!strcmp(name, "vkCreateInstance")) + return (PFN_vkVoidFunction)vkCreateInstance; + + if (!strcmp(name, "vkEnumerateInstanceExtensionProperties")) + return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; + + if (!strcmp(name, "vkEnumerateInstanceLayerProperties")) + return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; + + if (!strcmp(name, "vkGetInstanceProcAddr")) + return (PFN_vkVoidFunction)vkGetInstanceProcAddr; + + if (!instance) + return NULL; + + /* Go straight to ICD, no need to incur loader thunk overhead. */ + return vk_funcs.p_vkGetInstanceProcAddr(instance, name); }
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)