[PATCH vkd3d 08/10] vkd3d: Trace VK_EXT_vertex_attribute_divisor properties.

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


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

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

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 9ae65f023a0e..abb991942199 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -575,7 +575,6 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
     VkPhysicalDeviceMemoryProperties memory_properties;
     VkPhysicalDeviceProperties device_properties;
     VkQueueFamilyProperties *queue_properties;
-    VkPhysicalDeviceLimits *limits;
     unsigned int i, j;
     uint32_t count;
 
@@ -616,8 +615,13 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
             TRACE("  Memory type [%u]: flags %s.\n", j, debug_vk_memory_property_flags(type->propertyFlags));
         }
     }
+}
+
+static void vkd3d_trace_physical_device_limits(const VkPhysicalDeviceProperties2KHR *properties2)
+{
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *divisor_properties;
+    const VkPhysicalDeviceLimits *limits = &properties2->properties.limits;
 
-    limits = &device_properties.limits;
     TRACE("Device limits:\n");
     TRACE("  maxImageDimension1D: %u.\n", limits->maxImageDimension1D);
     TRACE("  maxImageDimension2D: %u.\n", limits->maxImageDimension2D);
@@ -734,6 +738,14 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
     TRACE("  optimalBufferCopyOffsetAlignment: %#"PRIx64".\n", limits->optimalBufferCopyOffsetAlignment);
     TRACE("  optimalBufferCopyRowPitchAlignment: %#"PRIx64".\n", limits->optimalBufferCopyRowPitchAlignment);
     TRACE("  nonCoherentAtomSize: %#"PRIx64".\n", limits->nonCoherentAtomSize);
+
+    divisor_properties
+            = vk_find_struct(properties2->pNext, PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT);
+    if (divisor_properties)
+    {
+        TRACE("  VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT:\n");
+        TRACE("    maxVertexAttribDivisor: %u.\n", divisor_properties->maxVertexAttribDivisor);
+    }
 }
 
 static void vkd3d_trace_physical_device_features(const VkPhysicalDeviceFeatures2KHR *features2)
@@ -866,11 +878,12 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
         VkPhysicalDeviceFeatures2KHR *features2, uint32_t *device_extension_count)
 {
     const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT vertex_divisor_properties;
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *divisor_features;
     VkPhysicalDevice physical_device = device->vk_physical_device;
     VkPhysicalDeviceFeatures *features = &features2->features;
     struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
-    VkPhysicalDeviceProperties device_properties;
+    VkPhysicalDeviceProperties2KHR device_properties2;
     VkExtensionProperties *vk_extensions;
     uint32_t count;
     VkResult vr;
@@ -879,9 +892,19 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
 
     vkd3d_trace_physical_device_features(features2);
 
-    VK_CALL(vkGetPhysicalDeviceProperties(physical_device, &device_properties));
-    vulkan_info->device_limits = device_properties.limits;
-    vulkan_info->sparse_properties = device_properties.sparseProperties;
+    memset(&vertex_divisor_properties, 0, sizeof(vertex_divisor_properties));
+    vertex_divisor_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT;
+    device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+    device_properties2.pNext = &vertex_divisor_properties;
+    if (vulkan_info->KHR_get_physical_device_properties2)
+        VK_CALL(vkGetPhysicalDeviceProperties2KHR(physical_device, &device_properties2));
+    else
+        VK_CALL(vkGetPhysicalDeviceProperties(physical_device, &device_properties2.properties));
+
+    vkd3d_trace_physical_device_limits(&device_properties2);
+
+    vulkan_info->device_limits = device_properties2.properties.limits;
+    vulkan_info->sparse_properties = device_properties2.properties.sparseProperties;
 
     device->feature_options.DoublePrecisionFloatShaderOps = features->shaderFloat64;
     device->feature_options.OutputMergerLogicOp = features->logicOp;
diff --git a/libs/vkd3d/vulkan_procs.h b/libs/vkd3d/vulkan_procs.h
index e14121c1a76b..ac03b3f89ff8 100644
--- a/libs/vkd3d/vulkan_procs.h
+++ b/libs/vkd3d/vulkan_procs.h
@@ -48,6 +48,7 @@ VK_INSTANCE_PFN(vkGetPhysicalDeviceQueueFamilyProperties)
 VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties)
 /* VK_KHR_get_physical_device_properties2 */
 VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceFeatures2KHR)
+VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceProperties2KHR)
 /* 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