Zebediah Figura : vkd3d-shader: Move add_implicit_conversion() to hlsl.y.

Alexandre Julliard julliard at winehq.org
Tue Feb 2 15:51:09 CST 2021


Module: vkd3d
Branch: master
Commit: 768eb8610160c189420fb387aec4c5222b20930b
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=768eb8610160c189420fb387aec4c5222b20930b

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Sat Jan 30 13:51:34 2021 -0600

vkd3d-shader: Move add_implicit_conversion() to hlsl.y.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl.c | 84 ---------------------------------------------
 libs/vkd3d-shader/hlsl.h |  2 --
 libs/vkd3d-shader/hlsl.y | 89 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+), 86 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index b919a53..9c1b6d1 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -371,63 +371,6 @@ BOOL compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
     return FALSE;
 }
 
-static BOOL implicit_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
-{
-    if (!convertible_data_type(t1) || !convertible_data_type(t2))
-        return FALSE;
-
-    if (t1->type <= HLSL_CLASS_LAST_NUMERIC)
-    {
-        /* Scalar vars can be converted to any other numeric data type */
-        if (t1->dimx == 1 && t1->dimy == 1 && t2->type <= HLSL_CLASS_LAST_NUMERIC)
-            return TRUE;
-        /* The other way around is true too */
-        if (t2->dimx == 1 && t2->dimy == 1 && t2->type <= HLSL_CLASS_LAST_NUMERIC)
-            return TRUE;
-    }
-
-    if (t1->type == HLSL_CLASS_ARRAY && t2->type == HLSL_CLASS_ARRAY)
-    {
-        return components_count_type(t1) == components_count_type(t2);
-    }
-
-    if ((t1->type == HLSL_CLASS_ARRAY && t2->type <= HLSL_CLASS_LAST_NUMERIC)
-            || (t1->type <= HLSL_CLASS_LAST_NUMERIC && t2->type == HLSL_CLASS_ARRAY))
-    {
-        /* e.g. float4[3] to float4 is allowed */
-        if (t1->type == HLSL_CLASS_ARRAY && compare_hlsl_types(t1->e.array.type, t2))
-            return TRUE;
-        if (components_count_type(t1) == components_count_type(t2))
-            return TRUE;
-        return FALSE;
-    }
-
-    if (t1->type <= HLSL_CLASS_VECTOR && t2->type <= HLSL_CLASS_VECTOR)
-    {
-        if (t1->dimx >= t2->dimx)
-            return TRUE;
-        return FALSE;
-    }
-
-    if (t1->type == HLSL_CLASS_MATRIX || t2->type == HLSL_CLASS_MATRIX)
-    {
-        if (t1->type == HLSL_CLASS_MATRIX && t2->type == HLSL_CLASS_MATRIX
-                && t1->dimx >= t2->dimx && t1->dimy >= t2->dimy)
-            return TRUE;
-
-        /* Matrix-vector conversion is apparently allowed if they have the same components count */
-        if ((t1->type == HLSL_CLASS_VECTOR || t2->type == HLSL_CLASS_VECTOR)
-                && components_count_type(t1) == components_count_type(t2))
-            return TRUE;
-        return FALSE;
-    }
-
-    if (t1->type == HLSL_CLASS_STRUCT && t2->type == HLSL_CLASS_STRUCT)
-        return compare_hlsl_types(t1, t2);
-
-    return FALSE;
-}
-
 static BOOL expr_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
 {
     if (t1->base_type > HLSL_TYPE_LAST_SCALAR || t2->base_type > HLSL_TYPE_LAST_SCALAR)
@@ -589,33 +532,6 @@ static struct hlsl_type *expr_common_type(struct hlsl_type *t1, struct hlsl_type
     return new_hlsl_type(NULL, type, base, dimx, dimy);
 }
 
-struct hlsl_ir_node *add_implicit_conversion(struct list *instrs, struct hlsl_ir_node *node,
-        struct hlsl_type *dst_type, struct source_location *loc)
-{
-    struct hlsl_type *src_type = node->data_type;
-    struct hlsl_ir_expr *cast;
-
-    if (compare_hlsl_types(src_type, dst_type))
-        return node;
-
-    if (!implicit_compatible_data_types(src_type, dst_type))
-    {
-        hlsl_report_message(*loc, HLSL_LEVEL_ERROR, "can't implicitly convert %s to %s",
-                debug_hlsl_type(src_type), debug_hlsl_type(dst_type));
-        return NULL;
-    }
-
-    if (dst_type->dimx * dst_type->dimy < src_type->dimx * src_type->dimy)
-        hlsl_report_message(*loc, HLSL_LEVEL_WARNING, "implicit truncation of vector type");
-
-    TRACE("Implicit conversion from %s to %s.\n", debug_hlsl_type(src_type), debug_hlsl_type(dst_type));
-
-    if (!(cast = new_cast(node, dst_type, loc)))
-        return NULL;
-    list_add_tail(instrs, &cast->node.entry);
-    return &cast->node;
-}
-
 struct hlsl_ir_expr *add_expr(struct list *instrs, enum hlsl_ir_expr_op op, struct hlsl_ir_node *operands[3],
         struct source_location *loc)
 {
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 6efdfbb..ab7b99c 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -594,8 +594,6 @@ static inline void set_parse_status(enum parse_status *current, enum parse_statu
 
 struct hlsl_ir_expr *add_expr(struct list *instrs, enum hlsl_ir_expr_op op, struct hlsl_ir_node *operands[3],
         struct source_location *loc) DECLSPEC_HIDDEN;
-struct hlsl_ir_node *add_implicit_conversion(struct list *instrs, struct hlsl_ir_node *node, struct hlsl_type *type,
-        struct source_location *loc) DECLSPEC_HIDDEN;
 
 struct hlsl_type *new_array_type(struct hlsl_type *basic_type, unsigned int array_size) DECLSPEC_HIDDEN;
 struct hlsl_ir_assignment *new_assignment(struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 1502301..5d200e4 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -77,6 +77,95 @@ static void check_invalid_matrix_modifiers(DWORD modifiers, struct source_locati
                 "'row_major' or 'column_major' modifiers are only allowed for matrices.");
 }
 
+static BOOL convertible_data_type(struct hlsl_type *type)
+{
+    return type->type != HLSL_CLASS_OBJECT;
+}
+
+static BOOL implicit_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
+{
+    if (!convertible_data_type(t1) || !convertible_data_type(t2))
+        return FALSE;
+
+    if (t1->type <= HLSL_CLASS_LAST_NUMERIC)
+    {
+        /* Scalar vars can be converted to any other numeric data type */
+        if (t1->dimx == 1 && t1->dimy == 1 && t2->type <= HLSL_CLASS_LAST_NUMERIC)
+            return TRUE;
+        /* The other way around is true too */
+        if (t2->dimx == 1 && t2->dimy == 1 && t2->type <= HLSL_CLASS_LAST_NUMERIC)
+            return TRUE;
+    }
+
+    if (t1->type == HLSL_CLASS_ARRAY && t2->type == HLSL_CLASS_ARRAY)
+    {
+        return components_count_type(t1) == components_count_type(t2);
+    }
+
+    if ((t1->type == HLSL_CLASS_ARRAY && t2->type <= HLSL_CLASS_LAST_NUMERIC)
+            || (t1->type <= HLSL_CLASS_LAST_NUMERIC && t2->type == HLSL_CLASS_ARRAY))
+    {
+        /* e.g. float4[3] to float4 is allowed */
+        if (t1->type == HLSL_CLASS_ARRAY && compare_hlsl_types(t1->e.array.type, t2))
+            return TRUE;
+        if (components_count_type(t1) == components_count_type(t2))
+            return TRUE;
+        return FALSE;
+    }
+
+    if (t1->type <= HLSL_CLASS_VECTOR && t2->type <= HLSL_CLASS_VECTOR)
+    {
+        if (t1->dimx >= t2->dimx)
+            return TRUE;
+        return FALSE;
+    }
+
+    if (t1->type == HLSL_CLASS_MATRIX || t2->type == HLSL_CLASS_MATRIX)
+    {
+        if (t1->type == HLSL_CLASS_MATRIX && t2->type == HLSL_CLASS_MATRIX
+                && t1->dimx >= t2->dimx && t1->dimy >= t2->dimy)
+            return TRUE;
+
+        /* Matrix-vector conversion is apparently allowed if they have the same components count */
+        if ((t1->type == HLSL_CLASS_VECTOR || t2->type == HLSL_CLASS_VECTOR)
+                && components_count_type(t1) == components_count_type(t2))
+            return TRUE;
+        return FALSE;
+    }
+
+    if (t1->type == HLSL_CLASS_STRUCT && t2->type == HLSL_CLASS_STRUCT)
+        return compare_hlsl_types(t1, t2);
+
+    return FALSE;
+}
+
+static struct hlsl_ir_node *add_implicit_conversion(struct list *instrs, struct hlsl_ir_node *node,
+        struct hlsl_type *dst_type, struct source_location *loc)
+{
+    struct hlsl_type *src_type = node->data_type;
+    struct hlsl_ir_expr *cast;
+
+    if (compare_hlsl_types(src_type, dst_type))
+        return node;
+
+    if (!implicit_compatible_data_types(src_type, dst_type))
+    {
+        hlsl_report_message(*loc, HLSL_LEVEL_ERROR, "can't implicitly convert %s to %s",
+                debug_hlsl_type(src_type), debug_hlsl_type(dst_type));
+        return NULL;
+    }
+
+    if (dst_type->dimx * dst_type->dimy < src_type->dimx * src_type->dimy)
+        hlsl_report_message(*loc, HLSL_LEVEL_WARNING, "implicit truncation of vector type");
+
+    TRACE("Implicit conversion from %s to %s.\n", debug_hlsl_type(src_type), debug_hlsl_type(dst_type));
+
+    if (!(cast = new_cast(node, dst_type, loc)))
+        return NULL;
+    list_add_tail(instrs, &cast->node.entry);
+    return &cast->node;
+}
+
 static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local)
 {
     BOOL ret;




More information about the wine-cvs mailing list