Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> --- Again, a few minor comments you might want to address later. Il 15/02/22 21:17, Francisco Casas ha scritto:
@@ -1633,69 +1647,36 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
if (v->initializer.args_count) { - unsigned int size = initializer_size(&v->initializer); - - if (type->type <= HLSL_CLASS_LAST_NUMERIC && v->initializer.args_count != 1 - && type->dimx * type->dimy != size) - { - hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_WRONG_PARAMETER_COUNT, - "Expected %u components in numeric initializer, but got %u.", - type->dimx * type->dimy, v->initializer.args_count); - free_parse_initializer(&v->initializer); - vkd3d_free(v); - continue; - } - if ((type->type == HLSL_CLASS_STRUCT || type->type == HLSL_CLASS_ARRAY) - && hlsl_type_component_count(type) != size) - { - hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_WRONG_PARAMETER_COUNT, - "Expected %u components in initializer, but got %u.", hlsl_type_component_count(type), size); - free_parse_initializer(&v->initializer); - vkd3d_free(v); - continue; - } - - if (type->type == HLSL_CLASS_STRUCT) - { - struct_var_initializer(ctx, var, &v->initializer); - list_move_tail(statements_list, v->initializer.instrs); - - free_parse_initializer(&v->initializer); - vkd3d_free(v); - continue; - } - if (type->type > HLSL_CLASS_LAST_NUMERIC) - { - FIXME("Initializers for non scalar/struct variables not supported yet.\n"); - free_parse_initializer(&v->initializer); - if (v->arrays.count) - vkd3d_free(v->arrays.sizes); - vkd3d_free(v); - continue; - } - if (v->arrays.count) - { - hlsl_fixme(ctx, &v->loc, "Array initializer."); - free_parse_initializer(&v->initializer); - vkd3d_free(v->arrays.sizes); - vkd3d_free(v); - continue; - } - if (v->initializer.args_count > 1) {
The flow structure here is a bit funny: instead of if (count != 0) { if (count > 1) ... else ... } I'd find more logical if (count == 1) ... else if (count > 1) ... (main point here is not introducing a useless embedding level, not really the case order)
- initialize_numeric_var(ctx, var, &v->initializer, 0, type, &initializer_offset); + if (type->type <= HLSL_CLASS_LAST_NUMERIC) + { + flatten_parse_initializer(ctx, &v->initializer); + if (v->initializer.args_count != size) + { + hlsl_fixme(ctx, &v->loc, "Could not flatten initializer."); + free_parse_initializer(&v->initializer); + if (v->arrays.count) + vkd3d_free(v->arrays.sizes);
Here there is a missing indentation. BTW, this gadget "if (count) free(sizes)" appears frequently. But I guess that if count is zero, then you can assume that sizes is NULL. If so, you don't need to guard the call to free(): free(NULL) is a no-op. Thanks, Giovanni.