vkd3d-shader: Use a separate allocation for the "semantic_name" field of shader signature elements.

For tpf shader this would previously be a pointer into the original
shader code, and for d3dbc shaders we'd use static strings.
Unfortunately the dxil parser creates shader signatures where these
are pointers to metadata strings, and those go away when we call
sm6_parser_cleanup().

We could conceivably store a flag in the shader signature to indicate
whether shader_signature_cleanup()/vkd3d_shader_free_shader_signature()
should free the "semantic_name" field. It'd be a little ugly, and seems
unlikely to be worth it, but I'd be willing to be convinced.
This commit is contained in:
Henri Verbeet
2024-05-21 20:11:26 +02:00
committed by Alexandre Julliard
parent 105ef28273
commit b5ac6ac636
Notes: Alexandre Julliard 2024-05-23 23:23:55 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/880
4 changed files with 43 additions and 5 deletions

View File

@@ -657,7 +657,15 @@ static bool vkd3d_shader_signature_from_shader_signature(struct vkd3d_shader_sig
struct vkd3d_shader_signature_element *d = &signature->elements[i];
struct signature_element *e = &src->elements[i];
d->semantic_name = e->semantic_name;
if (!(d->semantic_name = vkd3d_strdup(e->semantic_name)))
{
for (unsigned int j = 0; j < i; ++j)
{
vkd3d_free((void *)signature->elements[j].semantic_name);
}
vkd3d_free(signature->elements);
return false;
}
d->semantic_index = e->semantic_index;
d->stream_index = e->stream_index;
d->sysval_semantic = e->sysval_semantic;
@@ -1763,6 +1771,10 @@ void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signatu
void shader_signature_cleanup(struct shader_signature *signature)
{
for (unsigned int i = 0; i < signature->element_count; ++i)
{
vkd3d_free((void *)signature->elements[i].semantic_name);
}
vkd3d_free(signature->elements);
signature->elements = NULL;
}
@@ -1820,6 +1832,10 @@ void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature
{
TRACE("signature %p.\n", signature);
for (unsigned int i = 0; i < signature->element_count; ++i)
{
vkd3d_free((void *)signature->elements[i].semantic_name);
}
vkd3d_free(signature->elements);
signature->elements = NULL;
}