[PATCH vkd3d 1/5] vkd3d: Introduce vkd3d_physical_device_info.

Józef Kucia joseph.kucia at gmail.com
Fri Jun 7 07:38:01 CDT 2019


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

Simplifies passing around Vulkan physical device properties and features.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 libs/vkd3d/device.c | 507 +++++++++++++++++++++-----------------------
 1 file changed, 247 insertions(+), 260 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index a9610ffbfb4a..870b88af8282 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -92,20 +92,6 @@ struct vk_struct
     struct vk_struct *pNext;
 };
 
-#define vk_find_struct(c, t) vk_find_struct_(c, VK_STRUCTURE_TYPE_##t)
-static void *vk_find_struct_(struct vk_struct *chain, VkStructureType sType)
-{
-    while (chain)
-    {
-        if (chain->sType == sType)
-            return chain;
-
-        chain = chain->pNext;
-    }
-
-    return NULL;
-}
-
 static uint32_t vkd3d_get_vk_version(void)
 {
     const char *ptr = PACKAGE_VERSION;
@@ -676,6 +662,82 @@ VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance)
     return instance->vk_instance;
 }
 
+struct vkd3d_physical_device_info
+{
+    /* properties */
+    VkPhysicalDeviceDescriptorIndexingPropertiesEXT descriptor_indexing_properties;
+    VkPhysicalDeviceMaintenance3Properties maintenance3_properties;
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT xfb_properties;
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT vertex_divisor_properties;
+
+    VkPhysicalDeviceProperties2KHR properties2;
+
+    /* features */
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT depth_clip_features;
+    VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_features;
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT xfb_features;
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features;
+
+    VkPhysicalDeviceFeatures2 features2;
+};
+
+static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *info, struct d3d12_device *device)
+{
+    const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
+    VkPhysicalDeviceDescriptorIndexingPropertiesEXT *descriptor_indexing_properties;
+    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *vertex_divisor_properties;
+    VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing_features;
+    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *vertex_divisor_features;
+    VkPhysicalDeviceDepthClipEnableFeaturesEXT *depth_clip_features;
+    VkPhysicalDeviceMaintenance3Properties *maintenance3_properties;
+    VkPhysicalDeviceTransformFeedbackPropertiesEXT *xfb_properties;
+    VkPhysicalDevice physical_device = device->vk_physical_device;
+    VkPhysicalDeviceTransformFeedbackFeaturesEXT *xfb_features;
+    struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
+
+    memset(info, 0, sizeof(*info));
+    depth_clip_features = &info->depth_clip_features;
+    descriptor_indexing_features = &info->descriptor_indexing_features;
+    descriptor_indexing_properties = &info->descriptor_indexing_properties;
+    maintenance3_properties = &info->maintenance3_properties;
+    vertex_divisor_features = &info->vertex_divisor_features;
+    vertex_divisor_properties = &info->vertex_divisor_properties;
+    xfb_features = &info->xfb_features;
+    xfb_properties = &info->xfb_properties;
+
+    depth_clip_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT;
+    descriptor_indexing_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
+    descriptor_indexing_features->pNext = depth_clip_features;
+    xfb_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
+    xfb_features->pNext = descriptor_indexing_features;
+    vertex_divisor_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
+    vertex_divisor_features->pNext = xfb_features;
+
+    info->features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+    info->features2.pNext = vertex_divisor_features;
+
+    if (vulkan_info->KHR_get_physical_device_properties2)
+        VK_CALL(vkGetPhysicalDeviceFeatures2KHR(physical_device, &info->features2));
+    else
+        VK_CALL(vkGetPhysicalDeviceFeatures(physical_device, &info->features2.features));
+
+    maintenance3_properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
+    descriptor_indexing_properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT;
+    descriptor_indexing_properties->pNext = maintenance3_properties;
+    xfb_properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT;
+    xfb_properties->pNext = descriptor_indexing_properties;
+    vertex_divisor_properties->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT;
+    vertex_divisor_properties->pNext = xfb_properties;
+
+    info->properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+    info->properties2.pNext = vertex_divisor_properties;
+
+    if (vulkan_info->KHR_get_physical_device_properties2)
+        VK_CALL(vkGetPhysicalDeviceProperties2KHR(physical_device, &info->properties2));
+    else
+        VK_CALL(vkGetPhysicalDeviceProperties(physical_device, &info->properties2.properties));
+}
+
 static void vkd3d_trace_physical_device_properties(const VkPhysicalDeviceProperties *properties)
 {
     const uint32_t driver_version = properties->driverVersion;
@@ -691,7 +753,7 @@ static void vkd3d_trace_physical_device_properties(const VkPhysicalDevicePropert
 }
 
 static void vkd3d_trace_physical_device(VkPhysicalDevice device,
-        const VkPhysicalDeviceProperties *vk_device_properties,
+        const struct vkd3d_physical_device_info *info,
         const struct vkd3d_vk_instance_procs *vk_procs)
 {
     VkPhysicalDeviceMemoryProperties memory_properties;
@@ -699,7 +761,7 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
     unsigned int i, j;
     uint32_t count;
 
-    vkd3d_trace_physical_device_properties(vk_device_properties);
+    vkd3d_trace_physical_device_properties(&info->properties2.properties);
 
     VK_CALL(vkGetPhysicalDeviceQueueFamilyProperties(device, &count, NULL));
     TRACE("Queue families [%u]:\n", count);
@@ -733,11 +795,11 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
     }
 }
 
-static void vkd3d_trace_physical_device_limits(const VkPhysicalDeviceProperties2KHR *properties2)
+static void vkd3d_trace_physical_device_limits(const struct vkd3d_physical_device_info *info)
 {
     const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *divisor_properties;
+    const VkPhysicalDeviceLimits *limits = &info->properties2.properties.limits;
     const VkPhysicalDeviceDescriptorIndexingPropertiesEXT *descriptor_indexing;
-    const VkPhysicalDeviceLimits *limits = &properties2->properties.limits;
     const VkPhysicalDeviceMaintenance3Properties *maintenance3;
     const VkPhysicalDeviceTransformFeedbackPropertiesEXT *xfb;
 
@@ -858,102 +920,89 @@ static void vkd3d_trace_physical_device_limits(const VkPhysicalDeviceProperties2
     TRACE("  optimalBufferCopyRowPitchAlignment: %#"PRIx64".\n", limits->optimalBufferCopyRowPitchAlignment);
     TRACE("  nonCoherentAtomSize: %#"PRIx64".\n", limits->nonCoherentAtomSize);
 
-    descriptor_indexing = vk_find_struct(properties2->pNext, PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT);
-    if (descriptor_indexing)
-    {
-        TRACE("  VkPhysicalDeviceDescriptorIndexingPropertiesEXT:\n");
-
-        TRACE("    maxUpdateAfterBindDescriptorsInAllPools: %u.\n",
-                descriptor_indexing->maxUpdateAfterBindDescriptorsInAllPools);
-
-        TRACE("    shaderUniformBufferArrayNonUniformIndexingNative: %#x.\n",
-                descriptor_indexing->shaderUniformBufferArrayNonUniformIndexingNative);
-        TRACE("    shaderSampledImageArrayNonUniformIndexingNative: %#x.\n",
-                descriptor_indexing->shaderSampledImageArrayNonUniformIndexingNative);
-        TRACE("    shaderStorageBufferArrayNonUniformIndexingNative: %#x.\n",
-                descriptor_indexing->shaderStorageBufferArrayNonUniformIndexingNative);
-        TRACE("    shaderStorageImageArrayNonUniformIndexingNative: %#x.\n",
-                descriptor_indexing->shaderStorageImageArrayNonUniformIndexingNative);
-        TRACE("    shaderInputAttachmentArrayNonUniformIndexingNative: %#x.\n",
-                descriptor_indexing->shaderInputAttachmentArrayNonUniformIndexingNative);
-
-        TRACE("    robustBufferAccessUpdateAfterBind: %#x.\n",
-                descriptor_indexing->robustBufferAccessUpdateAfterBind);
-        TRACE("    quadDivergentImplicitLod: %#x.\n",
-                descriptor_indexing->quadDivergentImplicitLod);
-
-        TRACE("    maxPerStageDescriptorUpdateAfterBindSamplers: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindSamplers);
-        TRACE("    maxPerStageDescriptorUpdateAfterBindUniformBuffers: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindUniformBuffers);
-        TRACE("    maxPerStageDescriptorUpdateAfterBindStorageBuffers: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindStorageBuffers);
-        TRACE("    maxPerStageDescriptorUpdateAfterBindSampledImages: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindSampledImages);
-        TRACE("    maxPerStageDescriptorUpdateAfterBindStorageImages: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindStorageImages);
-        TRACE("    maxPerStageDescriptorUpdateAfterBindInputAttachments: %u.\n",
-                descriptor_indexing->maxPerStageDescriptorUpdateAfterBindInputAttachments);
-        TRACE("    maxPerStageUpdateAfterBindResources: %u.\n",
-                descriptor_indexing->maxPerStageUpdateAfterBindResources);
-
-        TRACE("    maxDescriptorSetUpdateAfterBindSamplers: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindSamplers);
-        TRACE("    maxDescriptorSetUpdateAfterBindUniformBuffers: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindUniformBuffers);
-        TRACE("    maxDescriptorSetUpdateAfterBindUniformBuffersDynamic: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
-        TRACE("    maxDescriptorSetUpdateAfterBindStorageBuffers: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageBuffers);
-        TRACE("    maxDescriptorSetUpdateAfterBindStorageBuffersDynamic: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
-        TRACE("    maxDescriptorSetUpdateAfterBindSampledImages: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindSampledImages);
-        TRACE("    maxDescriptorSetUpdateAfterBindStorageImages: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageImages);
-        TRACE("    maxDescriptorSetUpdateAfterBindInputAttachments: %u.\n",
-                descriptor_indexing->maxDescriptorSetUpdateAfterBindInputAttachments);
-    }
-
-    maintenance3 = vk_find_struct(properties2->pNext, PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES);
-    if (maintenance3)
-    {
-        TRACE("  VkPhysicalDeviceMaintenance3Properties:\n");
-        TRACE("    maxPerSetDescriptors: %u.\n", maintenance3->maxPerSetDescriptors);
-        TRACE("    maxMemoryAllocationSize: %#"PRIx64".\n", maintenance3->maxMemoryAllocationSize);
-    }
-
-    xfb = vk_find_struct(properties2->pNext, PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT);
-    if (xfb)
-    {
-        TRACE("  VkPhysicalDeviceTransformFeedbackPropertiesEXT:\n");
-        TRACE("    maxTransformFeedbackStreams: %u.\n", xfb->maxTransformFeedbackStreams);
-        TRACE("    maxTransformFeedbackBuffers: %u.\n", xfb->maxTransformFeedbackBuffers);
-        TRACE("    maxTransformFeedbackBufferSize: %#"PRIx64".\n", xfb->maxTransformFeedbackBufferSize);
-        TRACE("    maxTransformFeedbackStreamDataSize: %u.\n", xfb->maxTransformFeedbackStreamDataSize);
-        TRACE("    maxTransformFeedbackBufferDataSize: %u.\n", xfb->maxTransformFeedbackBufferDataSize);
-        TRACE("    maxTransformFeedbackBufferDataStride: %u.\n", xfb->maxTransformFeedbackBufferDataStride);
-        TRACE("    transformFeedbackQueries: %#x.\n", xfb->transformFeedbackQueries);
-        TRACE("    transformFeedbackStreamsLinesTriangles: %#x.\n", xfb->transformFeedbackStreamsLinesTriangles);
-        TRACE("    transformFeedbackRasterizationStreamSelect: %#x.\n", xfb->transformFeedbackRasterizationStreamSelect);
-        TRACE("    transformFeedbackDraw: %x.\n", xfb->transformFeedbackDraw);
-    }
-
-    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)
+    descriptor_indexing = &info->descriptor_indexing_properties;
+    TRACE("  VkPhysicalDeviceDescriptorIndexingPropertiesEXT:\n");
+
+    TRACE("    maxUpdateAfterBindDescriptorsInAllPools: %u.\n",
+            descriptor_indexing->maxUpdateAfterBindDescriptorsInAllPools);
+
+    TRACE("    shaderUniformBufferArrayNonUniformIndexingNative: %#x.\n",
+            descriptor_indexing->shaderUniformBufferArrayNonUniformIndexingNative);
+    TRACE("    shaderSampledImageArrayNonUniformIndexingNative: %#x.\n",
+            descriptor_indexing->shaderSampledImageArrayNonUniformIndexingNative);
+    TRACE("    shaderStorageBufferArrayNonUniformIndexingNative: %#x.\n",
+            descriptor_indexing->shaderStorageBufferArrayNonUniformIndexingNative);
+    TRACE("    shaderStorageImageArrayNonUniformIndexingNative: %#x.\n",
+            descriptor_indexing->shaderStorageImageArrayNonUniformIndexingNative);
+    TRACE("    shaderInputAttachmentArrayNonUniformIndexingNative: %#x.\n",
+            descriptor_indexing->shaderInputAttachmentArrayNonUniformIndexingNative);
+
+    TRACE("    robustBufferAccessUpdateAfterBind: %#x.\n",
+            descriptor_indexing->robustBufferAccessUpdateAfterBind);
+    TRACE("    quadDivergentImplicitLod: %#x.\n",
+            descriptor_indexing->quadDivergentImplicitLod);
+
+    TRACE("    maxPerStageDescriptorUpdateAfterBindSamplers: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindSamplers);
+    TRACE("    maxPerStageDescriptorUpdateAfterBindUniformBuffers: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindUniformBuffers);
+    TRACE("    maxPerStageDescriptorUpdateAfterBindStorageBuffers: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindStorageBuffers);
+    TRACE("    maxPerStageDescriptorUpdateAfterBindSampledImages: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindSampledImages);
+    TRACE("    maxPerStageDescriptorUpdateAfterBindStorageImages: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindStorageImages);
+    TRACE("    maxPerStageDescriptorUpdateAfterBindInputAttachments: %u.\n",
+            descriptor_indexing->maxPerStageDescriptorUpdateAfterBindInputAttachments);
+    TRACE("    maxPerStageUpdateAfterBindResources: %u.\n",
+            descriptor_indexing->maxPerStageUpdateAfterBindResources);
+
+    TRACE("    maxDescriptorSetUpdateAfterBindSamplers: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindSamplers);
+    TRACE("    maxDescriptorSetUpdateAfterBindUniformBuffers: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindUniformBuffers);
+    TRACE("    maxDescriptorSetUpdateAfterBindUniformBuffersDynamic: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
+    TRACE("    maxDescriptorSetUpdateAfterBindStorageBuffers: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageBuffers);
+    TRACE("    maxDescriptorSetUpdateAfterBindStorageBuffersDynamic: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
+    TRACE("    maxDescriptorSetUpdateAfterBindSampledImages: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindSampledImages);
+    TRACE("    maxDescriptorSetUpdateAfterBindStorageImages: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindStorageImages);
+    TRACE("    maxDescriptorSetUpdateAfterBindInputAttachments: %u.\n",
+            descriptor_indexing->maxDescriptorSetUpdateAfterBindInputAttachments);
+
+    maintenance3 = &info->maintenance3_properties;
+    TRACE("  VkPhysicalDeviceMaintenance3Properties:\n");
+    TRACE("    maxPerSetDescriptors: %u.\n", maintenance3->maxPerSetDescriptors);
+    TRACE("    maxMemoryAllocationSize: %#"PRIx64".\n", maintenance3->maxMemoryAllocationSize);
+
+    xfb = &info->xfb_properties;
+    TRACE("  VkPhysicalDeviceTransformFeedbackPropertiesEXT:\n");
+    TRACE("    maxTransformFeedbackStreams: %u.\n", xfb->maxTransformFeedbackStreams);
+    TRACE("    maxTransformFeedbackBuffers: %u.\n", xfb->maxTransformFeedbackBuffers);
+    TRACE("    maxTransformFeedbackBufferSize: %#"PRIx64".\n", xfb->maxTransformFeedbackBufferSize);
+    TRACE("    maxTransformFeedbackStreamDataSize: %u.\n", xfb->maxTransformFeedbackStreamDataSize);
+    TRACE("    maxTransformFeedbackBufferDataSize: %u.\n", xfb->maxTransformFeedbackBufferDataSize);
+    TRACE("    maxTransformFeedbackBufferDataStride: %u.\n", xfb->maxTransformFeedbackBufferDataStride);
+    TRACE("    transformFeedbackQueries: %#x.\n", xfb->transformFeedbackQueries);
+    TRACE("    transformFeedbackStreamsLinesTriangles: %#x.\n", xfb->transformFeedbackStreamsLinesTriangles);
+    TRACE("    transformFeedbackRasterizationStreamSelect: %#x.\n", xfb->transformFeedbackRasterizationStreamSelect);
+    TRACE("    transformFeedbackDraw: %x.\n", xfb->transformFeedbackDraw);
+
+    divisor_properties = &info->vertex_divisor_properties;
+    TRACE("  VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT:\n");
+    TRACE("    maxVertexAttribDivisor: %u.\n", divisor_properties->maxVertexAttribDivisor);
+}
+
+static void vkd3d_trace_physical_device_features(const struct vkd3d_physical_device_info *info)
 {
     const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *divisor_features;
     const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing;
     const VkPhysicalDeviceDepthClipEnableFeaturesEXT *depth_clip_features;
-    const VkPhysicalDeviceFeatures *features = &features2->features;
+    const VkPhysicalDeviceFeatures *features = &info->features2.features;
     const VkPhysicalDeviceTransformFeedbackFeaturesEXT *xfb;
 
     TRACE("Device features:\n");
@@ -1013,80 +1062,68 @@ static void vkd3d_trace_physical_device_features(const VkPhysicalDeviceFeatures2
     TRACE("  variableMultisampleRate: %#x.\n", features->variableMultisampleRate);
     TRACE("  inheritedQueries: %#x.\n", features->inheritedQueries);
 
-    descriptor_indexing = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT);
-    if (descriptor_indexing)
-    {
-        TRACE("  VkPhysicalDeviceDescriptorIndexingFeaturesEXT:\n");
-
-        TRACE("    shaderInputAttachmentArrayDynamicIndexing: %#x.\n",
-                descriptor_indexing->shaderInputAttachmentArrayDynamicIndexing);
-        TRACE("    shaderUniformTexelBufferArrayDynamicIndexing: %#x.\n",
-                descriptor_indexing->shaderUniformTexelBufferArrayDynamicIndexing);
-        TRACE("    shaderStorageTexelBufferArrayDynamicIndexing: %#x.\n",
-                descriptor_indexing->shaderStorageTexelBufferArrayDynamicIndexing);
-
-        TRACE("    shaderUniformBufferArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderUniformBufferArrayNonUniformIndexing);
-        TRACE("    shaderSampledImageArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderSampledImageArrayNonUniformIndexing);
-        TRACE("    shaderStorageBufferArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderStorageBufferArrayNonUniformIndexing);
-        TRACE("    shaderStorageImageArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderStorageImageArrayNonUniformIndexing);
-        TRACE("    shaderInputAttachmentArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderInputAttachmentArrayNonUniformIndexing);
-        TRACE("    shaderUniformTexelBufferArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderUniformTexelBufferArrayNonUniformIndexing);
-        TRACE("    shaderStorageTexelBufferArrayNonUniformIndexing: %#x.\n",
-                descriptor_indexing->shaderStorageTexelBufferArrayNonUniformIndexing);
-
-        TRACE("    descriptorBindingUniformBufferUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingUniformBufferUpdateAfterBind);
-        TRACE("    descriptorBindingSampledImageUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingSampledImageUpdateAfterBind);
-        TRACE("    descriptorBindingStorageImageUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingStorageImageUpdateAfterBind);
-        TRACE("    descriptorBindingStorageBufferUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingStorageBufferUpdateAfterBind);
-        TRACE("    descriptorBindingUniformTexelBufferUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind);
-        TRACE("    descriptorBindingStorageTexelBufferUpdateAfterBind: %#x.\n",
-                descriptor_indexing->descriptorBindingStorageTexelBufferUpdateAfterBind);
-
-        TRACE("    descriptorBindingUpdateUnusedWhilePending: %#x.\n",
-                descriptor_indexing->descriptorBindingUpdateUnusedWhilePending);
-        TRACE("    descriptorBindingPartiallyBound: %#x.\n",
-                descriptor_indexing->descriptorBindingPartiallyBound);
-        TRACE("    descriptorBindingVariableDescriptorCount: %#x.\n",
-                descriptor_indexing->descriptorBindingVariableDescriptorCount);
-        TRACE("    runtimeDescriptorArray: %#x.\n",
-                descriptor_indexing->runtimeDescriptorArray);
-    }
-
-    depth_clip_features = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT);
-    if (depth_clip_features)
-    {
-        TRACE("  VkPhysicalDeviceDepthClipEnableFeaturesEXT:\n");
-        TRACE("    depthClipEnable: %#x.\n", depth_clip_features->depthClipEnable);
-    }
-
-    xfb = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT);
-    if (xfb)
-    {
-        TRACE("  VkPhysicalDeviceTransformFeedbackFeaturesEXT:\n");
-        TRACE("    transformFeedback: %#x.\n", xfb->transformFeedback);
-        TRACE("    geometryStreams: %#x.\n", xfb->geometryStreams);
-    }
-
-    divisor_features = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT);
-    if (divisor_features)
-    {
-        TRACE("  VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT:\n");
-        TRACE("    vertexAttributeInstanceRateDivisor: %#x.\n",
-                divisor_features->vertexAttributeInstanceRateDivisor);
-        TRACE("    vertexAttributeInstanceRateZeroDivisor: %#x.\n",
-                divisor_features->vertexAttributeInstanceRateZeroDivisor);
-    }
+    descriptor_indexing = &info->descriptor_indexing_features;
+    TRACE("  VkPhysicalDeviceDescriptorIndexingFeaturesEXT:\n");
+
+    TRACE("    shaderInputAttachmentArrayDynamicIndexing: %#x.\n",
+            descriptor_indexing->shaderInputAttachmentArrayDynamicIndexing);
+    TRACE("    shaderUniformTexelBufferArrayDynamicIndexing: %#x.\n",
+            descriptor_indexing->shaderUniformTexelBufferArrayDynamicIndexing);
+    TRACE("    shaderStorageTexelBufferArrayDynamicIndexing: %#x.\n",
+            descriptor_indexing->shaderStorageTexelBufferArrayDynamicIndexing);
+
+    TRACE("    shaderUniformBufferArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderUniformBufferArrayNonUniformIndexing);
+    TRACE("    shaderSampledImageArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderSampledImageArrayNonUniformIndexing);
+    TRACE("    shaderStorageBufferArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderStorageBufferArrayNonUniformIndexing);
+    TRACE("    shaderStorageImageArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderStorageImageArrayNonUniformIndexing);
+    TRACE("    shaderInputAttachmentArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderInputAttachmentArrayNonUniformIndexing);
+    TRACE("    shaderUniformTexelBufferArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderUniformTexelBufferArrayNonUniformIndexing);
+    TRACE("    shaderStorageTexelBufferArrayNonUniformIndexing: %#x.\n",
+            descriptor_indexing->shaderStorageTexelBufferArrayNonUniformIndexing);
+
+    TRACE("    descriptorBindingUniformBufferUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingUniformBufferUpdateAfterBind);
+    TRACE("    descriptorBindingSampledImageUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingSampledImageUpdateAfterBind);
+    TRACE("    descriptorBindingStorageImageUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingStorageImageUpdateAfterBind);
+    TRACE("    descriptorBindingStorageBufferUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingStorageBufferUpdateAfterBind);
+    TRACE("    descriptorBindingUniformTexelBufferUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind);
+    TRACE("    descriptorBindingStorageTexelBufferUpdateAfterBind: %#x.\n",
+            descriptor_indexing->descriptorBindingStorageTexelBufferUpdateAfterBind);
+
+    TRACE("    descriptorBindingUpdateUnusedWhilePending: %#x.\n",
+            descriptor_indexing->descriptorBindingUpdateUnusedWhilePending);
+    TRACE("    descriptorBindingPartiallyBound: %#x.\n",
+            descriptor_indexing->descriptorBindingPartiallyBound);
+    TRACE("    descriptorBindingVariableDescriptorCount: %#x.\n",
+            descriptor_indexing->descriptorBindingVariableDescriptorCount);
+    TRACE("    runtimeDescriptorArray: %#x.\n",
+            descriptor_indexing->runtimeDescriptorArray);
+
+    depth_clip_features = &info->depth_clip_features;
+    TRACE("  VkPhysicalDeviceDepthClipEnableFeaturesEXT:\n");
+    TRACE("    depthClipEnable: %#x.\n", depth_clip_features->depthClipEnable);
+
+    xfb = &info->xfb_features;
+    TRACE("  VkPhysicalDeviceTransformFeedbackFeaturesEXT:\n");
+    TRACE("    transformFeedback: %#x.\n", xfb->transformFeedback);
+    TRACE("    geometryStreams: %#x.\n", xfb->geometryStreams);
+
+    divisor_features = &info->vertex_divisor_features;
+    TRACE("  VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT:\n");
+    TRACE("    vertexAttributeInstanceRateDivisor: %#x.\n",
+            divisor_features->vertexAttributeInstanceRateDivisor);
+    TRACE("    vertexAttributeInstanceRateZeroDivisor: %#x.\n",
+            divisor_features->vertexAttributeInstanceRateZeroDivisor);
 }
 
 static void vkd3d_init_feature_level(struct vkd3d_vulkan_info *vk_info,
@@ -1181,63 +1218,40 @@ static void vkd3d_init_feature_level(struct vkd3d_vulkan_info *vk_info,
 }
 
 static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
-        const struct vkd3d_device_create_info *create_info, VkPhysicalDeviceFeatures2KHR *features2,
+        const struct vkd3d_device_create_info *create_info,
+        struct vkd3d_physical_device_info *physical_device_info,
         uint32_t *device_extension_count, bool **user_extension_supported)
 {
     const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
-    VkPhysicalDeviceDescriptorIndexingPropertiesEXT descriptor_indexing_properties;
-    VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT vertex_divisor_properties;
-    const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *divisor_features;
     const struct vkd3d_optional_device_extensions_info *optional_extensions;
-    const VkPhysicalDeviceDepthClipEnableFeaturesEXT *depth_clip_features;
     VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing;
-    VkPhysicalDeviceMaintenance3Properties maintenance3_properties;
-    VkPhysicalDeviceTransformFeedbackPropertiesEXT xfb_properties;
     VkPhysicalDevice physical_device = device->vk_physical_device;
-    VkPhysicalDeviceFeatures *features = &features2->features;
     struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
-    VkPhysicalDeviceProperties2KHR device_properties2;
     VkExtensionProperties *vk_extensions;
+    VkPhysicalDeviceFeatures *features;
     uint32_t count;
     VkResult vr;
 
     *device_extension_count = 0;
 
-    memset(&maintenance3_properties, 0, sizeof(maintenance3_properties));
-    maintenance3_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
-    memset(&descriptor_indexing_properties, 0, sizeof(descriptor_indexing_properties));
-    descriptor_indexing_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT;
-    descriptor_indexing_properties.pNext = &maintenance3_properties;
-    memset(&xfb_properties, 0, sizeof(xfb_properties));
-    xfb_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT;
-    xfb_properties.pNext = &descriptor_indexing_properties;
-    memset(&vertex_divisor_properties, 0, sizeof(vertex_divisor_properties));
-    vertex_divisor_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT;
-    vertex_divisor_properties.pNext = &xfb_properties;
-    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(physical_device, physical_device_info, vk_procs);
+    vkd3d_trace_physical_device_features(physical_device_info);
+    vkd3d_trace_physical_device_limits(physical_device_info);
 
-    vkd3d_trace_physical_device(physical_device, &device_properties2.properties, vk_procs);
-    vkd3d_trace_physical_device_features(features2);
-    vkd3d_trace_physical_device_limits(&device_properties2);
+    features = &physical_device_info->features2.features;
 
     if (!features->sparseResidencyBuffer || !features->sparseResidencyImage2D)
     {
         features->sparseResidencyBuffer = VK_FALSE;
         features->sparseResidencyImage2D = VK_FALSE;
-        device_properties2.properties.sparseProperties.residencyNonResidentStrict = VK_FALSE;
+        physical_device_info->properties2.properties.sparseProperties.residencyNonResidentStrict = VK_FALSE;
     }
 
-    vulkan_info->device_limits = device_properties2.properties.limits;
-    vulkan_info->sparse_properties = device_properties2.properties.sparseProperties;
-    vulkan_info->rasterization_stream = xfb_properties.transformFeedbackRasterizationStreamSelect;
-    vulkan_info->transform_feedback_queries = xfb_properties.transformFeedbackQueries;
-    vulkan_info->max_vertex_attrib_divisor = max(vertex_divisor_properties.maxVertexAttribDivisor, 1);
+    vulkan_info->device_limits = physical_device_info->properties2.properties.limits;
+    vulkan_info->sparse_properties = physical_device_info->properties2.properties.sparseProperties;
+    vulkan_info->rasterization_stream = physical_device_info->xfb_properties.transformFeedbackRasterizationStreamSelect;
+    vulkan_info->transform_feedback_queries = physical_device_info->xfb_properties.transformFeedbackQueries;
+    vulkan_info->max_vertex_attrib_divisor = max(physical_device_info->vertex_divisor_properties.maxVertexAttribDivisor, 1);
 
     device->feature_options.DoublePrecisionFloatShaderOps = features->shaderFloat64;
     device->feature_options.OutputMergerLogicOp = features->logicOp;
@@ -1281,8 +1295,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
     device->feature_options.VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation = FALSE;
     device->feature_options.ResourceHeapTier = D3D12_RESOURCE_HEAP_TIER_2;
 
-    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL,
-            &count, NULL))) < 0)
+    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, NULL))) < 0)
     {
         ERR("Failed to enumerate device extensions, vr %d.\n", vr);
         return hresult_from_vk_result(vr);
@@ -1294,8 +1307,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
         return E_OUTOFMEMORY;
 
     TRACE("Enumerating %u device extensions.\n", count);
-    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL,
-            &count, vk_extensions))) < 0)
+    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, vk_extensions))) < 0)
     {
         ERR("Failed to enumerate device extensions, vr %d.\n", vr);
         vkd3d_free(vk_extensions);
@@ -1325,16 +1337,12 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
             *user_extension_supported, vulkan_info, "device",
             device->vkd3d_instance->config_flags & VKD3D_CONFIG_FLAG_VULKAN_DEBUG);
 
-    depth_clip_features = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT);
-    if (depth_clip_features)
-    {
-        vulkan_info->EXT_depth_clip_enable = depth_clip_features->depthClipEnable;
-    }
+    vulkan_info->EXT_depth_clip_enable = physical_device_info->depth_clip_features.depthClipEnable;
 
-    divisor_features = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT);
-    if (get_spec_version(vk_extensions, count, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) >= 3
-            && divisor_features)
+    if (get_spec_version(vk_extensions, count, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) >= 3)
     {
+        const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *divisor_features;
+        divisor_features = &physical_device_info->vertex_divisor_features;
         if (!divisor_features->vertexAttributeInstanceRateDivisor)
             vulkan_info->EXT_vertex_attribute_divisor = false;
         vulkan_info->vertex_attrib_zero_divisor = divisor_features->vertexAttributeInstanceRateZeroDivisor;
@@ -1358,7 +1366,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
     /* Disable unused Vulkan features. */
     features->shaderTessellationAndGeometryPointSize = VK_FALSE;
 
-    descriptor_indexing = vk_find_struct(features2->pNext, PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT);
+    descriptor_indexing = &physical_device_info->descriptor_indexing_features;
     if (descriptor_indexing)
     {
         descriptor_indexing->shaderInputAttachmentArrayDynamicIndexing = VK_FALSE;
@@ -1375,7 +1383,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
             || descriptor_indexing->descriptorBindingStorageBufferUpdateAfterBind
             || descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind
             || descriptor_indexing->descriptorBindingStorageTexelBufferUpdateAfterBind)
-            && !descriptor_indexing_properties.robustBufferAccessUpdateAfterBind)
+            && !physical_device_info->descriptor_indexing_properties.robustBufferAccessUpdateAfterBind)
     {
         WARN("Disabling robust buffer access for the update after bind feature.\n");
         features->robustBufferAccess = VK_FALSE;
@@ -1621,15 +1629,10 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
         const struct vkd3d_device_create_info *create_info)
 {
     const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
-    VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_features;
-    VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features;
     const struct vkd3d_optional_device_extensions_info *optional_extensions;
-    VkPhysicalDeviceDepthClipEnableFeaturesEXT depth_clip_features;
-    VkPhysicalDeviceTransformFeedbackFeaturesEXT xfb_features;
-    struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
+    struct vkd3d_physical_device_info physical_device_info;
     struct vkd3d_device_queue_info device_queue_info;
     bool *user_extension_supported = NULL;
-    VkPhysicalDeviceFeatures2 features2;
     VkPhysicalDevice physical_device;
     VkDeviceCreateInfo device_info;
     unsigned int device_index;
@@ -1661,25 +1664,9 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
 
     VK_CALL(vkGetPhysicalDeviceMemoryProperties(physical_device, &device->memory_properties));
 
-    memset(&depth_clip_features, 0, sizeof(depth_clip_features));
-    depth_clip_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT;
-    memset(&descriptor_indexing_features, 0, sizeof(descriptor_indexing_features));
-    descriptor_indexing_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT;
-    descriptor_indexing_features.pNext = &depth_clip_features;
-    memset(&xfb_features, 0, sizeof(xfb_features));
-    xfb_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
-    xfb_features.pNext = &descriptor_indexing_features;
-    memset(&vertex_divisor_features, 0, sizeof(vertex_divisor_features));
-    vertex_divisor_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
-    vertex_divisor_features.pNext = &xfb_features;
-    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));
+    vkd3d_physical_device_info_init(&physical_device_info, device);
 
-    if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &features2,
+    if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &physical_device_info,
             &extension_count, &user_extension_supported)))
         return hr;
 
@@ -1693,7 +1680,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 = &vertex_divisor_features;
+    device_info.pNext = physical_device_info.features2.pNext;
     device_info.flags = 0;
     device_info.queueCreateInfoCount = device_queue_info.vk_family_count;
     device_info.pQueueCreateInfos = device_queue_info.vk_queue_create_info;
@@ -1707,7 +1694,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
             optional_extensions ? optional_extensions->extension_count : 0,
             user_extension_supported, &device->vk_info);
     device_info.ppEnabledExtensionNames = extensions;
-    device_info.pEnabledFeatures = &features2.features;
+    device_info.pEnabledFeatures = &physical_device_info.features2.features;
     vkd3d_free(user_extension_supported);
 
     vr = VK_CALL(vkCreateDevice(physical_device, &device_info, NULL, &vk_device));
-- 
2.21.0




More information about the wine-devel mailing list