mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-09-13 09:16:14 -07:00
vkd3d-shader/hlsl: Store original semantic name.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
parent
47d077e5ce
commit
1124ea46ee
Notes:
Henri Verbeet
2024-06-11 17:09:32 +02:00
Approved-by: Elizabeth Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/902
@ -3352,9 +3352,25 @@ void hlsl_free_attribute(struct hlsl_attribute *attr)
|
||||
void hlsl_cleanup_semantic(struct hlsl_semantic *semantic)
|
||||
{
|
||||
vkd3d_free((void *)semantic->name);
|
||||
vkd3d_free((void *)semantic->raw_name);
|
||||
memset(semantic, 0, sizeof(*semantic));
|
||||
}
|
||||
|
||||
bool hlsl_clone_semantic(struct hlsl_ctx *ctx, struct hlsl_semantic *dst, const struct hlsl_semantic *src)
|
||||
{
|
||||
*dst = *src;
|
||||
dst->name = dst->raw_name = NULL;
|
||||
if (src->name && !(dst->name = hlsl_strdup(ctx, src->name)))
|
||||
return false;
|
||||
if (src->raw_name && !(dst->raw_name = hlsl_strdup(ctx, src->raw_name)))
|
||||
{
|
||||
hlsl_cleanup_semantic(dst);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void free_function_decl(struct hlsl_ir_function_decl *decl)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -222,6 +222,8 @@ struct hlsl_semantic
|
||||
const char *name;
|
||||
uint32_t index;
|
||||
|
||||
/* Name exactly as it appears in the sources. */
|
||||
const char *raw_name;
|
||||
/* If the variable or field that stores this hlsl_semantic has already reported that it is missing. */
|
||||
bool reported_missing;
|
||||
/* In case the variable or field that stores this semantic has already reported to use a
|
||||
@ -1284,7 +1286,9 @@ bool hlsl_init_deref_from_index_chain(struct hlsl_ctx *ctx, struct hlsl_deref *d
|
||||
bool hlsl_copy_deref(struct hlsl_ctx *ctx, struct hlsl_deref *deref, const struct hlsl_deref *other);
|
||||
|
||||
void hlsl_cleanup_deref(struct hlsl_deref *deref);
|
||||
|
||||
void hlsl_cleanup_semantic(struct hlsl_semantic *semantic);
|
||||
bool hlsl_clone_semantic(struct hlsl_ctx *ctx, struct hlsl_semantic *dst, const struct hlsl_semantic *src);
|
||||
|
||||
void hlsl_cleanup_ir_switch_cases(struct list *cases);
|
||||
void hlsl_free_ir_switch_case(struct hlsl_ir_switch_case *c);
|
||||
|
@ -2335,14 +2335,10 @@ static void declare_var(struct hlsl_ctx *ctx, struct parse_variable_def *v)
|
||||
if (!(var_name = vkd3d_strdup(v->name)))
|
||||
return;
|
||||
|
||||
new_semantic = v->semantic;
|
||||
if (v->semantic.name)
|
||||
if (!hlsl_clone_semantic(ctx, &new_semantic, &v->semantic))
|
||||
{
|
||||
if (!(new_semantic.name = vkd3d_strdup(v->semantic.name)))
|
||||
{
|
||||
vkd3d_free(var_name);
|
||||
return;
|
||||
}
|
||||
vkd3d_free(var_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(var = hlsl_new_var(ctx, var_name, type, &v->loc, &new_semantic, modifiers, &v->reg_reservation)))
|
||||
@ -6433,6 +6429,9 @@ semantic:
|
||||
{
|
||||
char *p;
|
||||
|
||||
if (!($$.raw_name = hlsl_strdup(ctx, $2)))
|
||||
YYABORT;
|
||||
|
||||
for (p = $2 + strlen($2); p > $2 && isdigit(p[-1]); --p)
|
||||
;
|
||||
$$.name = $2;
|
||||
|
@ -320,7 +320,7 @@ static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir
|
||||
}
|
||||
}
|
||||
|
||||
if (!(new_semantic.name = hlsl_strdup(ctx, semantic->name)))
|
||||
if (!(hlsl_clone_semantic(ctx, &new_semantic, semantic)))
|
||||
{
|
||||
vkd3d_free(new_name);
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user