shader_language.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. /*************************************************************************/
  2. /* shader_language.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #ifndef SHADER_LANGUAGE_H
  31. #define SHADER_LANGUAGE_H
  32. #include "core/object/script_language.h"
  33. #include "core/string/string_name.h"
  34. #include "core/string/ustring.h"
  35. #include "core/templates/list.h"
  36. #include "core/templates/map.h"
  37. #include "core/typedefs.h"
  38. #include "core/variant/variant.h"
  39. #ifdef DEBUG_ENABLED
  40. #include "shader_warnings.h"
  41. #endif // DEBUG_ENABLED
  42. class ShaderLanguage {
  43. public:
  44. struct TkPos {
  45. int char_idx;
  46. int tk_line;
  47. };
  48. enum TokenType {
  49. TK_EMPTY,
  50. TK_IDENTIFIER,
  51. TK_TRUE,
  52. TK_FALSE,
  53. TK_FLOAT_CONSTANT,
  54. TK_INT_CONSTANT,
  55. TK_TYPE_VOID,
  56. TK_TYPE_BOOL,
  57. TK_TYPE_BVEC2,
  58. TK_TYPE_BVEC3,
  59. TK_TYPE_BVEC4,
  60. TK_TYPE_INT,
  61. TK_TYPE_IVEC2,
  62. TK_TYPE_IVEC3,
  63. TK_TYPE_IVEC4,
  64. TK_TYPE_UINT,
  65. TK_TYPE_UVEC2,
  66. TK_TYPE_UVEC3,
  67. TK_TYPE_UVEC4,
  68. TK_TYPE_FLOAT,
  69. TK_TYPE_VEC2,
  70. TK_TYPE_VEC3,
  71. TK_TYPE_VEC4,
  72. TK_TYPE_MAT2,
  73. TK_TYPE_MAT3,
  74. TK_TYPE_MAT4,
  75. TK_TYPE_SAMPLER2D,
  76. TK_TYPE_ISAMPLER2D,
  77. TK_TYPE_USAMPLER2D,
  78. TK_TYPE_SAMPLER2DARRAY,
  79. TK_TYPE_ISAMPLER2DARRAY,
  80. TK_TYPE_USAMPLER2DARRAY,
  81. TK_TYPE_SAMPLER3D,
  82. TK_TYPE_ISAMPLER3D,
  83. TK_TYPE_USAMPLER3D,
  84. TK_TYPE_SAMPLERCUBE,
  85. TK_TYPE_SAMPLERCUBEARRAY,
  86. TK_INTERPOLATION_FLAT,
  87. TK_INTERPOLATION_SMOOTH,
  88. TK_CONST,
  89. TK_STRUCT,
  90. TK_PRECISION_LOW,
  91. TK_PRECISION_MID,
  92. TK_PRECISION_HIGH,
  93. TK_OP_EQUAL,
  94. TK_OP_NOT_EQUAL,
  95. TK_OP_LESS,
  96. TK_OP_LESS_EQUAL,
  97. TK_OP_GREATER,
  98. TK_OP_GREATER_EQUAL,
  99. TK_OP_AND,
  100. TK_OP_OR,
  101. TK_OP_NOT,
  102. TK_OP_ADD,
  103. TK_OP_SUB,
  104. TK_OP_MUL,
  105. TK_OP_DIV,
  106. TK_OP_MOD,
  107. TK_OP_SHIFT_LEFT,
  108. TK_OP_SHIFT_RIGHT,
  109. TK_OP_ASSIGN,
  110. TK_OP_ASSIGN_ADD,
  111. TK_OP_ASSIGN_SUB,
  112. TK_OP_ASSIGN_MUL,
  113. TK_OP_ASSIGN_DIV,
  114. TK_OP_ASSIGN_MOD,
  115. TK_OP_ASSIGN_SHIFT_LEFT,
  116. TK_OP_ASSIGN_SHIFT_RIGHT,
  117. TK_OP_ASSIGN_BIT_AND,
  118. TK_OP_ASSIGN_BIT_OR,
  119. TK_OP_ASSIGN_BIT_XOR,
  120. TK_OP_BIT_AND,
  121. TK_OP_BIT_OR,
  122. TK_OP_BIT_XOR,
  123. TK_OP_BIT_INVERT,
  124. TK_OP_INCREMENT,
  125. TK_OP_DECREMENT,
  126. TK_CF_IF,
  127. TK_CF_ELSE,
  128. TK_CF_FOR,
  129. TK_CF_WHILE,
  130. TK_CF_DO,
  131. TK_CF_SWITCH,
  132. TK_CF_CASE,
  133. TK_CF_DEFAULT,
  134. TK_CF_BREAK,
  135. TK_CF_CONTINUE,
  136. TK_CF_RETURN,
  137. TK_CF_DISCARD,
  138. TK_BRACKET_OPEN,
  139. TK_BRACKET_CLOSE,
  140. TK_CURLY_BRACKET_OPEN,
  141. TK_CURLY_BRACKET_CLOSE,
  142. TK_PARENTHESIS_OPEN,
  143. TK_PARENTHESIS_CLOSE,
  144. TK_QUESTION,
  145. TK_COMMA,
  146. TK_COLON,
  147. TK_SEMICOLON,
  148. TK_PERIOD,
  149. TK_UNIFORM,
  150. TK_INSTANCE,
  151. TK_GLOBAL,
  152. TK_VARYING,
  153. TK_ARG_IN,
  154. TK_ARG_OUT,
  155. TK_ARG_INOUT,
  156. TK_RENDER_MODE,
  157. TK_HINT_WHITE_TEXTURE,
  158. TK_HINT_BLACK_TEXTURE,
  159. TK_HINT_NORMAL_TEXTURE,
  160. TK_HINT_ROUGHNESS_NORMAL_TEXTURE,
  161. TK_HINT_ROUGHNESS_R,
  162. TK_HINT_ROUGHNESS_G,
  163. TK_HINT_ROUGHNESS_B,
  164. TK_HINT_ROUGHNESS_A,
  165. TK_HINT_ROUGHNESS_GRAY,
  166. TK_HINT_ANISO_TEXTURE,
  167. TK_HINT_ALBEDO_TEXTURE,
  168. TK_HINT_BLACK_ALBEDO_TEXTURE,
  169. TK_HINT_COLOR,
  170. TK_HINT_RANGE,
  171. TK_HINT_INSTANCE_INDEX,
  172. TK_FILTER_NEAREST,
  173. TK_FILTER_LINEAR,
  174. TK_FILTER_NEAREST_MIPMAP,
  175. TK_FILTER_LINEAR_MIPMAP,
  176. TK_FILTER_NEAREST_MIPMAP_ANISO,
  177. TK_FILTER_LINEAR_MIPMAP_ANISO,
  178. TK_REPEAT_ENABLE,
  179. TK_REPEAT_DISABLE,
  180. TK_SHADER_TYPE,
  181. TK_CURSOR,
  182. TK_ERROR,
  183. TK_EOF,
  184. TK_MAX
  185. };
  186. /* COMPILER */
  187. // lame work around to Apple defining this as a macro in 10.12 SDK
  188. #ifdef TYPE_BOOL
  189. #undef TYPE_BOOL
  190. #endif
  191. enum DataType {
  192. TYPE_VOID,
  193. TYPE_BOOL,
  194. TYPE_BVEC2,
  195. TYPE_BVEC3,
  196. TYPE_BVEC4,
  197. TYPE_INT,
  198. TYPE_IVEC2,
  199. TYPE_IVEC3,
  200. TYPE_IVEC4,
  201. TYPE_UINT,
  202. TYPE_UVEC2,
  203. TYPE_UVEC3,
  204. TYPE_UVEC4,
  205. TYPE_FLOAT,
  206. TYPE_VEC2,
  207. TYPE_VEC3,
  208. TYPE_VEC4,
  209. TYPE_MAT2,
  210. TYPE_MAT3,
  211. TYPE_MAT4,
  212. TYPE_SAMPLER2D,
  213. TYPE_ISAMPLER2D,
  214. TYPE_USAMPLER2D,
  215. TYPE_SAMPLER2DARRAY,
  216. TYPE_ISAMPLER2DARRAY,
  217. TYPE_USAMPLER2DARRAY,
  218. TYPE_SAMPLER3D,
  219. TYPE_ISAMPLER3D,
  220. TYPE_USAMPLER3D,
  221. TYPE_SAMPLERCUBE,
  222. TYPE_SAMPLERCUBEARRAY,
  223. TYPE_STRUCT,
  224. TYPE_MAX
  225. };
  226. enum DataPrecision {
  227. PRECISION_LOWP,
  228. PRECISION_MEDIUMP,
  229. PRECISION_HIGHP,
  230. PRECISION_DEFAULT,
  231. };
  232. enum DataInterpolation {
  233. INTERPOLATION_FLAT,
  234. INTERPOLATION_SMOOTH,
  235. };
  236. enum Operator {
  237. OP_EQUAL,
  238. OP_NOT_EQUAL,
  239. OP_LESS,
  240. OP_LESS_EQUAL,
  241. OP_GREATER,
  242. OP_GREATER_EQUAL,
  243. OP_AND,
  244. OP_OR,
  245. OP_NOT,
  246. OP_NEGATE,
  247. OP_ADD,
  248. OP_SUB,
  249. OP_MUL,
  250. OP_DIV,
  251. OP_MOD,
  252. OP_SHIFT_LEFT,
  253. OP_SHIFT_RIGHT,
  254. OP_ASSIGN,
  255. OP_ASSIGN_ADD,
  256. OP_ASSIGN_SUB,
  257. OP_ASSIGN_MUL,
  258. OP_ASSIGN_DIV,
  259. OP_ASSIGN_MOD,
  260. OP_ASSIGN_SHIFT_LEFT,
  261. OP_ASSIGN_SHIFT_RIGHT,
  262. OP_ASSIGN_BIT_AND,
  263. OP_ASSIGN_BIT_OR,
  264. OP_ASSIGN_BIT_XOR,
  265. OP_BIT_AND,
  266. OP_BIT_OR,
  267. OP_BIT_XOR,
  268. OP_BIT_INVERT,
  269. OP_INCREMENT,
  270. OP_DECREMENT,
  271. OP_SELECT_IF,
  272. OP_SELECT_ELSE, //used only internally, then only IF appears with 3 arguments
  273. OP_POST_INCREMENT,
  274. OP_POST_DECREMENT,
  275. OP_CALL,
  276. OP_CONSTRUCT,
  277. OP_STRUCT,
  278. OP_INDEX,
  279. OP_MAX
  280. };
  281. enum FlowOperation {
  282. FLOW_OP_IF,
  283. FLOW_OP_RETURN,
  284. FLOW_OP_FOR,
  285. FLOW_OP_WHILE,
  286. FLOW_OP_DO,
  287. FLOW_OP_BREAK,
  288. FLOW_OP_SWITCH,
  289. FLOW_OP_CASE,
  290. FLOW_OP_DEFAULT,
  291. FLOW_OP_CONTINUE,
  292. FLOW_OP_DISCARD
  293. };
  294. enum ArgumentQualifier {
  295. ARGUMENT_QUALIFIER_IN,
  296. ARGUMENT_QUALIFIER_OUT,
  297. ARGUMENT_QUALIFIER_INOUT,
  298. };
  299. enum SubClassTag {
  300. TAG_GLOBAL,
  301. TAG_ARRAY,
  302. };
  303. enum TextureFilter {
  304. FILTER_NEAREST,
  305. FILTER_LINEAR,
  306. FILTER_NEAREST_MIPMAP,
  307. FILTER_LINEAR_MIPMAP,
  308. FILTER_NEAREST_MIPMAP_ANISO,
  309. FILTER_LINEAR_MIPMAP_ANISO,
  310. FILTER_DEFAULT,
  311. };
  312. enum TextureRepeat {
  313. REPEAT_DISABLE,
  314. REPEAT_ENABLE,
  315. REPEAT_DEFAULT,
  316. };
  317. enum {
  318. MAX_INSTANCE_UNIFORM_INDICES = 16
  319. };
  320. struct VaryingFunctionNames {
  321. StringName fragment;
  322. StringName vertex;
  323. StringName light;
  324. VaryingFunctionNames() {
  325. fragment = "fragment";
  326. vertex = "vertex";
  327. light = "light";
  328. }
  329. };
  330. struct Node {
  331. Node *next = nullptr;
  332. enum Type {
  333. TYPE_SHADER,
  334. TYPE_FUNCTION,
  335. TYPE_BLOCK,
  336. TYPE_VARIABLE,
  337. TYPE_VARIABLE_DECLARATION,
  338. TYPE_CONSTANT,
  339. TYPE_OPERATOR,
  340. TYPE_CONTROL_FLOW,
  341. TYPE_MEMBER,
  342. TYPE_ARRAY,
  343. TYPE_ARRAY_DECLARATION,
  344. TYPE_ARRAY_CONSTRUCT,
  345. TYPE_STRUCT,
  346. };
  347. Type type;
  348. virtual DataType get_datatype() const { return TYPE_VOID; }
  349. virtual String get_datatype_name() const { return ""; }
  350. virtual int get_array_size() const { return 0; }
  351. virtual bool is_indexed() const { return false; }
  352. Node(Type t) :
  353. type(t) {}
  354. virtual ~Node() {}
  355. };
  356. template <class T>
  357. T *alloc_node() {
  358. T *node = memnew(T);
  359. node->next = nodes;
  360. nodes = node;
  361. return node;
  362. }
  363. Node *nodes;
  364. struct OperatorNode : public Node {
  365. DataType return_cache = TYPE_VOID;
  366. DataPrecision return_precision_cache = PRECISION_DEFAULT;
  367. int return_array_size = 0;
  368. Operator op = OP_EQUAL;
  369. StringName struct_name;
  370. Vector<Node *> arguments;
  371. virtual DataType get_datatype() const override { return return_cache; }
  372. virtual String get_datatype_name() const override { return String(struct_name); }
  373. virtual int get_array_size() const override { return return_array_size; }
  374. virtual bool is_indexed() const override { return op == OP_INDEX; }
  375. OperatorNode() :
  376. Node(TYPE_OPERATOR) {}
  377. };
  378. struct VariableNode : public Node {
  379. DataType datatype_cache = TYPE_VOID;
  380. StringName name;
  381. StringName struct_name;
  382. bool is_const = false;
  383. virtual DataType get_datatype() const override { return datatype_cache; }
  384. virtual String get_datatype_name() const override { return String(struct_name); }
  385. VariableNode() :
  386. Node(TYPE_VARIABLE) {}
  387. };
  388. struct VariableDeclarationNode : public Node {
  389. DataPrecision precision = PRECISION_DEFAULT;
  390. DataType datatype = TYPE_VOID;
  391. String struct_name;
  392. bool is_const = false;
  393. struct Declaration {
  394. StringName name;
  395. Node *initializer;
  396. };
  397. Vector<Declaration> declarations;
  398. virtual DataType get_datatype() const override { return datatype; }
  399. VariableDeclarationNode() :
  400. Node(TYPE_VARIABLE_DECLARATION) {}
  401. };
  402. struct ArrayNode : public Node {
  403. DataType datatype_cache = TYPE_VOID;
  404. StringName struct_name;
  405. StringName name;
  406. Node *index_expression = nullptr;
  407. Node *call_expression = nullptr;
  408. Node *assign_expression = nullptr;
  409. bool is_const = false;
  410. int array_size = 0;
  411. virtual DataType get_datatype() const override { return datatype_cache; }
  412. virtual String get_datatype_name() const override { return String(struct_name); }
  413. virtual int get_array_size() const override { return (index_expression || call_expression) ? 0 : array_size; }
  414. virtual bool is_indexed() const override { return index_expression != nullptr; }
  415. ArrayNode() :
  416. Node(TYPE_ARRAY) {}
  417. };
  418. struct ArrayConstructNode : public Node {
  419. DataType datatype = TYPE_VOID;
  420. String struct_name;
  421. Vector<Node *> initializer;
  422. virtual DataType get_datatype() const override { return datatype; }
  423. virtual String get_datatype_name() const override { return struct_name; }
  424. virtual int get_array_size() const override { return initializer.size(); }
  425. ArrayConstructNode() :
  426. Node(TYPE_ARRAY_CONSTRUCT) {}
  427. };
  428. struct ArrayDeclarationNode : public Node {
  429. DataPrecision precision = PRECISION_DEFAULT;
  430. DataType datatype = TYPE_VOID;
  431. String struct_name;
  432. bool is_const = false;
  433. Node *size_expression = nullptr;
  434. struct Declaration {
  435. StringName name;
  436. uint32_t size;
  437. Vector<Node *> initializer;
  438. bool single_expression;
  439. };
  440. Vector<Declaration> declarations;
  441. virtual DataType get_datatype() const override { return datatype; }
  442. ArrayDeclarationNode() :
  443. Node(TYPE_ARRAY_DECLARATION) {}
  444. };
  445. struct ConstantNode : public Node {
  446. DataType datatype = TYPE_VOID;
  447. String struct_name = "";
  448. int array_size = 0;
  449. union Value {
  450. bool boolean;
  451. float real;
  452. int32_t sint;
  453. uint32_t uint;
  454. };
  455. Vector<Value> values;
  456. Vector<ArrayDeclarationNode::Declaration> array_declarations;
  457. virtual DataType get_datatype() const override { return datatype; }
  458. virtual String get_datatype_name() const override { return struct_name; }
  459. virtual int get_array_size() const override { return array_size; }
  460. ConstantNode() :
  461. Node(TYPE_CONSTANT) {}
  462. };
  463. struct FunctionNode;
  464. struct BlockNode : public Node {
  465. FunctionNode *parent_function = nullptr;
  466. BlockNode *parent_block = nullptr;
  467. enum BlockType {
  468. BLOCK_TYPE_STANDART,
  469. BLOCK_TYPE_FOR,
  470. BLOCK_TYPE_SWITCH,
  471. BLOCK_TYPE_CASE,
  472. BLOCK_TYPE_DEFAULT,
  473. };
  474. int block_type = BLOCK_TYPE_STANDART;
  475. SubClassTag block_tag = SubClassTag::TAG_GLOBAL;
  476. struct Variable {
  477. DataType type;
  478. StringName struct_name;
  479. DataPrecision precision;
  480. int line; //for completion
  481. int array_size;
  482. bool is_const;
  483. ConstantNode::Value value;
  484. };
  485. Map<StringName, Variable> variables;
  486. List<Node *> statements;
  487. bool single_statement = false;
  488. BlockNode() :
  489. Node(TYPE_BLOCK) {}
  490. };
  491. struct ControlFlowNode : public Node {
  492. FlowOperation flow_op = FLOW_OP_IF;
  493. Vector<Node *> expressions;
  494. Vector<BlockNode *> blocks;
  495. ControlFlowNode() :
  496. Node(TYPE_CONTROL_FLOW) {}
  497. };
  498. struct MemberNode : public Node {
  499. DataType basetype = TYPE_VOID;
  500. bool basetype_const = false;
  501. StringName base_struct_name;
  502. DataPrecision precision = PRECISION_DEFAULT;
  503. DataType datatype = TYPE_VOID;
  504. int array_size = 0;
  505. StringName struct_name;
  506. StringName name;
  507. Node *owner = nullptr;
  508. Node *index_expression = nullptr;
  509. Node *assign_expression = nullptr;
  510. Node *call_expression = nullptr;
  511. bool has_swizzling_duplicates = false;
  512. virtual DataType get_datatype() const override { return datatype; }
  513. virtual String get_datatype_name() const override { return String(struct_name); }
  514. virtual int get_array_size() const override { return array_size; }
  515. virtual bool is_indexed() const override { return index_expression != nullptr || call_expression != nullptr; }
  516. MemberNode() :
  517. Node(TYPE_MEMBER) {}
  518. };
  519. struct StructNode : public Node {
  520. List<MemberNode *> members;
  521. StructNode() :
  522. Node(TYPE_STRUCT) {}
  523. };
  524. struct FunctionNode : public Node {
  525. struct Argument {
  526. ArgumentQualifier qualifier;
  527. StringName name;
  528. DataType type;
  529. StringName type_str;
  530. DataPrecision precision;
  531. //for passing textures as arguments
  532. bool tex_argument_check;
  533. TextureFilter tex_argument_filter;
  534. TextureRepeat tex_argument_repeat;
  535. bool tex_builtin_check;
  536. StringName tex_builtin;
  537. bool is_const;
  538. int array_size;
  539. Map<StringName, Set<int>> tex_argument_connect;
  540. };
  541. StringName name;
  542. DataType return_type = TYPE_VOID;
  543. StringName return_struct_name;
  544. DataPrecision return_precision = PRECISION_DEFAULT;
  545. int return_array_size = 0;
  546. Vector<Argument> arguments;
  547. BlockNode *body = nullptr;
  548. bool can_discard = false;
  549. virtual DataType get_datatype() const override { return return_type; }
  550. virtual String get_datatype_name() const override { return String(return_struct_name); }
  551. virtual int get_array_size() const override { return return_array_size; }
  552. FunctionNode() :
  553. Node(TYPE_FUNCTION) {}
  554. };
  555. struct ShaderNode : public Node {
  556. struct Constant {
  557. StringName name;
  558. DataType type;
  559. StringName type_str;
  560. DataPrecision precision;
  561. ConstantNode *initializer;
  562. int array_size;
  563. };
  564. struct Function {
  565. StringName name;
  566. FunctionNode *function;
  567. Set<StringName> uses_function;
  568. bool callable;
  569. };
  570. struct Struct {
  571. StringName name;
  572. StructNode *shader_struct;
  573. };
  574. struct Varying {
  575. enum Stage {
  576. STAGE_UNKNOWN,
  577. STAGE_VERTEX, // transition stage to STAGE_VERTEX_TO_FRAGMENT or STAGE_VERTEX_TO_LIGHT, emits error if they are not used
  578. STAGE_FRAGMENT, // transition stage to STAGE_FRAGMENT_TO_LIGHT, emits error if it's not used
  579. STAGE_VERTEX_TO_FRAGMENT,
  580. STAGE_VERTEX_TO_LIGHT,
  581. STAGE_FRAGMENT_TO_LIGHT,
  582. };
  583. Stage stage = STAGE_UNKNOWN;
  584. DataType type = TYPE_VOID;
  585. DataInterpolation interpolation = INTERPOLATION_FLAT;
  586. DataPrecision precision = PRECISION_DEFAULT;
  587. int array_size = 0;
  588. TkPos tkpos;
  589. Varying() {}
  590. };
  591. struct Uniform {
  592. enum Hint {
  593. HINT_NONE,
  594. HINT_COLOR,
  595. HINT_RANGE,
  596. HINT_ALBEDO,
  597. HINT_BLACK_ALBEDO,
  598. HINT_NORMAL,
  599. HINT_ROUGHNESS_NORMAL,
  600. HINT_ROUGHNESS_R,
  601. HINT_ROUGHNESS_G,
  602. HINT_ROUGHNESS_B,
  603. HINT_ROUGHNESS_A,
  604. HINT_ROUGHNESS_GRAY,
  605. HINT_BLACK,
  606. HINT_WHITE,
  607. HINT_ANISO,
  608. HINT_MAX
  609. };
  610. enum Scope {
  611. SCOPE_LOCAL,
  612. SCOPE_INSTANCE,
  613. SCOPE_GLOBAL,
  614. };
  615. int order = 0;
  616. int texture_order = 0;
  617. DataType type = TYPE_VOID;
  618. DataPrecision precision = PRECISION_DEFAULT;
  619. Vector<ConstantNode::Value> default_value;
  620. Scope scope = SCOPE_LOCAL;
  621. Hint hint = HINT_NONE;
  622. TextureFilter filter = FILTER_DEFAULT;
  623. TextureRepeat repeat = REPEAT_DEFAULT;
  624. float hint_range[3];
  625. int instance_index = 0;
  626. Uniform() {
  627. hint_range[0] = 0.0f;
  628. hint_range[1] = 1.0f;
  629. hint_range[2] = 0.001f;
  630. }
  631. };
  632. Map<StringName, Constant> constants;
  633. Map<StringName, Varying> varyings;
  634. Map<StringName, Uniform> uniforms;
  635. Map<StringName, Struct> structs;
  636. Vector<StringName> render_modes;
  637. Vector<Function> functions;
  638. Vector<Constant> vconstants;
  639. Vector<Struct> vstructs;
  640. ShaderNode() :
  641. Node(TYPE_SHADER) {}
  642. };
  643. struct Expression {
  644. bool is_op;
  645. union {
  646. Operator op;
  647. Node *node;
  648. };
  649. };
  650. struct VarInfo {
  651. StringName name;
  652. DataType type;
  653. };
  654. enum CompletionType {
  655. COMPLETION_NONE,
  656. COMPLETION_RENDER_MODE,
  657. COMPLETION_MAIN_FUNCTION,
  658. COMPLETION_IDENTIFIER,
  659. COMPLETION_FUNCTION_CALL,
  660. COMPLETION_CALL_ARGUMENTS,
  661. COMPLETION_INDEX,
  662. COMPLETION_STRUCT,
  663. };
  664. struct Token {
  665. TokenType type;
  666. StringName text;
  667. double constant;
  668. uint16_t line;
  669. };
  670. static String get_operator_text(Operator p_op);
  671. static String get_token_text(Token p_token);
  672. static bool is_token_datatype(TokenType p_type);
  673. static bool is_token_variable_datatype(TokenType p_type);
  674. static DataType get_token_datatype(TokenType p_type);
  675. static bool is_token_interpolation(TokenType p_type);
  676. static DataInterpolation get_token_interpolation(TokenType p_type);
  677. static bool is_token_precision(TokenType p_type);
  678. static DataPrecision get_token_precision(TokenType p_type);
  679. static String get_precision_name(DataPrecision p_type);
  680. static String get_datatype_name(DataType p_type);
  681. static bool is_token_nonvoid_datatype(TokenType p_type);
  682. static bool is_token_operator(TokenType p_type);
  683. static bool convert_constant(ConstantNode *p_constant, DataType p_to_type, ConstantNode::Value *p_value = nullptr);
  684. static DataType get_scalar_type(DataType p_type);
  685. static int get_cardinality(DataType p_type);
  686. static bool is_scalar_type(DataType p_type);
  687. static bool is_sampler_type(DataType p_type);
  688. static Variant constant_value_to_variant(const Vector<ShaderLanguage::ConstantNode::Value> &p_value, DataType p_type, ShaderLanguage::ShaderNode::Uniform::Hint p_hint = ShaderLanguage::ShaderNode::Uniform::HINT_NONE);
  689. static PropertyInfo uniform_to_property_info(const ShaderNode::Uniform &p_uniform);
  690. static uint32_t get_type_size(DataType p_type);
  691. static void get_keyword_list(List<String> *r_keywords);
  692. static bool is_control_flow_keyword(String p_keyword);
  693. static void get_builtin_funcs(List<String> *r_keywords);
  694. struct BuiltInInfo {
  695. DataType type = TYPE_VOID;
  696. bool constant = false;
  697. BuiltInInfo() {}
  698. BuiltInInfo(DataType p_type, bool p_constant = false) :
  699. type(p_type),
  700. constant(p_constant) {}
  701. };
  702. struct StageFunctionInfo {
  703. struct Argument {
  704. StringName name;
  705. DataType type;
  706. Argument(const StringName &p_name = StringName(), DataType p_type = TYPE_VOID) {
  707. name = p_name;
  708. type = p_type;
  709. }
  710. };
  711. Vector<Argument> arguments;
  712. DataType return_type = TYPE_VOID;
  713. };
  714. struct FunctionInfo {
  715. Map<StringName, BuiltInInfo> built_ins;
  716. Map<StringName, StageFunctionInfo> stage_functions;
  717. bool can_discard = false;
  718. bool main_function = false;
  719. };
  720. static bool has_builtin(const Map<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name);
  721. typedef DataType (*GlobalVariableGetTypeFunc)(const StringName &p_name);
  722. private:
  723. struct KeyWord {
  724. TokenType token;
  725. const char *text;
  726. };
  727. static const KeyWord keyword_list[];
  728. GlobalVariableGetTypeFunc global_var_get_type_func;
  729. bool error_set;
  730. String error_str;
  731. int error_line;
  732. #ifdef DEBUG_ENABLED
  733. struct Usage {
  734. int decl_line;
  735. bool used = false;
  736. Usage(int p_decl_line = -1) {
  737. decl_line = p_decl_line;
  738. }
  739. };
  740. Map<StringName, Usage> used_constants;
  741. Map<StringName, Usage> used_varyings;
  742. Map<StringName, Usage> used_uniforms;
  743. Map<StringName, Usage> used_functions;
  744. Map<StringName, Usage> used_structs;
  745. Map<ShaderWarning::Code, Map<StringName, Usage> *> warnings_check_map;
  746. List<ShaderWarning> warnings;
  747. bool check_warnings = false;
  748. uint32_t warning_flags;
  749. void _add_line_warning(ShaderWarning::Code p_code, const StringName &p_subject = "") {
  750. warnings.push_back(ShaderWarning(p_code, tk_line, p_subject));
  751. }
  752. void _add_warning(ShaderWarning::Code p_code, int p_line, const StringName &p_subject = "") {
  753. warnings.push_back(ShaderWarning(p_code, p_line, p_subject));
  754. }
  755. void _check_warning_accums();
  756. #endif // DEBUG_ENABLED
  757. String code;
  758. int char_idx;
  759. int tk_line;
  760. StringName current_function;
  761. bool last_const = false;
  762. bool pass_array = false;
  763. StringName last_name;
  764. VaryingFunctionNames varying_function_names;
  765. TkPos _get_tkpos() {
  766. TkPos tkp;
  767. tkp.char_idx = char_idx;
  768. tkp.tk_line = tk_line;
  769. return tkp;
  770. }
  771. void _set_tkpos(TkPos p_pos) {
  772. char_idx = p_pos.char_idx;
  773. tk_line = p_pos.tk_line;
  774. }
  775. void _set_error(const String &p_str) {
  776. if (error_set) {
  777. return;
  778. }
  779. error_line = tk_line;
  780. error_set = true;
  781. error_str = p_str;
  782. }
  783. static const char *token_names[TK_MAX];
  784. Token _make_token(TokenType p_type, const StringName &p_text = StringName());
  785. Token _get_token();
  786. ShaderNode *shader;
  787. enum IdentifierType {
  788. IDENTIFIER_FUNCTION,
  789. IDENTIFIER_UNIFORM,
  790. IDENTIFIER_VARYING,
  791. IDENTIFIER_FUNCTION_ARGUMENT,
  792. IDENTIFIER_LOCAL_VAR,
  793. IDENTIFIER_BUILTIN_VAR,
  794. IDENTIFIER_CONSTANT,
  795. IDENTIFIER_MAX,
  796. };
  797. IdentifierType last_type = IDENTIFIER_MAX;
  798. bool _find_identifier(const BlockNode *p_block, bool p_allow_reassign, const FunctionInfo &p_function_info, const StringName &p_identifier, DataType *r_data_type = nullptr, IdentifierType *r_type = nullptr, bool *r_is_const = nullptr, int *r_array_size = nullptr, StringName *r_struct_name = nullptr, ConstantNode::Value *r_constant_value = nullptr);
  799. #ifdef DEBUG_ENABLED
  800. void _parse_used_identifier(const StringName &p_identifier, IdentifierType p_type);
  801. #endif // DEBUG_ENABLED
  802. bool _is_operator_assign(Operator p_op) const;
  803. bool _validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message = nullptr);
  804. bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = nullptr, int *r_ret_size = nullptr);
  805. struct BuiltinFuncDef {
  806. enum { MAX_ARGS = 5 };
  807. const char *name;
  808. DataType rettype;
  809. const DataType args[MAX_ARGS];
  810. SubClassTag tag;
  811. bool high_end;
  812. };
  813. struct BuiltinFuncOutArgs { //arguments used as out in built in functions
  814. const char *name;
  815. int argument;
  816. };
  817. CompletionType completion_type;
  818. int completion_line;
  819. BlockNode *completion_block;
  820. DataType completion_base;
  821. SubClassTag completion_class;
  822. StringName completion_function;
  823. StringName completion_struct;
  824. int completion_argument;
  825. const Map<StringName, FunctionInfo> *stages = nullptr;
  826. bool _get_completable_identifier(BlockNode *p_block, CompletionType p_type, StringName &identifier);
  827. static const BuiltinFuncDef builtin_func_defs[];
  828. static const BuiltinFuncOutArgs builtin_func_out_args[];
  829. Error _validate_datatype(DataType p_type);
  830. bool _compare_datatypes(DataType p_datatype_a, String p_datatype_name_a, int p_array_size_a, DataType p_datatype_b, String p_datatype_name_b, int p_array_size_b);
  831. bool _compare_datatypes_in_nodes(Node *a, Node *b);
  832. bool _validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str);
  833. bool _parse_function_arguments(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, int *r_complete_arg = nullptr);
  834. bool _propagate_function_call_sampler_uniform_settings(StringName p_name, int p_argument, TextureFilter p_filter, TextureRepeat p_repeat);
  835. bool _propagate_function_call_sampler_builtin_reference(StringName p_name, int p_argument, const StringName &p_builtin);
  836. bool _validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message);
  837. bool _validate_varying_using(ShaderNode::Varying &p_varying, String *r_message);
  838. bool _check_node_constness(const Node *p_node) const;
  839. Node *_parse_expression(BlockNode *p_block, const FunctionInfo &p_function_info);
  840. Node *_parse_array_constructor(BlockNode *p_block, const FunctionInfo &p_function_info);
  841. Node *_parse_array_constructor(BlockNode *p_block, const FunctionInfo &p_function_info, DataType p_type, const StringName &p_struct_name, int p_array_size);
  842. ShaderLanguage::Node *_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node);
  843. Node *_parse_and_reduce_expression(BlockNode *p_block, const FunctionInfo &p_function_info);
  844. 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);
  845. String _get_shader_type_list(const Set<String> &p_shader_types) const;
  846. String _get_qualifier_str(ArgumentQualifier p_qualifier) const;
  847. Error _parse_shader(const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types);
  848. Error _find_last_flow_op_in_block(BlockNode *p_block, FlowOperation p_op);
  849. Error _find_last_flow_op_in_op(ControlFlowNode *p_flow, FlowOperation p_op);
  850. public:
  851. #ifdef DEBUG_ENABLED
  852. List<ShaderWarning>::Element *get_warnings_ptr();
  853. void enable_warning_checking(bool p_enabled);
  854. bool is_warning_checking_enabled() const;
  855. void set_warning_flags(uint32_t p_flags);
  856. uint32_t get_warning_flags() const;
  857. #endif // DEBUG_ENABLED
  858. //static void get_keyword_list(ShaderType p_type,List<String> *p_keywords);
  859. void clear();
  860. static String get_shader_type(const String &p_code);
  861. Error compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const VaryingFunctionNames &p_varying_function_names, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func);
  862. Error complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const VaryingFunctionNames &p_varying_function_names, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint);
  863. String get_error_text();
  864. int get_error_line();
  865. ShaderNode *get_shader();
  866. String token_debug(const String &p_code);
  867. ShaderLanguage();
  868. ~ShaderLanguage();
  869. };
  870. #endif // SHADER_LANGUAGE_H