From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/adapter_vk.c | 20 +++++++++++++++----- dlls/wined3d/wined3d_vk.h | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 1216a84e990..6d3b31aeb97 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -241,10 +241,11 @@ static HRESULT wined3d_select_vulkan_queue_family(const struct wined3d_adapter_v
struct wined3d_physical_device_info { - VkPhysicalDeviceTransformFeedbackFeaturesEXT xfb_features; - VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamic_state_features; VkPhysicalDeviceHostQueryResetFeatures host_query_reset_features; VkPhysicalDeviceShaderDrawParametersFeatures draw_parameters_features; + VkPhysicalDeviceTransformFeedbackFeaturesEXT xfb_features; + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features;
VkPhysicalDeviceFeatures2 features2; }; @@ -338,6 +339,7 @@ static void get_physical_device_info(const struct wined3d_adapter_vk *adapter_vk { VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *vertex_divisor_features = &info->vertex_divisor_features; VkPhysicalDeviceShaderDrawParametersFeatures *draw_parameters_features = &info->draw_parameters_features; + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *dynamic_state_features = &info->dynamic_state_features; VkPhysicalDeviceHostQueryResetFeatures *host_query_reset_features = &info->host_query_reset_features; VkPhysicalDeviceTransformFeedbackFeaturesEXT *xfb_features = &info->xfb_features; VkPhysicalDevice physical_device = adapter_vk->physical_device; @@ -361,8 +363,11 @@ static void get_physical_device_info(const struct wined3d_adapter_vk *adapter_vk host_query_reset_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES; host_query_reset_features->pNext = vertex_divisor_features;
+ dynamic_state_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; + dynamic_state_features->pNext = host_query_reset_features; + features2->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; - features2->pNext = host_query_reset_features; + features2->pNext = dynamic_state_features;
if (vk_info->vk_ops.vkGetPhysicalDeviceFeatures2) VK_CALL(vkGetPhysicalDeviceFeatures2(physical_device, features2)); @@ -2264,6 +2269,9 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_
get_physical_device_info(adapter_vk, &device_info);
+ if (!device_info.dynamic_state_features.extendedDynamicState) + adapter_vk->vk_info.supported[WINED3D_VK_EXT_EXTENDED_DYNAMIC_STATE] = FALSE; + if (!device_info.host_query_reset_features.hostQueryReset) adapter_vk->vk_info.supported[WINED3D_VK_EXT_HOST_QUERY_RESET] = FALSE;
@@ -2357,6 +2365,8 @@ static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk } info[] = { + {VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_API_VERSION_1_3}, + {VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_API_VERSION_1_2}, {VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, ~0u}, {VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, ~0u}, {VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, ~0u, true}, @@ -2365,7 +2375,6 @@ static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk {VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME,VK_API_VERSION_1_2}, {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_API_VERSION_1_1}, {VK_KHR_SWAPCHAIN_EXTENSION_NAME, ~0u, true}, - {VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_API_VERSION_1_2}, };
static const struct @@ -2375,12 +2384,13 @@ static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk } map[] = { + {VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, WINED3D_VK_EXT_EXTENDED_DYNAMIC_STATE}, + {VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, WINED3D_VK_EXT_HOST_QUERY_RESET}, {VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, WINED3D_VK_EXT_SHADER_STENCIL_EXPORT}, {VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, WINED3D_VK_EXT_TRANSFORM_FEEDBACK}, {VK_KHR_MAINTENANCE2_EXTENSION_NAME, WINED3D_VK_KHR_MAINTENANCE2}, {VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, WINED3D_VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE}, {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, WINED3D_VK_KHR_SHADER_DRAW_PARAMETERS}, - {VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, WINED3D_VK_EXT_HOST_QUERY_RESET}, };
if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, NULL))) < 0) diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h index 00f57a9496e..f94ba11346c 100644 --- a/dlls/wined3d/wined3d_vk.h +++ b/dlls/wined3d/wined3d_vk.h @@ -215,12 +215,13 @@ enum wined3d_vk_extension { WINED3D_VK_EXT_NONE,
+ WINED3D_VK_EXT_EXTENDED_DYNAMIC_STATE, + WINED3D_VK_EXT_HOST_QUERY_RESET, WINED3D_VK_EXT_SHADER_STENCIL_EXPORT, WINED3D_VK_EXT_TRANSFORM_FEEDBACK, WINED3D_VK_KHR_MAINTENANCE2, WINED3D_VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, WINED3D_VK_KHR_SHADER_DRAW_PARAMETERS, - WINED3D_VK_EXT_HOST_QUERY_RESET,
WINED3D_VK_EXT_COUNT, };