2025-06-13 08:26:56 +10:00
|
|
|
From 96b79c613055cef6f2da2015081adf61bd88becd Mon Sep 17 00:00:00 2001
|
2025-05-28 07:36:25 +10:00
|
|
|
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
|
|
|
Date: Wed, 28 May 2025 07:14:59 +1000
|
|
|
|
Subject: [PATCH] Updated vkd3d to 87ec2d98973432531d7d9d08dfc837376f91844c.
|
|
|
|
|
|
|
|
---
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/dxbc.c | 10 +-
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/dxil.c | 8 +-
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/fx.c | 106 ++++++++++++++++----
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c | 2 +-
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/spirv.c | 2 +-
|
|
|
|
libs/vkd3d/libs/vkd3d-shader/tpf.c | 4 +-
|
|
|
|
6 files changed, 100 insertions(+), 32 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxbc.c b/libs/vkd3d/libs/vkd3d-shader/dxbc.c
|
|
|
|
index 9e3a57132a1..45a45c3ad4a 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/dxbc.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/dxbc.c
|
|
|
|
@@ -388,7 +388,7 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
|
|
|
|
{
|
|
|
|
WARN("Invalid data size %#zx.\n", section->data.size);
|
|
|
|
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_SIGNATURE,
|
|
|
|
- "Section size %zu is smaller than the minimum signature header size.\n", section->data.size);
|
|
|
|
+ "Section size %zu is smaller than the minimum signature header size.", section->data.size);
|
|
|
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -402,7 +402,7 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
|
|
|
|
{
|
|
|
|
WARN("Invalid header size %#x.\n", header_size);
|
|
|
|
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_SIGNATURE,
|
|
|
|
- "Signature header size %#x is invalid.\n", header_size);
|
|
|
|
+ "Signature header size %#x is invalid.", header_size);
|
|
|
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
|
|
|
}
|
|
|
|
skip_dword_unknown(&ptr, i - 2);
|
|
|
|
@@ -438,7 +438,7 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
|
|
|
|
|| !(e[i].semantic_name = vkd3d_strdup(name)))
|
|
|
|
{
|
|
|
|
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_STRING_REFERENCE,
|
|
|
|
- "Element %u has invalid semantic name reference %#zx (data size %#zx).\n",
|
|
|
|
+ "Element %u has invalid semantic name reference %#zx (data size %#zx).",
|
|
|
|
i, name_offset, section->data.size);
|
|
|
|
fail = true;
|
|
|
|
}
|
|
|
|
@@ -447,7 +447,7 @@ static int shader_parse_signature(const struct vkd3d_shader_dxbc_section_desc *s
|
|
|
|
if ((e[i].component_type = read_u32(&ptr)) > VKD3D_SHADER_COMPONENT_FLOAT)
|
|
|
|
{
|
|
|
|
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_COMPONENT_TYPE,
|
|
|
|
- "Element %u has invalid component type %#x.\n", i, e[i].component_type);
|
|
|
|
+ "Element %u has invalid component type %#x.", i, e[i].component_type);
|
|
|
|
fail = true;
|
|
|
|
}
|
|
|
|
e[i].register_index = read_u32(&ptr);
|
|
|
|
@@ -531,7 +531,7 @@ static int shdr_parse_features(const struct vkd3d_shader_dxbc_section_desc *sect
|
|
|
|
{
|
|
|
|
WARN("Invalid data size %#zx.\n", section->data.size);
|
|
|
|
vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE,
|
|
|
|
- "SFI0 section size %zu is too small to contain flags.\n", section->data.size);
|
|
|
|
+ "SFI0 section size %zu is too small to contain flags.", section->data.size);
|
|
|
|
return VKD3D_ERROR_INVALID_ARGUMENT;
|
|
|
|
}
|
|
|
|
flags = read_u64(&ptr);
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
|
|
|
index c9e99c6a9ba..9a4d194586b 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
|
|
|
@@ -6343,7 +6343,7 @@ static enum vkd3d_shader_opcode sm6_dx_map_wave_bit_op(enum dxil_wave_bit_op_kin
|
|
|
|
default:
|
|
|
|
FIXME("Unhandled wave bit op %u.\n", op);
|
|
|
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_UNHANDLED_INTRINSIC,
|
|
|
|
- "Wave bit operation %u is unhandled.\n", op);
|
|
|
|
+ "Wave bit operation %u is unhandled.", op);
|
|
|
|
return VKD3DSIH_INVALID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -6389,7 +6389,7 @@ static enum vkd3d_shader_opcode sm6_dx_map_wave_op(enum dxil_wave_op_kind op, bo
|
|
|
|
default:
|
|
|
|
FIXME("Unhandled wave op %u.\n", op);
|
|
|
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_UNHANDLED_INTRINSIC,
|
|
|
|
- "Wave operation %u is unhandled.\n", op);
|
|
|
|
+ "Wave operation %u is unhandled.", op);
|
|
|
|
return VKD3DSIH_INVALID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -6892,7 +6892,7 @@ static enum vkd3d_shader_opcode sm6_map_cast_op(uint64_t code, const struct sm6_
|
|
|
|
default:
|
|
|
|
FIXME("Unhandled cast op %"PRIu64".\n", code);
|
|
|
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
|
|
|
- "Cast operation %"PRIu64" is unhandled.\n", code);
|
|
|
|
+ "Cast operation %"PRIu64" is unhandled.", code);
|
|
|
|
return VKD3DSIH_INVALID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -6900,7 +6900,7 @@ static enum vkd3d_shader_opcode sm6_map_cast_op(uint64_t code, const struct sm6_
|
|
|
|
{
|
|
|
|
FIXME("Invalid types %u and/or %u for op %"PRIu64".\n", from->class, to->class, code);
|
|
|
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
|
|
|
- "Cast operation %"PRIu64" from type class %u, width %u to type class %u, width %u is invalid.\n",
|
|
|
|
+ "Cast operation %"PRIu64" from type class %u, width %u to type class %u, width %u is invalid.",
|
|
|
|
code, from->class, from->u.width, to->class, to->u.width);
|
|
|
|
return VKD3DSIH_INVALID;
|
|
|
|
}
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/fx.c b/libs/vkd3d/libs/vkd3d-shader/fx.c
|
|
|
|
index c475a46da42..1d5f95fa988 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/fx.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/fx.c
|
|
|
|
@@ -1547,12 +1547,33 @@ static uint32_t get_fx_2_type_class(const struct hlsl_type *type)
|
|
|
|
return hlsl_sm1_class(type);
|
|
|
|
}
|
|
|
|
|
|
|
|
-static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *name,
|
|
|
|
- const struct hlsl_semantic *semantic, bool is_combined_sampler, struct fx_write_context *fx)
|
|
|
|
+struct fx_2_write_type_context
|
|
|
|
{
|
|
|
|
- struct vkd3d_bytecode_buffer *buffer = &fx->unstructured;
|
|
|
|
- uint32_t semantic_offset, offset, elements_count = 0, name_offset;
|
|
|
|
- size_t i;
|
|
|
|
+ uint32_t *names;
|
|
|
|
+ uint32_t *semantics;
|
|
|
|
+ uint32_t count;
|
|
|
|
+
|
|
|
|
+ uint32_t offset;
|
|
|
|
+
|
|
|
|
+ bool is_combined_sampler;
|
|
|
|
+ struct fx_write_context *fx;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void count_type_iter(const struct hlsl_type *type, const char *name,
|
|
|
|
+ const struct hlsl_semantic *semantic, void *context)
|
|
|
|
+{
|
|
|
|
+ struct fx_2_write_type_context *ctx = context;
|
|
|
|
+
|
|
|
|
+ ++ctx->count;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void write_fx_2_type_iter(const struct hlsl_type *type, const char *name,
|
|
|
|
+ const struct hlsl_semantic *semantic, void *context)
|
|
|
|
+{
|
|
|
|
+ struct fx_2_write_type_context *ctx = context;
|
|
|
|
+ struct fx_write_context *fx = ctx->fx;
|
|
|
|
+ struct vkd3d_bytecode_buffer *buffer;
|
|
|
|
+ uint32_t offset, elements_count = 0;
|
|
|
|
|
|
|
|
/* Resolve arrays to element type and number of elements. */
|
|
|
|
if (type->class == HLSL_CLASS_ARRAY)
|
|
|
|
@@ -1561,13 +1582,11 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n
|
|
|
|
type = hlsl_get_multiarray_element_type(type);
|
|
|
|
}
|
|
|
|
|
|
|
|
- name_offset = write_string(name, fx);
|
|
|
|
- semantic_offset = semantic->raw_name ? write_string(semantic->raw_name, fx) : 0;
|
|
|
|
-
|
|
|
|
- offset = put_u32(buffer, hlsl_sm1_base_type(type, is_combined_sampler));
|
|
|
|
+ buffer = &fx->unstructured;
|
|
|
|
+ offset = put_u32(buffer, hlsl_sm1_base_type(type, ctx->is_combined_sampler));
|
|
|
|
put_u32(buffer, get_fx_2_type_class(type));
|
|
|
|
- put_u32(buffer, name_offset);
|
|
|
|
- put_u32(buffer, semantic_offset);
|
|
|
|
+ *ctx->names++ = put_u32(buffer, 0);
|
|
|
|
+ *ctx->semantics++ = put_u32(buffer, 0);
|
|
|
|
put_u32(buffer, elements_count);
|
|
|
|
|
|
|
|
switch (type->class)
|
|
|
|
@@ -1592,19 +1611,68 @@ static uint32_t write_fx_2_parameter(const struct hlsl_type *type, const char *n
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ /* Save the offset of the top level type. */
|
|
|
|
+ if (!ctx->offset)
|
|
|
|
+ ctx->offset = offset;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void write_fx_2_type_strings_iter(const struct hlsl_type *type, const char *name,
|
|
|
|
+ const struct hlsl_semantic *semantic, void *context)
|
|
|
|
+{
|
|
|
|
+ struct fx_2_write_type_context *ctx = context;
|
|
|
|
+ struct fx_write_context *fx = ctx->fx;
|
|
|
|
+ struct vkd3d_bytecode_buffer *buffer;
|
|
|
|
+
|
|
|
|
+ buffer = &fx->unstructured;
|
|
|
|
+ set_u32(buffer, *ctx->names++, write_string(name, fx));
|
|
|
|
+ set_u32(buffer, *ctx->semantics++, semantic->raw_name ? write_string(semantic->raw_name, fx) : 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void foreach_type(const struct hlsl_type *type, const char *name, const struct hlsl_semantic *semantic,
|
|
|
|
+ void (*iter_func)(const struct hlsl_type *type, const char *name, const struct hlsl_semantic *semantic, void *context),
|
|
|
|
+ void *context)
|
|
|
|
+{
|
|
|
|
+ iter_func(type, name, semantic, context);
|
|
|
|
+
|
|
|
|
+ type = hlsl_get_multiarray_element_type(type);
|
|
|
|
if (type->class == HLSL_CLASS_STRUCT)
|
|
|
|
{
|
|
|
|
- for (i = 0; i < type->e.record.field_count; ++i)
|
|
|
|
+ for (size_t i = 0; i < type->e.record.field_count; ++i)
|
|
|
|
{
|
|
|
|
const struct hlsl_struct_field *field = &type->e.record.fields[i];
|
|
|
|
-
|
|
|
|
- /* Validated in check_invalid_object_fields(). */
|
|
|
|
- VKD3D_ASSERT(hlsl_is_numeric_type(field->type));
|
|
|
|
- write_fx_2_parameter(field->type, field->name, &field->semantic, false, fx);
|
|
|
|
+ foreach_type(field->type, field->name, &field->semantic, iter_func, context);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+}
|
|
|
|
|
|
|
|
- return offset;
|
|
|
|
+static uint32_t write_fx_2_parameter(const struct hlsl_ir_var *var, struct fx_write_context *fx)
|
|
|
|
+{
|
|
|
|
+ struct fx_2_write_type_context ctx = { .fx = fx, .is_combined_sampler = var->is_combined_sampler };
|
|
|
|
+ uint32_t *offsets;
|
|
|
|
+
|
|
|
|
+ /* Parameter type information has to be stored in a contiguous segment, so
|
|
|
|
+ * that any structure fields come right after each other. To achieve that
|
|
|
|
+ * the variable length string data is written after the type data. */
|
|
|
|
+
|
|
|
|
+ /* Calculate the number of string entries needed for this type. */
|
|
|
|
+ foreach_type(var->data_type, var->name, &var->semantic, count_type_iter, &ctx);
|
|
|
|
+
|
|
|
|
+ if (!(offsets = calloc(ctx.count, 2 * sizeof(*offsets))))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ /* Writing type information also sets string offsets. */
|
|
|
|
+ ctx.names = offsets;
|
|
|
|
+ ctx.semantics = &offsets[ctx.count];
|
|
|
|
+ foreach_type(var->data_type, var->name, &var->semantic, write_fx_2_type_iter, &ctx);
|
|
|
|
+
|
|
|
|
+ /* Now the final pass to write the string data. */
|
|
|
|
+ ctx.names = offsets;
|
|
|
|
+ ctx.semantics = &offsets[ctx.count];
|
|
|
|
+ foreach_type(var->data_type, var->name, &var->semantic, write_fx_2_type_strings_iter, &ctx);
|
|
|
|
+
|
|
|
|
+ free(offsets);
|
|
|
|
+
|
|
|
|
+ return ctx.offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void write_fx_2_technique(struct hlsl_ir_var *var, struct fx_write_context *fx)
|
|
|
|
@@ -1876,7 +1944,7 @@ static void write_fx_2_parameters(struct fx_write_context *fx)
|
|
|
|
if (!is_type_supported_fx_2(ctx, var->data_type, &var->loc))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
- desc_offset = write_fx_2_parameter(var->data_type, var->name, &var->semantic, var->is_combined_sampler, fx);
|
|
|
|
+ desc_offset = write_fx_2_parameter(var, fx);
|
|
|
|
value_offset = write_fx_2_initial_value(var, fx);
|
|
|
|
|
|
|
|
flags = 0;
|
|
|
|
@@ -1899,7 +1967,7 @@ static void write_fx_2_annotation(struct hlsl_ir_var *var, struct fx_write_conte
|
|
|
|
struct vkd3d_bytecode_buffer *buffer = &fx->structured;
|
|
|
|
uint32_t desc_offset, value_offset;
|
|
|
|
|
|
|
|
- desc_offset = write_fx_2_parameter(var->data_type, var->name, &var->semantic, var->is_combined_sampler, fx);
|
|
|
|
+ desc_offset = write_fx_2_parameter(var, fx);
|
|
|
|
value_offset = write_fx_2_initial_value(var, fx);
|
|
|
|
|
|
|
|
put_u32(buffer, desc_offset);
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
|
|
index f8f5f65517b..e9d3d2ec8dd 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
|
|
@@ -3919,7 +3919,7 @@ static bool lower_separate_samples(struct hlsl_ctx *ctx, struct hlsl_ir_node *in
|
|
|
|
if (load->texel_offset.node)
|
|
|
|
{
|
|
|
|
hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE,
|
|
|
|
- "Texel offsets are not supported on profiles lower than 4.0.\n");
|
|
|
|
+ "Texel offsets are not supported on profiles lower than 4.0.");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
|
|
index 1f967c22406..a6f34703c2d 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
|
|
@@ -4239,7 +4239,7 @@ static bool spirv_compiler_get_register_info(struct spirv_compiler *compiler,
|
|
|
|
if (!(entry = rb_get(&compiler->symbol_table, ®_symbol)))
|
|
|
|
{
|
|
|
|
spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_REGISTER_TYPE,
|
|
|
|
- "Unrecognized register (%s).\n", debug_vkd3d_symbol(®_symbol));
|
|
|
|
+ "Unrecognized register (%s).", debug_vkd3d_symbol(®_symbol));
|
|
|
|
memset(register_info, 0, sizeof(*register_info));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/tpf.c b/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
|
|
|
index 59dca87c57d..6042a76c3c4 100644
|
|
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
|
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/tpf.c
|
|
|
|
@@ -1169,7 +1169,7 @@ static void shader_sm4_read_dcl_input_ps(struct vkd3d_shader_instruction *ins, u
|
|
|
|
WARN("No matching signature element for input register %u with mask %#x.\n",
|
|
|
|
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
|
|
|
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DCL,
|
|
|
|
- "No matching signature element for input register %u with mask %#x.\n",
|
|
|
|
+ "No matching signature element for input register %u with mask %#x.",
|
|
|
|
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
@@ -1195,7 +1195,7 @@ static void shader_sm4_read_dcl_input_ps_siv(struct vkd3d_shader_instruction *in
|
|
|
|
WARN("No matching signature element for input register %u with mask %#x.\n",
|
|
|
|
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
|
|
|
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DCL,
|
|
|
|
- "No matching signature element for input register %u with mask %#x.\n",
|
|
|
|
+ "No matching signature element for input register %u with mask %#x.",
|
|
|
|
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
--
|
|
|
|
2.47.2
|
|
|
|
|