From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl.h | 2 ++ libs/vkd3d-shader/hlsl_codegen.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index b3092550..1ec802ea 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -226,6 +226,8 @@ struct hlsl_struct_field
/* Offset where the field name starts in the output bytecode, in bytes. */ size_t name_bytecode_offset; + + bool is_missing_semantic; };
/* Information of the register allocated for an instruction node or variable. diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 479abc1d..82ac2b98 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -221,6 +221,17 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru list_add_after(&load->node.entry, &store->node.entry); }
+static void validate_field_semantic(struct hlsl_ctx *ctx, struct hlsl_struct_field *field) +{ + if (!field->semantic.name && hlsl_get_multiarray_type(field->type)->class <= HLSL_CLASS_LAST_NUMERIC + && !field->is_missing_semantic) + { + hlsl_note(ctx, &field->loc, VKD3D_SHADER_LOG_ERROR, + "Field '%s' is missing a semantic.", field->name); + field->is_missing_semantic = true; + } +} + static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_type *type, unsigned int modifiers, const struct hlsl_semantic *semantic, bool output) { @@ -275,6 +286,7 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct if (type->class == HLSL_CLASS_STRUCT) { field = &type->e.record.fields[i]; + validate_field_semantic(ctx, field); field_semantic_copy = field->semantic; semantic = &field_semantic_copy; } @@ -378,6 +390,7 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct if (type->class == HLSL_CLASS_STRUCT) { field = &type->e.record.fields[i]; + validate_field_semantic(ctx, field); field_semantic_copy = field->semantic; semantic = &field_semantic_copy; }