[PATCH vkd3d v4 1/6] tests: Test matrix multiplication.

Francisco Casas fcasas at codeweavers.com
Fri Jan 28 07:35:01 CST 2022


Signed-off-by: Francisco Casas <fcasas at codeweavers.com>

Hmm, this proves that float1 and float are different things:

January 28, 2022 5:03 AM, "Giovanni Mascellani" <gmascellani at codeweavers.com> wrote:

> +[pixel shader]
> +float4 main(float4 pos : sv_position) : sv_target
> +{
> + float1 x = float1(10.0);
> + float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
> + 5.0, 6.0, 7.0, 8.0,
> + 9.0, 10.0, 11.0, 12.0,
> + 13.0, 14.0, 15.0, 16.0);
> +
> + return mul(x, y);
> +}
> +
> +[test]
> +draw quad
> +probe all rgba (10.0, 20.0, 30.0, 40.0)
> +

It seems that mul checks whether it is a scalar-scalar, scalar-vector,
scalar-matrix, vector-scalar, vector-vector, vector-matrix, matrix-scalar,
matrix-vector, or matrix-matrix multiplication, using the equivalent to our 
hlsl_type_class.

This difference makes me wonder whether we are wrong assuming float and float1
are the same in other parts of the codebase, for instance:

---
static bool fold_redundant_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
{
    if (instr->type == HLSL_IR_EXPR)
    {
        struct hlsl_ir_expr *expr = hlsl_ir_expr(instr);
        const struct hlsl_type *src_type = expr->operands[0].node->data_type;
        const struct hlsl_type *dst_type = expr->node.data_type;

        if (expr->op != HLSL_OP1_CAST)
            return false;

        if (hlsl_types_are_equal(src_type, dst_type)
                || (src_type->base_type == dst_type->base_type && is_vec1(src_type) && is_vec1(dst_type)))
        {
            replace_node(&expr->node, expr->operands[0].node);
            return true;
        }
    }

    return false;
}
---

would dismiss a cast from float to float1, and, if I am not mistaken, the compiler
would be failing with this shader:

---
float4 main(float4 pos : sv_position) : sv_target
{
    float xx = 10.0;
    float1 x = float1(xx);
    float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
                          5.0, 6.0, 7.0, 8.0,
                          9.0, 10.0, 11.0, 12.0,
                          13.0, 14.0, 15.0, 16.0);

    return mul(x, y);
}
---



More information about the wine-devel mailing list