Conor McCarthy : vkd3d: Reject descriptor tables containing register collisions.

Alexandre Julliard julliard at winehq.org
Wed Oct 6 15:51:13 CDT 2021


Module: vkd3d
Branch: master
Commit: d3090699c5996ad596b4b773deb0d0ffc5d18093
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=d3090699c5996ad596b4b773deb0d0ffc5d18093

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Wed Oct  6 18:43:29 2021 +0200

vkd3d: Reject descriptor tables containing register collisions.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/state.c | 37 +++++++++++++++++++++++++++++++++++++
 tests/d3d12.c      |  4 +---
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index ffb3e2f..990b49b 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -662,6 +662,39 @@ static HRESULT d3d12_root_signature_init_descriptor_array_binding(struct d3d12_r
     return S_OK;
 }
 
+static int compare_register_range(const void *a, const void *b)
+{
+    const struct d3d12_root_descriptor_table_range *range_a = a, *range_b = b;
+    int ret;
+
+    if ((ret = range_a->type - range_b->type))
+        return ret;
+
+    if ((ret = range_a->register_space - range_b->register_space))
+        return ret;
+
+    return range_a->base_register_idx - range_b->base_register_idx;
+}
+
+static HRESULT validate_descriptor_register_ranges(const struct d3d12_root_descriptor_table_range *ranges,
+        unsigned int count)
+{
+    const struct d3d12_root_descriptor_table_range *range, *prev;
+    unsigned int i;
+
+    for (i = 1; i < count; ++i)
+    {
+        range = &ranges[i];
+        prev = &ranges[i - 1];
+
+        if (range->type == prev->type && range->register_space == prev->register_space
+                && range->base_register_idx - prev->base_register_idx < prev->descriptor_count)
+            return E_INVALIDARG;
+    }
+
+    return S_OK;
+}
+
 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)
 {
@@ -715,6 +748,10 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
             offset += range->NumDescriptors;
         }
 
+        qsort(table->ranges, range_count, sizeof(*table->ranges), compare_register_range);
+        if (FAILED(hr = validate_descriptor_register_ranges(table->ranges, range_count)))
+            return hr;
+
         for (j = 0; j < range_count; ++j)
         {
             struct d3d12_root_descriptor_table_range *range;
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 5dea781..57c39d2 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -2674,9 +2674,7 @@ static void test_create_root_signature(void)
     descriptor_ranges[1].BaseShaderRegister = 7;
     descriptor_ranges[1].OffsetInDescriptorsFromTableStart = 8;
     hr = create_root_signature(device, &root_signature_desc, &root_signature);
-    todo ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
-    if (SUCCEEDED(hr))
-        ID3D12RootSignature_Release(root_signature);
+    ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
 
     /* Identical ranges and register indices but different type. */
     descriptor_ranges[1] = descriptor_ranges[0];




More information about the wine-cvs mailing list