diff options
Diffstat (limited to 'servers/rendering/shader_language.h')
-rw-r--r-- | servers/rendering/shader_language.h | 132 |
1 files changed, 92 insertions, 40 deletions
diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 5615d7f457..63dca99654 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -59,6 +59,7 @@ public: TK_FLOAT_CONSTANT, TK_INT_CONSTANT, TK_UINT_CONSTANT, + TK_STRING_CONSTANT, TK_TYPE_VOID, TK_TYPE_BOOL, TK_TYPE_BVEC2, @@ -175,6 +176,7 @@ public: TK_HINT_ANISOTROPY_TEXTURE, TK_HINT_SOURCE_COLOR, TK_HINT_RANGE, + TK_HINT_ENUM, TK_HINT_INSTANCE_INDEX, TK_HINT_SCREEN_TEXTURE, TK_HINT_NORMAL_ROUGHNESS_TEXTURE, @@ -578,49 +580,13 @@ public: Node(NODE_TYPE_STRUCT) {} }; - struct FunctionNode : public Node { - struct Argument { - ArgumentQualifier qualifier; - StringName name; - DataType type; - StringName struct_name; - DataPrecision precision; - //for passing textures as arguments - bool tex_argument_check; - TextureFilter tex_argument_filter; - TextureRepeat tex_argument_repeat; - bool tex_builtin_check; - StringName tex_builtin; - bool is_const; - int array_size; - - HashMap<StringName, HashSet<int>> tex_argument_connect; - }; - - StringName name; - DataType return_type = TYPE_VOID; - StringName return_struct_name; - DataPrecision return_precision = PRECISION_DEFAULT; - int return_array_size = 0; - Vector<Argument> arguments; - BlockNode *body = nullptr; - bool can_discard = false; - - virtual DataType get_datatype() const override { return return_type; } - virtual String get_datatype_name() const override { return String(return_struct_name); } - virtual int get_array_size() const override { return return_array_size; } - - FunctionNode() : - Node(NODE_TYPE_FUNCTION) {} - }; - struct ShaderNode : public Node { struct Constant { StringName name; DataType type; StringName struct_name; DataPrecision precision; - ConstantNode *initializer = nullptr; + Node *initializer = nullptr; int array_size; }; @@ -659,6 +625,7 @@ public: enum Hint { HINT_NONE, HINT_RANGE, + HINT_ENUM, HINT_SOURCE_COLOR, HINT_NORMAL, HINT_ROUGHNESS_NORMAL, @@ -684,6 +651,7 @@ public: }; int order = 0; + int prop_order = 0; int texture_order = 0; int texture_binding = 0; DataType type = TYPE_VOID; @@ -696,10 +664,16 @@ public: TextureFilter filter = FILTER_DEFAULT; TextureRepeat repeat = REPEAT_DEFAULT; float hint_range[3]; + PackedStringArray hint_enum_names; int instance_index = 0; String group; String subgroup; + _FORCE_INLINE_ bool is_texture() const { + // Order is assigned to -1 for texture uniforms. + return order < 0; + } + Uniform() { hint_range[0] = 0.0f; hint_range[1] = 1.0f; @@ -722,6 +696,43 @@ public: Node(NODE_TYPE_SHADER) {} }; + struct FunctionNode : public Node { + struct Argument { + ArgumentQualifier qualifier; + StringName name; + DataType type; + StringName struct_name; + DataPrecision precision; + //for passing textures as arguments + bool tex_argument_check; + TextureFilter tex_argument_filter; + TextureRepeat tex_argument_repeat; + bool tex_builtin_check; + StringName tex_builtin; + ShaderNode::Uniform::Hint tex_hint; + bool is_const; + int array_size; + + HashMap<StringName, HashSet<int>> tex_argument_connect; + }; + + StringName name; + DataType return_type = TYPE_VOID; + StringName return_struct_name; + DataPrecision return_precision = PRECISION_DEFAULT; + int return_array_size = 0; + Vector<Argument> arguments; + BlockNode *body = nullptr; + bool can_discard = false; + + virtual DataType get_datatype() const override { return return_type; } + virtual String get_datatype_name() const override { return String(return_struct_name); } + virtual int get_array_size() const override { return return_array_size; } + + FunctionNode() : + Node(NODE_TYPE_FUNCTION) {} + }; + struct UniformOrderComparator { _FORCE_INLINE_ bool operator()(const Pair<StringName, int> &A, const Pair<StringName, int> &B) const { return A.second < B.second; @@ -736,6 +747,12 @@ public: }; }; + struct ExpressionInfo { + Vector<Expression> *expression = nullptr; + TokenType tt_break = TK_EMPTY; + bool is_last_expr = false; + }; + struct VarInfo { StringName name; DataType type; @@ -800,6 +817,8 @@ public: static bool is_control_flow_keyword(String p_keyword); static void get_builtin_funcs(List<String> *r_keywords); + static int instance_counter; + struct BuiltInInfo { DataType type = TYPE_VOID; bool constant = false; @@ -913,6 +932,28 @@ private: Vector<FilePosition> include_positions; HashSet<String> include_markers_handled; + // Additional function information (eg. call hierarchy). No need to expose it to compiler. + struct CallInfo { + struct Item { + enum ItemType { + ITEM_TYPE_BUILTIN, + ITEM_TYPE_VARYING, + } type; + + TkPos pos; + + Item() {} + Item(ItemType p_type, TkPos p_pos) : + type(p_type), pos(p_pos) {} + }; + + StringName name; + List<Pair<StringName, Item>> uses_restricted_items; + List<CallInfo *> calls; + }; + + RBMap<StringName, CallInfo> calls_info; + #ifdef DEBUG_ENABLED struct Usage { int decl_line; @@ -1012,6 +1053,7 @@ private: Token _make_token(TokenType p_type, const StringName &p_text = StringName()); Token _get_token(); bool _lookup_next(Token &r_tk); + Token _peek(); ShaderNode *shader = nullptr; @@ -1036,6 +1078,10 @@ private: bool _validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message = nullptr); bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = nullptr, int *r_ret_size = nullptr); + struct BuiltinEntry { + const char *name; + }; + struct BuiltinFuncDef { enum { MAX_ARGS = 5 }; const char *name; @@ -1078,11 +1124,13 @@ private: #endif // DEBUG_ENABLED const HashMap<StringName, FunctionInfo> *stages = nullptr; + bool is_supported_frag_only_funcs = false; bool _get_completable_identifier(BlockNode *p_block, CompletionType p_type, StringName &identifier); static const BuiltinFuncDef builtin_func_defs[]; static const BuiltinFuncOutArgs builtin_func_out_args[]; static const BuiltinFuncConstArgs builtin_func_const_args[]; + static const BuiltinEntry frag_only_func_defs[]; static bool is_const_suffix_lut_initialized; @@ -1092,18 +1140,22 @@ private: bool _validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str, bool *r_is_custom_function = nullptr); bool _parse_function_arguments(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, int *r_complete_arg = nullptr); - bool _propagate_function_call_sampler_uniform_settings(const StringName &p_name, int p_argument, TextureFilter p_filter, TextureRepeat p_repeat); + ShaderNode::Uniform::Hint _sanitize_hint(ShaderNode::Uniform::Hint p_hint); + bool _propagate_function_call_sampler_uniform_settings(const StringName &p_name, int p_argument, TextureFilter p_filter, TextureRepeat p_repeat, ShaderNode::Uniform::Hint p_hint); bool _propagate_function_call_sampler_builtin_reference(const StringName &p_name, int p_argument, const StringName &p_builtin); bool _validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message); bool _check_node_constness(const Node *p_node) const; - Node *_parse_expression(BlockNode *p_block, const FunctionInfo &p_function_info); + bool _check_restricted_func(const StringName &p_name, const StringName &p_current_function) const; + bool _validate_restricted_func(const StringName &p_call_name, const CallInfo *p_func_info, bool p_is_builtin_hint = false); + + Node *_parse_expression(BlockNode *p_block, const FunctionInfo &p_function_info, const ExpressionInfo *p_previous_expression_info = nullptr); Error _parse_array_size(BlockNode *p_block, const FunctionInfo &p_function_info, bool p_forbid_unknown_size, Node **r_size_expression, int *r_array_size, bool *r_unknown_size); Node *_parse_array_constructor(BlockNode *p_block, const FunctionInfo &p_function_info); Node *_parse_array_constructor(BlockNode *p_block, const FunctionInfo &p_function_info, DataType p_type, const StringName &p_struct_name, int p_array_size); ShaderLanguage::Node *_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node); - Node *_parse_and_reduce_expression(BlockNode *p_block, const FunctionInfo &p_function_info); + Node *_parse_and_reduce_expression(BlockNode *p_block, const FunctionInfo &p_function_info, const ExpressionInfo *p_previous_expression_info = nullptr); Error _parse_block(BlockNode *p_block, const FunctionInfo &p_function_info, bool p_just_one = false, bool p_can_break = false, bool p_can_continue = false); String _get_shader_type_list(const HashSet<String> &p_shader_types) const; String _get_qualifier_str(ArgumentQualifier p_qualifier) const; |