Hi,
On 16/11/21 16:11, Francisco Casas wrote:
+static bool intrinsic_cross(struct hlsl_ctx *ctx,
const struct parse_initializer *params, struct vkd3d_shader_location loc) > +{
- struct hlsl_ir_node *v0 = params->args[0], *v1 = params->args[1];
- struct hlsl_ir_swizzle *v0_swzl1, *v0_swzl2, *v1_swzl1, *v1_swzl2;
- struct hlsl_ir_node *mul1_neg;
- struct hlsl_ir_expr *mul1, *mul2;
- int wrong_arg = -1;
Whenever possible, the declaration block is sorted by decreasing line length, sometimes with very funny results.
- if (v1->data_type->type != HLSL_CLASS_VECTOR)
wrong_arg = 1;
- if (v0->data_type->type != HLSL_CLASS_VECTOR)
wrong_arg = 0;
- if (wrong_arg != -1)
- {
struct vkd3d_string_buffer *string;
if ((string = hlsl_type_to_string(ctx, params->args[wrong_arg]->data_type)))
hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
"Wrong type for argument %d of 'cross': expected 'vector' but got '%s'.",
wrong_arg, string->buffer);
hlsl_release_string_buffer(ctx, string);
return false;
- }
I think we need more checks on the types here (on the base type and on the vector length): from my experiments, it seems that cross() accepts vectors of length 3 or 4 (truncating them to 3 in that case, with a warning); it accepts whatever base type, but it casts non-floating point types to float. Implicitly, this means that it returns half3 when both its arguments have base type half, and float3 in every other case.
(BTW, "vector" is not a type name, use names like "float3")
En passant, I am a bit bothered by the fact that we don't have precise rules for typing in the IR, but that's not this patch's fault.
The actual cross vector computation looks fine.
Thanks, Giovanni.