[PATCH vkd3d v2 07/10] vkd3d-shader/hlsl: Support complex numeric initializers.

Francisco Casas fcasas at codeweavers.com
Wed Jan 12 10:55:36 CST 2022


Hello,

January 12, 2022 1:35 PM, "Giovanni Mascellani" <gmascellani at codeweavers.com> wrote:

> Hi,
> 
> this patch causes a regression on this shader:
> 
> ---
> float4 main() : SV_TARGET
> {
> float3 x = float4(71, 72, 73, 74);
> return float4(x, 74);
> }
> ---
> 
> This is accepted by native compiler and is works before your patch, but is broken after.
> 
> (see below)
> 
> On 10/01/22 20:33, Francisco Casas wrote:
> 
>> @@ -1495,23 +1541,27 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type
>> *basic_t
>> vkd3d_free(v);
>> continue;
>> }
>> - if (v->initializer.args_count > 1)
>> +
>> + if (type->type <= HLSL_CLASS_LAST_NUMERIC && size == 1)
>> {
>> - hlsl_fixme(ctx, &v->loc, "Complex initializer.");
>> - free_parse_initializer(&v->initializer);
>> - vkd3d_free(v);
>> - continue;
>> + struct hlsl_ir_load *load = hlsl_new_var_load(ctx, var, var->loc);
>> +
>> + list_add_tail(v->initializer.instrs, &load->node.entry);
>> + add_assignment(ctx, v->initializer.instrs, &load->node, ASSIGN_OP_ASSIGN,
>> v->initializer.args[0]);
>> }
> 
> In other words, it seems that here you have to test for "v->initializer.args_count == 1", not "size
> == 1". But do your own research.
> 
Yes, it is exactly that. Good catch!

> Also, consider adding something similar to my example above to the tests (in the spirit of
> "everything that was gotten wrong at least once is a good candidate for a test").
> 
Will do.

> Thanks, Giovanni.



More information about the wine-devel mailing list