From 884444d25b7ecd83804909d31a43774d430d7c8a Mon Sep 17 00:00:00 2001 From: Niels Bross Date: Fri, 28 Jun 2024 08:56:13 +0200 Subject: [PATCH] Multiple small fixes - Foreign functions can now have names for parameters - Fix property renaming crash - Properly output texture sampling calls --- Codegen.jai | 30 ++- Parsing.jai | 2 +- Semantic_Analysis.jai | 39 ++- hlsl_builtin.jai | 266 +-------------------- hlsl_builtin.shd | 262 ++++++++++++++++++++ test/semant/wrong_type_for_function.golden | 2 +- 6 files changed, 319 insertions(+), 282 deletions(-) create mode 100644 hlsl_builtin.shd diff --git a/Codegen.jai b/Codegen.jai index d164997..54010ab 100644 --- a/Codegen.jai +++ b/Codegen.jai @@ -80,18 +80,40 @@ emit_block :: (state : *Codegen_State, node : *AST_Node, indentation : int) { emit_call :: (state : *Codegen_State, node : *AST_Node, indentation : int) { indent(state, indentation); - print_to_builder(*state.builder, "%(", node.name); - if node.children.count > 0 { + if node.name == "sample" { + assert(node.children.count > 0); args := node.children[0]; - for child : args.children { + emit_node(state, args.children[0], 0); + append(*state.builder, "."); + print_to_builder(*state.builder, "%(", node.name); + + for i : 1..args.children.count - 1 { + child := args.children[i]; + emit_node(state, child, 0); - if it_index != args.children.count - 1 { + if i != args.children.count - 1 { append(*state.builder, ", "); } } + + } else { + print_to_builder(*state.builder, "%(", node.name); + + if node.children.count > 0 { + args := node.children[0]; + + for child : args.children { + emit_node(state, child, 0); + + if it_index != args.children.count - 1 { + append(*state.builder, ", "); + } + } + } + } append(*state.builder, ")"); diff --git a/Parsing.jai b/Parsing.jai index e4f9883..2e0d663 100644 --- a/Parsing.jai +++ b/Parsing.jai @@ -734,7 +734,7 @@ field_list :: (parse_state : *Parse_State, separator : Separator_Type, require_f field : *AST_Node; identifier := parse_state.current; advance(parse_state); - if require_field_names { + if require_field_names || check(parse_state, .TOKEN_COLON) { field = field_declaration(parse_state, identifier); } else { field = make_node(parse_state, .Unnamed_Field); diff --git a/Semantic_Analysis.jai b/Semantic_Analysis.jai index 1ced3c0..341a003 100644 --- a/Semantic_Analysis.jai +++ b/Semantic_Analysis.jai @@ -842,10 +842,14 @@ proper_type_to_string :: (checker : *Semantic_Checker, var : Type_Variable, allo get_type_from_identifier :: (checker : *Semantic_Checker, scope : Scope_Handle, node : *AST_Node, typename : *string = null) -> Semantic_Type { type_string := node.token.ident_value; - if type_string == Typenames[Semantic_Type.Int] return .Int; - if type_string == Typenames[Semantic_Type.Half] return .Half; - if type_string == Typenames[Semantic_Type.Float] return .Float; - if type_string == Typenames[Semantic_Type.Double] return .Double; + if type_string == { + case Typenames[Semantic_Type.Int]; return .Int; + case Typenames[Semantic_Type.Half]; return .Half; + case Typenames[Semantic_Type.Float]; return .Float; + case Typenames[Semantic_Type.Double]; return .Double; + case Typenames[Semantic_Type.Sampler]; return .Sampler; + case Typenames[Semantic_Type.Texture2D]; return .Texture2D; + } symbol := find_symbol(checker, type_string, scope); if symbol { @@ -1199,6 +1203,9 @@ create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_ return 0; } else { lookup_name : string = variable.typename; + if variable.typename == "properties" { + lookup_name = variable.name; + } struct_symbol := find_symbol(checker, lookup_name, checker.current_scope); type_variable := h2tv(checker, struct_symbol.type_variable); @@ -1530,13 +1537,17 @@ types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rh rhs_var := h2tv(checker, rhs); if lhs_var.type == { - case .Int; #through; - case .Half; #through; - case .Float; #through; + case .Int; #through; + case .Half; #through; + case .Float; #through; case .Double; { return rhs_var.type == .Int || rhs_var.type == .Half || rhs_var.type == .Float || rhs_var.type == .Double; } + case .Sampler; #through; + case .Texture2D; { + return rhs_var.type == lhs_var.type; + } case .Struct; { if rhs_var.type != .Struct { return false; @@ -1653,13 +1664,13 @@ union_find :: (checker : *Semantic_Checker) -> bool { } add_hlsl_builtins :: (checker : *Semantic_Checker) { - #load "hlsl_builtin.jai"; - + HLSL_BUILTIN := read_entire_file("hlsl_builtin.shd"); + checker.state = .Adding_Builtins; lexer : Lexer; - init_lexer_from_string(*lexer, HLSL_BULTIN); + init_lexer_from_string(*lexer, HLSL_BUILTIN); if lexer.result.had_error { print("%\n", report_messages(lexer.result.messages)); return; @@ -1741,9 +1752,11 @@ type_to_string :: (type_variable : Type_Variable) -> string { return "{{invalid}}"; case .Unit; return "()"; - case .Int; #through; - case .Half; #through; - case .Float; #through; + case .Int; #through; + case .Half; #through; + case .Float; #through; + case .Sampler; #through; + case .Texture2D; #through; case .Double; { return Typenames[type_variable.type]; } diff --git a/hlsl_builtin.jai b/hlsl_builtin.jai index 05decc2..c7428d2 100644 --- a/hlsl_builtin.jai +++ b/hlsl_builtin.jai @@ -1,266 +1,6 @@ -HLSL_BULTIN :: #string DONE +HLSL_BUILTIN : string; -float2 :: struct { - x : float; - y : float; +#run { + HLSL_BUILTIN = read_entire_file("hlsl_builtin.shd"); } -float3 :: struct { - x : float; - y : float; - z : float; -} - -float4 :: struct { - x : float; - y : float; - z : float; - w : float; -} - -float4x4 :: struct { - m11 : float; - m12 : float; - m13 : float; - m14 : float; - m21 : float; - m22 : float; - m23 : float; - m24 : float; - m31 : float; - m32 : float; - m33 : float; - m34 : float; - m41 : float; - m42 : float; - m43 : float; - m44 : float; -} - -int2 :: struct { - x : int; - y : int; -} - -int3 :: struct { - x : int; - y : int; - z : int; -} - -int4 :: struct { - x : int; - y : int; - z : int; - w : int; -} - -int4x4 :: struct { - m11 : int; - m12 : int; - m13 : int; - m14 : int; - m21 : int; - m22 : int; - m23 : int; - m24 : int; - m31 : int; - m32 : int; - m33 : int; - m34 : int; - m41 : int; - m42 : int; - m43 : int; - m44 : int; -} - -//~ nbr: Constructors - #foreign float2 :: (float, float) -> float2; - #foreign float3 :: (float, float, float) -> float3; - #foreign float4 :: (float, float, float, float) -> float4; - -//~ nbr: Vectors - #foreign cross :: (float3, float3) -> float3; - #foreign distance :: (float2, float2) -> float; - #foreign distance :: (float3, float3) -> float; - #foreign distance :: (float4, float4) -> float; - - #foreign dot :: (float2, float2) -> float; - #foreign dot :: (float3, float3) -> float; - #foreign dot :: (float4, float4) -> float; - - #foreign normalize :: (float2) -> float2; - #foreign normalize :: (float3) -> float3; - #foreign normalize :: (float4) -> float4; - - #foreign transpose :: (float4x4) -> float4x4; - -//~ nbr: Multiplies - #foreign mul :: (float2, float2) -> float; - #foreign mul :: (float3, float3) -> float; - #foreign mul :: (float4, float4) -> float; - #foreign mul :: (float4x4, float4x4) -> float4x4; - #foreign mul :: (float, float2) -> float2; - #foreign mul :: (float, float3) -> float3; - #foreign mul :: (float, float4) -> float4; - - #foreign mul :: (float, float4x4) -> float4x4; - #foreign mul :: (float4x4, float) -> float4x4; - #foreign mul :: (float4x4, float4) -> float4; - #foreign mul :: (float2, float) -> float2; - #foreign mul :: (float3, float) -> float3; - #foreign mul :: (float4, float) -> float4; - - #foreign mul :: (float4, float4x4) -> float4x4; - -//~ nbr: General - #foreign abs :: (float) -> float; - #foreign abs :: (float2) -> float2; - #foreign abs :: (float3) -> float3; - #foreign abs :: (float4) -> float4; - #foreign abs :: (float4x4) -> float4x4; - - #foreign min :: (float) -> float; - #foreign min :: (float2) -> float2; - #foreign min :: (float3) -> float3; - #foreign min :: (float4) -> float4; - #foreign min :: (float4x4) -> float4x4; - - #foreign max :: (float) -> float; - #foreign max :: (float2) -> float2; - #foreign max :: (float3) -> float3; - #foreign max :: (float4) -> float4; - #foreign max :: (float4x4) -> float4x4; - - #foreign ceil :: (float) -> float; - #foreign ceil :: (float2) -> float2; - #foreign ceil :: (float3) -> float3; - #foreign ceil :: (float4) -> float4; - #foreign ceil :: (float4x4) -> float4x4; - - #foreign floor :: (float) -> float; - #foreign floor :: (float2) -> float2; - #foreign floor :: (float3) -> float3; - #foreign floor :: (float4) -> float4; - #foreign floor :: (float4x4) -> float4x4; - - #foreign round :: (float) -> float; - #foreign round :: (float2) -> float2; - #foreign round :: (float3) -> float3; - #foreign round :: (float4) -> float4; - #foreign round :: (float4x4) -> float4x4; - - #foreign clamp :: (float, float, float) -> float; - #foreign clamp :: (float2, float2, float2) -> float2; - #foreign clamp :: (float3, float3, float3) -> float3; - #foreign clamp :: (float4, float4, float4) -> float4; - #foreign clamp :: (float4x4, float4x4, float4x4) -> float4x4; - - #foreign log :: (float) -> float; - #foreign log :: (float2) -> float2; - #foreign log :: (float3) -> float3; - #foreign log :: (float4) -> float4; - #foreign log :: (float4x4) -> float4x4; - - #foreign log2 :: (float) -> float; - #foreign log2 :: (float2) -> float2; - #foreign log2 :: (float3) -> float3; - #foreign log2 :: (float4) -> float4; - #foreign log2 :: (float4x4) -> float4x4; - - #foreign log10 :: (float) -> float; - #foreign log10 :: (float2) -> float2; - #foreign log10 :: (float3) -> float3; - #foreign log10 :: (float4) -> float4; - #foreign log10 :: (float4x4) -> float4x4; - - #foreign pow :: (float, float, float) -> float; - #foreign pow :: (float2, float2, float2) -> float2; - #foreign pow :: (float3, float3, float3) -> float3; - #foreign pow :: (float4, float4, float4) -> float4; - #foreign pow :: (float4x4, float4x4, float4x4) -> float4x4; - - #foreign smoothstep :: (float, float, float) -> float; - #foreign smoothstep :: (float2, float2, float2) -> float2; - #foreign smoothstep :: (float3, float3, float3) -> float3; - #foreign smoothstep :: (float4, float4, float4) -> float4; - #foreign smoothstep :: (float4x4, float4x4, float4x4) -> float4x4; - - #foreign step :: (float, float) -> float; - #foreign step :: (float2, float2) -> float2; - #foreign step :: (float3, float3) -> float3; - #foreign step :: (float4, float4) -> float4; - #foreign step :: (float4x4, float4x4) -> float4x4; - - #foreign sqrt :: (float) -> float; - #foreign sqrt :: (float2) -> float2; - #foreign sqrt :: (float3) -> float3; - #foreign sqrt :: (float4) -> float4; - #foreign sqrt :: (float4x4) -> float4x4; - - - -//~ nbr: Trigonometry - #foreign cos :: (float) -> float; - #foreign cos :: (float2) -> float2; - #foreign cos :: (float3) -> float3; - #foreign cos :: (float4) -> float4; - #foreign cos :: (float4x4) -> float4x4; - - #foreign cosh :: (float) -> float; - #foreign cosh :: (float2) -> float2; - #foreign cosh :: (float3) -> float3; - #foreign cosh :: (float4) -> float4; - #foreign cosh :: (float4x4) -> float4x4; - - #foreign acos :: (float) -> float; - #foreign acos :: (float2) -> float2; - #foreign acos :: (float3) -> float3; - #foreign acos :: (float4) -> float4; - #foreign acos :: (float4x4) -> float4x4; - - #foreign sin :: (float) -> float; - #foreign sin :: (float2) -> float2; - #foreign sin :: (float3) -> float3; - #foreign sin :: (float4) -> float4; - #foreign sin :: (float4x4) -> float4x4; - - #foreign sinh :: (float) -> float; - #foreign sinh :: (float2) -> float2; - #foreign sinh :: (float3) -> float3; - #foreign sinh :: (float4) -> float4; - #foreign sinh :: (float4x4) -> float4x4; - - #foreign asin :: (float) -> float; - #foreign asin :: (float2) -> float2; - #foreign asin :: (float3) -> float3; - #foreign asin :: (float4) -> float4; - #foreign asin :: (float4x4) -> float4x4; - - #foreign tan :: (float) -> float; - #foreign tan :: (float2) -> float2; - #foreign tan :: (float3) -> float3; - #foreign tan :: (float4) -> float4; - #foreign tan :: (float4x4) -> float4x4; - - #foreign tanh :: (float) -> float; - #foreign tanh :: (float2) -> float2; - #foreign tanh :: (float3) -> float3; - #foreign tanh :: (float4) -> float4; - #foreign tanh :: (float4x4) -> float4x4; - - #foreign atan :: (float) -> float; - #foreign atan :: (float2) -> float2; - #foreign atan :: (float3) -> float3; - #foreign atan :: (float4) -> float4; - #foreign atan :: (float4x4) -> float4x4; - - #foreign atan2 :: (float, float) -> float; - #foreign atan2 :: (float2, float2) -> float2; - #foreign atan2 :: (float3, float3) -> float3; - #foreign atan2 :: (float4, float4) -> float4; - #foreign atan2 :: (float4x4, float4x4) -> float4x4; - - #foreign sample :: (texture : Texture2D, uv : float2, sampler : Sampler) -> float4; - -DONE diff --git a/hlsl_builtin.shd b/hlsl_builtin.shd new file mode 100644 index 0000000..e076a4c --- /dev/null +++ b/hlsl_builtin.shd @@ -0,0 +1,262 @@ +float2 :: struct { + x : float; + y : float; +} + +float3 :: struct { + x : float; + y : float; + z : float; +} + +float4 :: struct { + x : float; + y : float; + z : float; + w : float; +} + +float4x4 :: struct { + m11 : float; + m12 : float; + m13 : float; + m14 : float; + m21 : float; + m22 : float; + m23 : float; + m24 : float; + m31 : float; + m32 : float; + m33 : float; + m34 : float; + m41 : float; + m42 : float; + m43 : float; + m44 : float; +} + +int2 :: struct { + x : int; + y : int; +} + +int3 :: struct { + x : int; + y : int; + z : int; +} + +int4 :: struct { + x : int; + y : int; + z : int; + w : int; +} + +int4x4 :: struct { + m11 : int; + m12 : int; + m13 : int; + m14 : int; + m21 : int; + m22 : int; + m23 : int; + m24 : int; + m31 : int; + m32 : int; + m33 : int; + m34 : int; + m41 : int; + m42 : int; + m43 : int; + m44 : int; +} + +//~ nbr: Constructors +#foreign float2 :: (float, float) -> float2; +#foreign float3 :: (float, float, float) -> float3; +#foreign float4 :: (float, float, float, float) -> float4; + +//~ nbr: Vectors +#foreign cross :: (float3, float3) -> float3; +#foreign distance :: (float2, float2) -> float; +#foreign distance :: (float3, float3) -> float; +#foreign distance :: (float4, float4) -> float; + +#foreign dot :: (float2, float2) -> float; +#foreign dot :: (float3, float3) -> float; +#foreign dot :: (float4, float4) -> float; + +#foreign normalize :: (float2) -> float2; +#foreign normalize :: (float3) -> float3; +#foreign normalize :: (float4) -> float4; + +#foreign transpose :: (float4x4) -> float4x4; + +//~ nbr: Multiplies +#foreign mul :: (float2, float2) -> float; +#foreign mul :: (float3, float3) -> float; +#foreign mul :: (float4, float4) -> float; +#foreign mul :: (float4x4, float4x4) -> float4x4; +#foreign mul :: (float, float2) -> float2; +#foreign mul :: (float, float3) -> float3; +#foreign mul :: (float, float4) -> float4; + +#foreign mul :: (float, float4x4) -> float4x4; +#foreign mul :: (float4x4, float) -> float4x4; +#foreign mul :: (float4x4, float4) -> float4; +#foreign mul :: (float2, float) -> float2; +#foreign mul :: (float3, float) -> float3; +#foreign mul :: (float4, float) -> float4; + +#foreign mul :: (float4, float4x4) -> float4x4; + +//~ nbr: General +#foreign abs :: (float) -> float; +#foreign abs :: (float2) -> float2; +#foreign abs :: (float3) -> float3; +#foreign abs :: (float4) -> float4; +#foreign abs :: (float4x4) -> float4x4; + +#foreign min :: (float) -> float; +#foreign min :: (float2) -> float2; +#foreign min :: (float3) -> float3; +#foreign min :: (float4) -> float4; +#foreign min :: (float4x4) -> float4x4; + +#foreign max :: (float) -> float; +#foreign max :: (float2) -> float2; +#foreign max :: (float3) -> float3; +#foreign max :: (float4) -> float4; +#foreign max :: (float4x4) -> float4x4; + +#foreign ceil :: (float) -> float; +#foreign ceil :: (float2) -> float2; +#foreign ceil :: (float3) -> float3; +#foreign ceil :: (float4) -> float4; +#foreign ceil :: (float4x4) -> float4x4; + +#foreign floor :: (float) -> float; +#foreign floor :: (float2) -> float2; +#foreign floor :: (float3) -> float3; +#foreign floor :: (float4) -> float4; +#foreign floor :: (float4x4) -> float4x4; + +#foreign round :: (float) -> float; +#foreign round :: (float2) -> float2; +#foreign round :: (float3) -> float3; +#foreign round :: (float4) -> float4; +#foreign round :: (float4x4) -> float4x4; + +#foreign clamp :: (float, float, float) -> float; +#foreign clamp :: (float2, float2, float2) -> float2; +#foreign clamp :: (float3, float3, float3) -> float3; +#foreign clamp :: (float4, float4, float4) -> float4; +#foreign clamp :: (float4x4, float4x4, float4x4) -> float4x4; + +#foreign log :: (float) -> float; +#foreign log :: (float2) -> float2; +#foreign log :: (float3) -> float3; +#foreign log :: (float4) -> float4; +#foreign log :: (float4x4) -> float4x4; + +#foreign log2 :: (float) -> float; +#foreign log2 :: (float2) -> float2; +#foreign log2 :: (float3) -> float3; +#foreign log2 :: (float4) -> float4; +#foreign log2 :: (float4x4) -> float4x4; + +#foreign log10 :: (float) -> float; +#foreign log10 :: (float2) -> float2; +#foreign log10 :: (float3) -> float3; +#foreign log10 :: (float4) -> float4; +#foreign log10 :: (float4x4) -> float4x4; + +#foreign pow :: (float, float, float) -> float; +#foreign pow :: (float2, float2, float2) -> float2; +#foreign pow :: (float3, float3, float3) -> float3; +#foreign pow :: (float4, float4, float4) -> float4; +#foreign pow :: (float4x4, float4x4, float4x4) -> float4x4; + +#foreign smoothstep :: (float, float, float) -> float; +#foreign smoothstep :: (float2, float2, float2) -> float2; +#foreign smoothstep :: (float3, float3, float3) -> float3; +#foreign smoothstep :: (float4, float4, float4) -> float4; +#foreign smoothstep :: (float4x4, float4x4, float4x4) -> float4x4; + +#foreign step :: (float, float) -> float; +#foreign step :: (float2, float2) -> float2; +#foreign step :: (float3, float3) -> float3; +#foreign step :: (float4, float4) -> float4; +#foreign step :: (float4x4, float4x4) -> float4x4; + +#foreign sqrt :: (float) -> float; +#foreign sqrt :: (float2) -> float2; +#foreign sqrt :: (float3) -> float3; +#foreign sqrt :: (float4) -> float4; +#foreign sqrt :: (float4x4) -> float4x4; + + + +//~ nbr: Trigonometry +#foreign cos :: (float) -> float; +#foreign cos :: (float2) -> float2; +#foreign cos :: (float3) -> float3; +#foreign cos :: (float4) -> float4; +#foreign cos :: (float4x4) -> float4x4; + +#foreign cosh :: (float) -> float; +#foreign cosh :: (float2) -> float2; +#foreign cosh :: (float3) -> float3; +#foreign cosh :: (float4) -> float4; +#foreign cosh :: (float4x4) -> float4x4; + +#foreign acos :: (float) -> float; +#foreign acos :: (float2) -> float2; +#foreign acos :: (float3) -> float3; +#foreign acos :: (float4) -> float4; +#foreign acos :: (float4x4) -> float4x4; + +#foreign sin :: (float) -> float; +#foreign sin :: (float2) -> float2; +#foreign sin :: (float3) -> float3; +#foreign sin :: (float4) -> float4; +#foreign sin :: (float4x4) -> float4x4; + +#foreign sinh :: (float) -> float; +#foreign sinh :: (float2) -> float2; +#foreign sinh :: (float3) -> float3; +#foreign sinh :: (float4) -> float4; +#foreign sinh :: (float4x4) -> float4x4; + +#foreign asin :: (float) -> float; +#foreign asin :: (float2) -> float2; +#foreign asin :: (float3) -> float3; +#foreign asin :: (float4) -> float4; +#foreign asin :: (float4x4) -> float4x4; + +#foreign tan :: (float) -> float; +#foreign tan :: (float2) -> float2; +#foreign tan :: (float3) -> float3; +#foreign tan :: (float4) -> float4; +#foreign tan :: (float4x4) -> float4x4; + +#foreign tanh :: (float) -> float; +#foreign tanh :: (float2) -> float2; +#foreign tanh :: (float3) -> float3; +#foreign tanh :: (float4) -> float4; +#foreign tanh :: (float4x4) -> float4x4; + +#foreign atan :: (float) -> float; +#foreign atan :: (float2) -> float2; +#foreign atan :: (float3) -> float3; +#foreign atan :: (float4) -> float4; +#foreign atan :: (float4x4) -> float4x4; + +#foreign atan2 :: (float, float) -> float; +#foreign atan2 :: (float2, float2) -> float2; +#foreign atan2 :: (float3, float3) -> float3; +#foreign atan2 :: (float4, float4) -> float4; +#foreign atan2 :: (float4x4, float4x4) -> float4x4; + +#foreign sample :: (Texture2D, float2, Sampler) -> float4; diff --git a/test/semant/wrong_type_for_function.golden b/test/semant/wrong_type_for_function.golden index d14646f..68a9196 100644 --- a/test/semant/wrong_type_for_function.golden +++ b/test/semant/wrong_type_for_function.golden @@ -7,7 +7,7 @@  color : float4 = float4(y, 1.0, 1.0, 1.0); ^  Possible overloads: - foreign float4 :: (float, float, float, float) -> float4; (test/wrong_type_for_function.shd:79) + foreign float4 :: (float, float, float, float) -> float4; (test/wrong_type_for_function.shd:78) test/wrong_type_for_function.shd:11,24: error: Type mismatch. Expected float got float2  found: