From 2e62e9ea7e26386af0eaed49aecedf5da5331472 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 19 Feb 2025 14:43:31 +0100 Subject: [PATCH] vkd3d-shader: Handle arrayed elements in vkd3d_shader_signature_from_shader_signature(). --- libs/vkd3d-shader/vkd3d_shader_main.c | 47 ++++++++++++++------------- tests/vkd3d_shader_api.c | 16 +++++++-- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 614a28bd..ef6eb293 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -748,12 +748,20 @@ void vkd3d_shader_free_messages(char *messages) static bool vkd3d_shader_signature_from_shader_signature(struct vkd3d_shader_signature *signature, const struct shader_signature *src) { - unsigned int i; + struct vkd3d_shader_signature_element *d; + const struct signature_element *e; + size_t count, i, j; - signature->element_count = src->element_count; + for (i = 0, count = 0; i < src->element_count; ++i) + { + e = &src->elements[i]; + count += e->register_count; + } + + signature->element_count = count; if (!src->elements) { - VKD3D_ASSERT(!signature->element_count); + VKD3D_ASSERT(!count); signature->elements = NULL; return true; } @@ -761,30 +769,25 @@ static bool vkd3d_shader_signature_from_shader_signature(struct vkd3d_shader_sig if (!(signature->elements = vkd3d_calloc(signature->element_count, sizeof(*signature->elements)))) return false; - for (i = 0; i < signature->element_count; ++i) + for (i = 0, d = signature->elements; i < src->element_count; ++i) { - struct vkd3d_shader_signature_element *d = &signature->elements[i]; - struct signature_element *e = &src->elements[i]; - - if (!(d->semantic_name = vkd3d_strdup(e->semantic_name))) + for (j = 0, e = &src->elements[i]; j < e->register_count; ++j) { - for (unsigned int j = 0; j < i; ++j) + if (!(d->semantic_name = vkd3d_strdup(e->semantic_name))) { - vkd3d_free((void *)signature->elements[j].semantic_name); + vkd3d_shader_free_shader_signature(signature); + return false; } - vkd3d_free(signature->elements); - return false; + d->semantic_index = e->semantic_index + j; + d->stream_index = e->stream_index; + d->sysval_semantic = e->sysval_semantic; + d->component_type = e->component_type; + d->register_index = e->register_index + j; + d->mask = e->mask; + d->used_mask = e->used_mask; + d->min_precision = e->min_precision; + ++d; } - d->semantic_index = e->semantic_index; - d->stream_index = e->stream_index; - d->sysval_semantic = e->sysval_semantic; - d->component_type = e->component_type; - d->register_index = e->register_index; - if (e->register_count > 1) - FIXME("Arrayed elements are not supported yet.\n"); - d->mask = e->mask; - d->used_mask = e->used_mask; - d->min_precision = e->min_precision; } return true; diff --git a/tests/vkd3d_shader_api.c b/tests/vkd3d_shader_api.c index e053eb9a..e4472aec 100644 --- a/tests/vkd3d_shader_api.c +++ b/tests/vkd3d_shader_api.c @@ -904,11 +904,23 @@ static void test_scan_signatures(void) rc = vkd3d_shader_scan(&compile_info, NULL); ok(rc == VKD3D_OK, "Got rc %d.\n", rc); - todo ok(signature_info.input.element_count == dxil_tests[i].input_count, + ok(signature_info.input.element_count == dxil_tests[i].input_count, "Got input count %u.\n", signature_info.input.element_count); + for (j = 0; j < signature_info.input.element_count; ++j) + { + vkd3d_test_push_context("input %u", j); + check_signature_element(&signature_info.input.elements[j], &dxil_tests[i].inputs[j]); + vkd3d_test_pop_context(); + } - todo ok(signature_info.output.element_count == dxil_tests[i].output_count, + ok(signature_info.output.element_count == dxil_tests[i].output_count, "Got output count %u.\n", signature_info.output.element_count); + for (j = 0; j < signature_info.output.element_count; ++j) + { + vkd3d_test_push_context("output %u", j); + check_signature_element(&signature_info.output.elements[j], &dxil_tests[i].outputs[j]); + vkd3d_test_pop_context(); + } ok(!signature_info.patch_constant.element_count, "Got patch constant count %u.\n", signature_info.patch_constant.element_count);