vkd3d-shader: Handle arrayed elements in vkd3d_shader_signature_from_shader_signature().

This commit is contained in:
Henri Verbeet
2025-02-19 14:43:31 +01:00
parent ce5164e26e
commit 2e62e9ea7e
Notes: Henri Verbeet 2025-02-20 16:07:33 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1383
2 changed files with 39 additions and 24 deletions

View File

@@ -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;

View File

@@ -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);