[PATCH vkd3d v2 09/10] vkd3d-shader/hlsl: Do not cast types in add_expr.

Giovanni Mascellani gmascellani at codeweavers.com
Fri Oct 15 03:37:03 CDT 2021


Determining cast types and return type is now delegated to higher level
helpers, which are differentiated according to the operation category.

Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
 libs/vkd3d-shader/hlsl.y | 51 +++-------------------------------------
 1 file changed, 3 insertions(+), 48 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index a50db4ef..f18e4e05 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -999,57 +999,12 @@ static bool expr_common_shape(struct hlsl_ctx *ctx, struct hlsl_type *t1, struct
     return true;
 }
 
-static struct hlsl_type *expr_common_type(struct hlsl_ctx *ctx, struct hlsl_type *t1, struct hlsl_type *t2,
-        struct vkd3d_shader_location *loc)
-{
-    enum hlsl_type_class type;
-    enum hlsl_base_type base;
-    unsigned int dimx, dimy;
-
-    if (!expr_common_shape(ctx, t1, t2, loc, &type, &dimx, &dimy))
-        return NULL;
-
-    base = expr_common_base_type(t1->base_type, t2->base_type);
-
-    return hlsl_get_numeric_type(ctx, type, base, dimx, dimy);
-}
-
 static struct hlsl_ir_expr *add_expr(struct hlsl_ctx *ctx, struct list *instrs, enum hlsl_ir_expr_op op,
-        struct hlsl_ir_node *operands[HLSL_MAX_OPERANDS], struct vkd3d_shader_location *loc)
+        struct hlsl_ir_node *operands[HLSL_MAX_OPERANDS], struct hlsl_type *type, struct vkd3d_shader_location *loc)
 {
     struct hlsl_ir_expr *expr;
-    struct hlsl_type *type;
     unsigned int i;
 
-    type = operands[0]->data_type;
-    for (i = 1; i < HLSL_MAX_OPERANDS; ++i)
-    {
-        if (!operands[i])
-            break;
-        type = expr_common_type(ctx, type, operands[i]->data_type, loc);
-        if (!type)
-            return NULL;
-    }
-    for (i = 0; i < HLSL_MAX_OPERANDS; ++i)
-    {
-        struct hlsl_ir_expr *cast;
-
-        if (!operands[i])
-            break;
-        if (hlsl_types_are_equal(operands[i]->data_type, type))
-            continue;
-        if (operands[i]->data_type->dimx * operands[i]->data_type->dimy != 1
-                && operands[i]->data_type->dimx * operands[i]->data_type->dimy != type->dimx * type->dimy)
-            hlsl_warning(ctx, operands[i]->loc, VKD3D_SHADER_WARNING_HLSL_IMPLICIT_TRUNCATION,
-                    "Implicit truncation of %s type.",
-                    operands[i]->data_type->type == HLSL_CLASS_VECTOR ? "vector" : "matrix");
-
-        if (!(cast = hlsl_new_cast(ctx, operands[i], type, &operands[i]->loc)))
-            return NULL;
-        list_add_after(&operands[i]->entry, &cast->node.entry);
-        operands[i] = &cast->node;
-    }
-
     if (!(expr = hlsl_alloc(ctx, sizeof(*expr))))
         return NULL;
     init_node(&expr->node, HLSL_IR_EXPR, type, *loc);
@@ -1066,7 +1021,7 @@ static struct hlsl_ir_expr *add_unary_arithmetic_expr(struct hlsl_ctx *ctx, stru
 {
     struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {arg};
 
-    return add_expr(ctx, instrs, op, args, loc);
+    return add_expr(ctx, instrs, op, args, arg->data_type, loc);
 }
 
 static struct hlsl_ir_expr *add_binary_arithmetic_expr(struct hlsl_ctx *ctx, struct list *instrs,
@@ -1090,7 +1045,7 @@ static struct hlsl_ir_expr *add_binary_arithmetic_expr(struct hlsl_ctx *ctx, str
     if (!(args[1] = add_implicit_conversion(ctx, instrs, arg2, common_type, loc)))
         return NULL;
 
-    return add_expr(ctx, instrs, op, args, loc);
+    return add_expr(ctx, instrs, op, args, common_type, loc);
 }
 
 static struct list *add_binary_arithmetic_expr_merge(struct hlsl_ctx *ctx, struct list *list1, struct list *list2,
-- 
2.33.0




More information about the wine-devel mailing list