[PATCH vkd3d 05/10] vkd3d: Enable VK_EXT_vertex_attribute_divisor.

Józef Kucia joseph.kucia at gmail.com
Thu Oct 25 04:24:03 CDT 2018


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/device.c        | 24 ++++++++++++++++++------
 libs/vkd3d/vkd3d_private.h |  1 +
 libs/vkd3d/vulkan_procs.h  |  2 ++
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 419b9042b178..fca446160db8 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -64,6 +64,8 @@ static const char * const required_device_extensions[] =
 static const struct vkd3d_optional_extension_info optional_device_extensions[] =
 {
     {VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, offsetof(struct vkd3d_vulkan_info, KHR_push_descriptor)},
+    {VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,
+            offsetof(struct vkd3d_vulkan_info, EXT_vertex_attribute_divisor)},
 };
 
 static bool is_extension_disabled(const char *extension_name)
@@ -993,9 +995,11 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
 {
     unsigned int direct_queue_family_index, copy_queue_family_index, compute_queue_family_index;
     const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features;
+    struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
     VkQueueFamilyProperties *queue_properties = NULL;
     VkDeviceQueueCreateInfo *queue_info = NULL;
-    VkPhysicalDeviceFeatures device_features;
+    VkPhysicalDeviceFeatures2 features2;
     VkPhysicalDevice physical_device;
     VkDeviceCreateInfo device_info;
     uint32_t queue_family_count;
@@ -1082,11 +1086,19 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
 
     VK_CALL(vkGetPhysicalDeviceMemoryProperties(physical_device, &device->memory_properties));
 
-    VK_CALL(vkGetPhysicalDeviceFeatures(physical_device, &device_features));
-    if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &device_features, &extension_count)))
+    memset(&vertex_divisor_features, 0, sizeof(vertex_divisor_features));
+    vertex_divisor_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
+    features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+    features2.pNext = &vertex_divisor_features;
+    if (vulkan_info->KHR_get_physical_device_properties2)
+        VK_CALL(vkGetPhysicalDeviceFeatures2KHR(physical_device, &features2));
+    else
+        VK_CALL(vkGetPhysicalDeviceFeatures(physical_device, &features2.features));
+
+    if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &features2.features, &extension_count)))
         goto done;
 
-    device_features.shaderTessellationAndGeometryPointSize = VK_FALSE;
+    features2.features.shaderTessellationAndGeometryPointSize = VK_FALSE;
 
     if (!(extensions = vkd3d_calloc(extension_count, sizeof(*extensions))))
     {
@@ -1096,7 +1108,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
 
     /* Create device */
     device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
-    device_info.pNext = NULL;
+    device_info.pNext = &vertex_divisor_features;
     device_info.flags = 0;
     device_info.queueCreateInfoCount = queue_family_count;
     device_info.pQueueCreateInfos = queue_info;
@@ -1108,7 +1120,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
             create_info->device_extensions, create_info->device_extension_count,
             NULL, 0, NULL, &device->vk_info);
     device_info.ppEnabledExtensionNames = extensions;
-    device_info.pEnabledFeatures = &device_features;
+    device_info.pEnabledFeatures = &features2.features;
 
     vr = VK_CALL(vkCreateDevice(physical_device, &device_info, NULL, &vk_device));
     vkd3d_free(extensions);
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 4be160b89b9c..e4e1e118cc0a 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -83,6 +83,7 @@ struct vkd3d_vulkan_info
     bool EXT_debug_report;
     /* device extensions */
     bool KHR_push_descriptor;
+    bool EXT_vertex_attribute_divisor;
 
     VkPhysicalDeviceLimits device_limits;
     VkPhysicalDeviceSparseProperties sparse_properties;
diff --git a/libs/vkd3d/vulkan_procs.h b/libs/vkd3d/vulkan_procs.h
index 690a1a2b5acf..e14121c1a76b 100644
--- a/libs/vkd3d/vulkan_procs.h
+++ b/libs/vkd3d/vulkan_procs.h
@@ -46,6 +46,8 @@ VK_INSTANCE_PFN(vkGetPhysicalDeviceMemoryProperties)
 VK_INSTANCE_PFN(vkGetPhysicalDeviceProperties)
 VK_INSTANCE_PFN(vkGetPhysicalDeviceQueueFamilyProperties)
 VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties)
+/* VK_KHR_get_physical_device_properties2 */
+VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceFeatures2KHR)
 /* VK_EXT_debug_report */
 VK_INSTANCE_EXT_PFN(vkCreateDebugReportCallbackEXT)
 VK_INSTANCE_EXT_PFN(vkDestroyDebugReportCallbackEXT)
-- 
2.18.1




More information about the wine-devel mailing list