[PATCH 4/4] winevulkan: Implement VK_EXT_host_query_reset.
Józef Kucia
jkucia at codeweavers.com
Tue Mar 19 09:59:34 CDT 2019
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/winevulkan/make_vulkan | 1 -
dlls/winevulkan/vulkan.c | 62 +++++++++++++++++++++++++--------
dlls/winevulkan/vulkan_thunks.c | 8 +++++
dlls/winevulkan/vulkan_thunks.h | 2 ++
include/wine/vulkan.h | 12 +++++++
5 files changed, 69 insertions(+), 16 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index cc8692a09c37..091a1ddaa6d3 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 3893f1c85e4d..d35719ef7f3e 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 263e28a71c5e..04e18d5ac8a6 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 fc8672454366..518516fd593b 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 e545fbc168d3..2b8950ac9879 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);
--
2.19.2
More information about the wine-devel
mailing list