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