[PATCH vkd3d 4/4] vkd3d: Add a helper function to calculate variable binding upper bound.

Conor McCarthy cmccarthy at codeweavers.com
Wed May 26 03:04:37 CDT 2021


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/state.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 749d3763..03684264 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -749,6 +749,62 @@ static uint32_t vkd3d_descriptor_magic_from_d3d12(D3D12_DESCRIPTOR_RANGE_TYPE ty
     }
 }
 
+static uint32_t vk_max_unbounded_range_descriptor_count(D3D12_SHADER_VISIBILITY visibility,
+    const uint32_t stage_count[5], uint32_t max_descriptors, uint32_t binding_count)
+{
+    static const unsigned int stages[5] = {
+        D3D12_SHADER_VISIBILITY_VERTEX,
+        D3D12_SHADER_VISIBILITY_HULL,
+        D3D12_SHADER_VISIBILITY_DOMAIN,
+        D3D12_SHADER_VISIBILITY_GEOMETRY,
+        D3D12_SHADER_VISIBILITY_PIXEL};
+    uint32_t count = max_descriptors / binding_count;
+    unsigned int i;
+
+    for (i = 0; i < 5; ++i)
+        if (visibility == D3D12_SHADER_VISIBILITY_ALL || visibility == stages[i])
+            count = (max_descriptors > stage_count[i])
+                    ? min(count, (max_descriptors - stage_count[i]) / binding_count)
+                    : 0;
+    if (!count)
+        ERR("Exceeded maximum bindless descriptor count for shader visibility %u.\n", visibility);
+
+    return count;
+}
+
+static unsigned int vk_descriptor_count_from_d3d12_desc_range_type(D3D12_DESCRIPTOR_RANGE_TYPE type,
+    D3D12_SHADER_VISIBILITY visibility, const struct d3d12_root_signature_info *info,
+    const struct d3d12_device *device)
+{
+    unsigned int all_max = vk_max_unbounded_range_descriptor_count(visibility, info->total_stage_count,
+            device->vk_info.device_limits.maxPerStageResources, info->total_unbounded_set_count);
+    unsigned int type_max;
+
+    switch (type)
+    {
+        case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
+            type_max = vk_max_unbounded_range_descriptor_count(visibility, info->srv_stage_count,
+                device->vk_info.device_limits.maxPerStageDescriptorSampledImages, info->srv_unbounded_set_count);
+            break;
+        case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
+            type_max = vk_max_unbounded_range_descriptor_count(visibility, info->uav_stage_count,
+                device->vk_info.device_limits.maxPerStageDescriptorStorageImages, info->uav_unbounded_set_count);
+            break;
+        case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
+            type_max = vk_max_unbounded_range_descriptor_count(visibility, info->cbv_stage_count,
+                device->vk_info.device_limits.maxPerStageDescriptorUniformBuffers, info->cbv_unbounded_set_count);
+            break;
+        case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
+            type_max = vk_max_unbounded_range_descriptor_count(visibility, info->sampler_stage_count,
+                device->vk_info.device_limits.maxPerStageDescriptorSamplers, info->sampler_unbounded_set_count);
+            break;
+        default:
+            ERR("Invalid range type %#x.\n", type);
+            return 0;
+    }
+    return min(type_max, all_max);
+}
+
 static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_root_signature *root_signature,
         const D3D12_ROOT_SIGNATURE_DESC *desc, struct vkd3d_descriptor_set_context *context)
 {
-- 
2.31.1




More information about the wine-devel mailing list