diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index cc8692a09c3..091a1ddaa6d 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -109,7 +109,6 @@ BLACKLISTED_EXTENSIONS = [ "VK_EXT_external_memory_dma_buf", # Linux specific "VK_EXT_full_screen_exclusive", "VK_EXT_hdr_metadata", # Needs WSI work. - "VK_EXT_host_query_reset", "VK_EXT_image_drm_format_modifier", "VK_EXT_memory_priority", "VK_EXT_pipeline_creation_feedback", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 3893f1c85e4..d35719ef7f3 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -207,7 +207,7 @@ static struct VkQueue_T *wine_vk_device_alloc_queues(struct VkDevice_T *device, return queues; } -static VkDeviceGroupDeviceCreateInfo *convert_VkDeviceGroupDeviceCreateInfo(const void *src) +static void *convert_VkDeviceGroupDeviceCreateInfo(const void *src) { const VkDeviceGroupDeviceCreateInfo *in = src; VkDeviceGroupDeviceCreateInfo *out; @@ -218,6 +218,7 @@ static VkDeviceGroupDeviceCreateInfo *convert_VkDeviceGroupDeviceCreateInfo(cons return NULL; *out = *in; + out->pNext = NULL; if (!(physical_devices = heap_calloc(in->physicalDeviceCount, sizeof(*physical_devices)))) { heap_free(out); @@ -230,6 +231,37 @@ static VkDeviceGroupDeviceCreateInfo *convert_VkDeviceGroupDeviceCreateInfo(cons return out; } +static void *convert_VkPhysicalDeviceHostQueryResetFeaturesEXT(const void *src) +{ + const VkPhysicalDeviceHostQueryResetFeaturesEXT *in = src; + VkPhysicalDeviceHostQueryResetFeaturesEXT *out; + + if (!(out = heap_alloc(sizeof(*out)))) + return NULL; + + *out = *in; + out->pNext = NULL; + + return out; +} + +static void wine_vk_device_free_create_info(VkDeviceCreateInfo *create_info) +{ + VkPhysicalDeviceHostQueryResetFeaturesEXT *host_query_reset_features; + VkDeviceGroupDeviceCreateInfo *group_info; + + group_info = wine_vk_find_struct(create_info, DEVICE_GROUP_DEVICE_CREATE_INFO); + host_query_reset_features = wine_vk_find_struct(create_info, PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT); + create_info->pNext = NULL; + + if (group_info) + { + heap_free((void *)group_info->pPhysicalDevices); + heap_free(group_info); + } + heap_free(host_query_reset_features); +} + static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src, VkDeviceCreateInfo *dst) { @@ -244,8 +276,10 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src if (src->pNext) { const VkBaseInStructure *header; + VkBaseOutStructure *dst_header; dst->pNext = NULL; + dst_header = (VkBaseOutStructure *)dst; for (header = src->pNext; header; header = header->pNext) { switch (header->sType) @@ -257,8 +291,15 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src break; case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: - if (!(dst->pNext = convert_VkDeviceGroupDeviceCreateInfo(header))) - return VK_ERROR_OUT_OF_HOST_MEMORY; + if (!(dst_header->pNext = convert_VkDeviceGroupDeviceCreateInfo(header))) + goto err; + dst_header = dst_header->pNext; + break; + + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT: + if (!(dst_header->pNext = convert_VkPhysicalDeviceHostQueryResetFeaturesEXT(header))) + goto err; + dst_header = dst_header->pNext; break; default: @@ -284,19 +325,10 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src } return VK_SUCCESS; -} -static void wine_vk_device_free_create_info(VkDeviceCreateInfo *create_info) -{ - VkDeviceGroupDeviceCreateInfo *group_info; - - if ((group_info = wine_vk_find_struct(create_info, DEVICE_GROUP_DEVICE_CREATE_INFO))) - { - heap_free((void *)group_info->pPhysicalDevices); - heap_free(group_info); - } - - create_info->pNext = NULL; +err: + wine_vk_device_free_create_info(dst); + return VK_ERROR_OUT_OF_HOST_MEMORY; } /* Helper function used for freeing a device structure. This function supports full diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 263e28a71c5..04e18d5ac8a 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -3252,6 +3252,12 @@ VkResult WINAPI wine_vkResetFences(VkDevice device, uint32_t fenceCount, const V return device->funcs.p_vkResetFences(device->device, fenceCount, pFences); } +static void WINAPI wine_vkResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) +{ + TRACE("%p, 0x%s, %u, %u\n", device, wine_dbgstr_longlong(queryPool), firstQuery, queryCount); + device->funcs.p_vkResetQueryPoolEXT(device->device, queryPool, firstQuery, queryCount); +} + VkResult WINAPI wine_vkSetEvent(VkDevice device, VkEvent event) { TRACE("%p, 0x%s\n", device, wine_dbgstr_longlong(event)); @@ -3516,6 +3522,7 @@ static const struct vulkan_func vk_device_dispatch_table[] = {"vkResetDescriptorPool", &wine_vkResetDescriptorPool}, {"vkResetEvent", &wine_vkResetEvent}, {"vkResetFences", &wine_vkResetFences}, + {"vkResetQueryPoolEXT", &wine_vkResetQueryPoolEXT}, {"vkSetEvent", &wine_vkSetEvent}, {"vkTrimCommandPool", &wine_vkTrimCommandPool}, {"vkTrimCommandPoolKHR", &wine_vkTrimCommandPoolKHR}, @@ -3625,6 +3632,7 @@ static const char * const vk_device_extensions[] = "VK_EXT_filter_cubic", "VK_EXT_fragment_density_map", "VK_EXT_global_priority", + "VK_EXT_host_query_reset", "VK_EXT_inline_uniform_block", "VK_EXT_memory_budget", "VK_EXT_pci_bus_info", diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index fc867245436..518516fd593 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -1136,6 +1136,7 @@ struct vulkan_device_funcs VkResult (*p_vkResetDescriptorPool)(VkDevice, VkDescriptorPool, VkDescriptorPoolResetFlags); VkResult (*p_vkResetEvent)(VkDevice, VkEvent); VkResult (*p_vkResetFences)(VkDevice, uint32_t, const VkFence *); + void (*p_vkResetQueryPoolEXT)(VkDevice, VkQueryPool, uint32_t, uint32_t); VkResult (*p_vkSetEvent)(VkDevice, VkEvent); void (*p_vkTrimCommandPool)(VkDevice, VkCommandPool, VkCommandPoolTrimFlags); void (*p_vkTrimCommandPoolKHR)(VkDevice, VkCommandPool, VkCommandPoolTrimFlags); @@ -1428,6 +1429,7 @@ struct vulkan_instance_funcs USE_VK_FUNC(vkResetDescriptorPool) \ USE_VK_FUNC(vkResetEvent) \ USE_VK_FUNC(vkResetFences) \ + USE_VK_FUNC(vkResetQueryPoolEXT) \ USE_VK_FUNC(vkSetEvent) \ USE_VK_FUNC(vkTrimCommandPool) \ USE_VK_FUNC(vkTrimCommandPoolKHR) \ diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index e545fbc168d..2b8950ac987 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -288,6 +288,8 @@ #define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address" #define VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION 1 #define VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME "VK_EXT_separate_stencil_usage" +#define VK_EXT_HOST_QUERY_RESET_SPEC_VERSION 1 +#define VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME "VK_EXT_host_query_reset" #define VK_MAKE_VERSION(major, minor, patch) \ (((major) << 22) | ((minor) << 12) | (patch)) @@ -2078,6 +2080,7 @@ typedef enum VkStructureType VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = 1000244001, VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002, VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = 1000246000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = 1000261000, VK_STRUCTURE_TYPE_MAX_ENUM = 0x7fffffff, } VkStructureType; @@ -4214,6 +4217,13 @@ typedef struct VkPhysicalDeviceFragmentDensityMapFeaturesEXT VkBool32 fragmentDensityMapNonSubsampledImages; } VkPhysicalDeviceFragmentDensityMapFeaturesEXT; +typedef struct VkPhysicalDeviceHostQueryResetFeaturesEXT +{ + VkStructureType sType; + void *pNext; + VkBool32 hostQueryReset; +} VkPhysicalDeviceHostQueryResetFeaturesEXT; + typedef struct VkPhysicalDeviceInlineUniformBlockPropertiesEXT { VkStructureType sType; @@ -5431,6 +5441,7 @@ typedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice, VkCommandPool, Vk typedef VkResult (VKAPI_PTR *PFN_vkResetDescriptorPool)(VkDevice, VkDescriptorPool, VkDescriptorPoolResetFlags); typedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice, VkEvent); typedef VkResult (VKAPI_PTR *PFN_vkResetFences)(VkDevice, uint32_t, const VkFence *); +typedef void (VKAPI_PTR *PFN_vkResetQueryPoolEXT)(VkDevice, VkQueryPool, uint32_t, uint32_t); typedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice, VkEvent); typedef void (VKAPI_PTR *PFN_vkTrimCommandPool)(VkDevice, VkCommandPool, VkCommandPoolTrimFlags); typedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice, VkCommandPool, VkCommandPoolTrimFlags); @@ -5684,6 +5695,7 @@ VkResult VKAPI_CALL vkResetCommandPool(VkDevice device, VkCommandPool commandPoo VkResult VKAPI_CALL vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags); VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event); VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences); +void VKAPI_CALL vkResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event); void VKAPI_CALL vkTrimCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); void VKAPI_CALL vkTrimCommandPoolKHR(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags);