ast.h revision 01e04c3f
1/* -*- c++ -*- */ 2/* 3 * Copyright © 2009 Intel Corporation 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25#ifndef AST_H 26#define AST_H 27 28#include "list.h" 29#include "glsl_parser_extras.h" 30#include "compiler/glsl_types.h" 31#include "util/bitset.h" 32 33struct _mesa_glsl_parse_state; 34 35struct YYLTYPE; 36 37/** 38 * \defgroup AST Abstract syntax tree node definitions 39 * 40 * An abstract syntax tree is generated by the parser. This is a fairly 41 * direct representation of the gramma derivation for the source program. 42 * No symantic checking is done during the generation of the AST. Only 43 * syntactic checking is done. Symantic checking is performed by a later 44 * stage that converts the AST to a more generic intermediate representation. 45 * 46 *@{ 47 */ 48/** 49 * Base class of all abstract syntax tree nodes 50 */ 51class ast_node { 52public: 53 DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(ast_node); 54 55 /** 56 * Print an AST node in something approximating the original GLSL code 57 */ 58 virtual void print(void) const; 59 60 /** 61 * Convert the AST node to the high-level intermediate representation 62 */ 63 virtual ir_rvalue *hir(exec_list *instructions, 64 struct _mesa_glsl_parse_state *state); 65 66 virtual bool has_sequence_subexpression() const; 67 68 /** 69 * Retrieve the source location of an AST node 70 * 71 * This function is primarily used to get the source position of an AST node 72 * into a form that can be passed to \c _mesa_glsl_error. 73 * 74 * \sa _mesa_glsl_error, ast_node::set_location 75 */ 76 struct YYLTYPE get_location(void) const 77 { 78 struct YYLTYPE locp; 79 80 locp.source = this->location.source; 81 locp.first_line = this->location.first_line; 82 locp.first_column = this->location.first_column; 83 locp.last_line = this->location.last_line; 84 locp.last_column = this->location.last_column; 85 86 return locp; 87 } 88 89 /** 90 * Set the source location of an AST node from a parser location 91 * 92 * \sa ast_node::get_location 93 */ 94 void set_location(const struct YYLTYPE &locp) 95 { 96 this->location.source = locp.source; 97 this->location.first_line = locp.first_line; 98 this->location.first_column = locp.first_column; 99 this->location.last_line = locp.last_line; 100 this->location.last_column = locp.last_column; 101 } 102 103 /** 104 * Set the source location range of an AST node using two location nodes 105 * 106 * \sa ast_node::set_location 107 */ 108 void set_location_range(const struct YYLTYPE &begin, const struct YYLTYPE &end) 109 { 110 this->location.source = begin.source; 111 this->location.first_line = begin.first_line; 112 this->location.last_line = end.last_line; 113 this->location.first_column = begin.first_column; 114 this->location.last_column = end.last_column; 115 } 116 117 /** 118 * Source location of the AST node. 119 */ 120 struct { 121 unsigned source; /**< GLSL source number. */ 122 unsigned first_line; /**< First line number within the source string. */ 123 unsigned first_column; /**< First column in the first line. */ 124 unsigned last_line; /**< Last line number within the source string. */ 125 unsigned last_column; /**< Last column in the last line. */ 126 } location; 127 128 exec_node link; 129 130 virtual void set_is_lhs(bool); 131 132protected: 133 /** 134 * The only constructor is protected so that only derived class objects can 135 * be created. 136 */ 137 ast_node(void); 138}; 139 140 141/** 142 * Operators for AST expression nodes. 143 */ 144enum ast_operators { 145 ast_assign, 146 ast_plus, /**< Unary + operator. */ 147 ast_neg, 148 ast_add, 149 ast_sub, 150 ast_mul, 151 ast_div, 152 ast_mod, 153 ast_lshift, 154 ast_rshift, 155 ast_less, 156 ast_greater, 157 ast_lequal, 158 ast_gequal, 159 ast_equal, 160 ast_nequal, 161 ast_bit_and, 162 ast_bit_xor, 163 ast_bit_or, 164 ast_bit_not, 165 ast_logic_and, 166 ast_logic_xor, 167 ast_logic_or, 168 ast_logic_not, 169 170 ast_mul_assign, 171 ast_div_assign, 172 ast_mod_assign, 173 ast_add_assign, 174 ast_sub_assign, 175 ast_ls_assign, 176 ast_rs_assign, 177 ast_and_assign, 178 ast_xor_assign, 179 ast_or_assign, 180 181 ast_conditional, 182 183 ast_pre_inc, 184 ast_pre_dec, 185 ast_post_inc, 186 ast_post_dec, 187 ast_field_selection, 188 ast_array_index, 189 ast_unsized_array_dim, 190 191 ast_function_call, 192 193 ast_identifier, 194 ast_int_constant, 195 ast_uint_constant, 196 ast_float_constant, 197 ast_bool_constant, 198 ast_double_constant, 199 ast_int64_constant, 200 ast_uint64_constant, 201 202 ast_sequence, 203 ast_aggregate 204 205 /** 206 * Number of possible operators for an ast_expression 207 * 208 * This is done as a define instead of as an additional value in the enum so 209 * that the compiler won't generate spurious messages like "warning: 210 * enumeration value ‘ast_num_operators’ not handled in switch" 211 */ 212 #define AST_NUM_OPERATORS (ast_aggregate + 1) 213}; 214 215/** 216 * Representation of any sort of expression. 217 */ 218class ast_expression : public ast_node { 219public: 220 ast_expression(int oper, ast_expression *, 221 ast_expression *, ast_expression *); 222 223 ast_expression(const char *identifier) : 224 oper(ast_identifier) 225 { 226 subexpressions[0] = NULL; 227 subexpressions[1] = NULL; 228 subexpressions[2] = NULL; 229 primary_expression.identifier = identifier; 230 this->non_lvalue_description = NULL; 231 this->is_lhs = false; 232 } 233 234 static const char *operator_string(enum ast_operators op); 235 236 virtual ir_rvalue *hir(exec_list *instructions, 237 struct _mesa_glsl_parse_state *state); 238 239 virtual void hir_no_rvalue(exec_list *instructions, 240 struct _mesa_glsl_parse_state *state); 241 242 virtual bool has_sequence_subexpression() const; 243 244 ir_rvalue *do_hir(exec_list *instructions, 245 struct _mesa_glsl_parse_state *state, 246 bool needs_rvalue); 247 248 virtual void print(void) const; 249 250 enum ast_operators oper; 251 252 ast_expression *subexpressions[3]; 253 254 union { 255 const char *identifier; 256 int int_constant; 257 float float_constant; 258 unsigned uint_constant; 259 int bool_constant; 260 double double_constant; 261 uint64_t uint64_constant; 262 int64_t int64_constant; 263 } primary_expression; 264 265 266 /** 267 * List of expressions for an \c ast_sequence or parameters for an 268 * \c ast_function_call 269 */ 270 exec_list expressions; 271 272 /** 273 * For things that can't be l-values, this describes what it is. 274 * 275 * This text is used by the code that generates IR for assignments to 276 * detect and emit useful messages for assignments to some things that 277 * can't be l-values. For example, pre- or post-incerement expressions. 278 * 279 * \note 280 * This pointer may be \c NULL. 281 */ 282 const char *non_lvalue_description; 283 284 void set_is_lhs(bool new_value); 285 286private: 287 bool is_lhs; 288}; 289 290class ast_expression_bin : public ast_expression { 291public: 292 ast_expression_bin(int oper, ast_expression *, ast_expression *); 293 294 virtual void print(void) const; 295}; 296 297/** 298 * Subclass of expressions for function calls 299 */ 300class ast_function_expression : public ast_expression { 301public: 302 ast_function_expression(ast_expression *callee) 303 : ast_expression(ast_function_call, callee, 304 NULL, NULL), 305 cons(false) 306 { 307 /* empty */ 308 } 309 310 ast_function_expression(class ast_type_specifier *type) 311 : ast_expression(ast_function_call, (ast_expression *) type, 312 NULL, NULL), 313 cons(true) 314 { 315 /* empty */ 316 } 317 318 bool is_constructor() const 319 { 320 return cons; 321 } 322 323 virtual ir_rvalue *hir(exec_list *instructions, 324 struct _mesa_glsl_parse_state *state); 325 326 virtual void hir_no_rvalue(exec_list *instructions, 327 struct _mesa_glsl_parse_state *state); 328 329 virtual bool has_sequence_subexpression() const; 330 331private: 332 /** 333 * Is this function call actually a constructor? 334 */ 335 bool cons; 336 ir_rvalue * 337 handle_method(exec_list *instructions, 338 struct _mesa_glsl_parse_state *state); 339}; 340 341class ast_subroutine_list : public ast_node 342{ 343public: 344 virtual void print(void) const; 345 exec_list declarations; 346}; 347 348class ast_array_specifier : public ast_node { 349public: 350 ast_array_specifier(const struct YYLTYPE &locp, ast_expression *dim) 351 { 352 set_location(locp); 353 array_dimensions.push_tail(&dim->link); 354 } 355 356 void add_dimension(ast_expression *dim) 357 { 358 array_dimensions.push_tail(&dim->link); 359 } 360 361 bool is_single_dimension() const 362 { 363 return this->array_dimensions.get_tail_raw()->prev != NULL && 364 this->array_dimensions.get_tail_raw()->prev->is_head_sentinel(); 365 } 366 367 virtual void print(void) const; 368 369 /* This list contains objects of type ast_node containing the 370 * array dimensions in outermost-to-innermost order. 371 */ 372 exec_list array_dimensions; 373}; 374 375class ast_layout_expression : public ast_node { 376public: 377 ast_layout_expression(const struct YYLTYPE &locp, ast_expression *expr) 378 { 379 set_location(locp); 380 layout_const_expressions.push_tail(&expr->link); 381 } 382 383 bool process_qualifier_constant(struct _mesa_glsl_parse_state *state, 384 const char *qual_indentifier, 385 unsigned *value, bool can_be_zero); 386 387 void merge_qualifier(ast_layout_expression *l_expr) 388 { 389 layout_const_expressions.append_list(&l_expr->layout_const_expressions); 390 } 391 392 exec_list layout_const_expressions; 393}; 394 395/** 396 * C-style aggregate initialization class 397 * 398 * Represents C-style initializers of vectors, matrices, arrays, and 399 * structures. E.g., vec3 pos = {1.0, 0.0, -1.0} is equivalent to 400 * vec3 pos = vec3(1.0, 0.0, -1.0). 401 * 402 * Specified in GLSL 4.20 and GL_ARB_shading_language_420pack. 403 * 404 * \sa _mesa_ast_set_aggregate_type 405 */ 406class ast_aggregate_initializer : public ast_expression { 407public: 408 ast_aggregate_initializer() 409 : ast_expression(ast_aggregate, NULL, NULL, NULL), 410 constructor_type(NULL) 411 { 412 /* empty */ 413 } 414 415 /** 416 * glsl_type of the aggregate, which is inferred from the LHS of whatever 417 * the aggregate is being used to initialize. This can't be inferred at 418 * parse time (since the parser deals with ast_type_specifiers, not 419 * glsl_types), so the parser leaves it NULL. However, the ast-to-hir 420 * conversion code makes sure to fill it in with the appropriate type 421 * before hir() is called. 422 */ 423 const glsl_type *constructor_type; 424 425 virtual ir_rvalue *hir(exec_list *instructions, 426 struct _mesa_glsl_parse_state *state); 427 428 virtual void hir_no_rvalue(exec_list *instructions, 429 struct _mesa_glsl_parse_state *state); 430}; 431 432 433class ast_compound_statement : public ast_node { 434public: 435 ast_compound_statement(int new_scope, ast_node *statements); 436 virtual void print(void) const; 437 438 virtual ir_rvalue *hir(exec_list *instructions, 439 struct _mesa_glsl_parse_state *state); 440 441 int new_scope; 442 exec_list statements; 443}; 444 445class ast_declaration : public ast_node { 446public: 447 ast_declaration(const char *identifier, 448 ast_array_specifier *array_specifier, 449 ast_expression *initializer); 450 virtual void print(void) const; 451 452 const char *identifier; 453 454 ast_array_specifier *array_specifier; 455 456 ast_expression *initializer; 457}; 458 459 460enum { 461 ast_precision_none = 0, /**< Absence of precision qualifier. */ 462 ast_precision_high, 463 ast_precision_medium, 464 ast_precision_low 465}; 466 467enum { 468 ast_depth_none = 0, /**< Absence of depth qualifier. */ 469 ast_depth_any, 470 ast_depth_greater, 471 ast_depth_less, 472 ast_depth_unchanged 473}; 474 475struct ast_type_qualifier { 476 DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier); 477 /* Note: this bitset needs to have at least as many bits as the 'q' 478 * struct has flags, below. Previously, the size was 128 instead of 96. 479 * But an apparent bug in GCC 5.4.0 causes bad SSE code generation 480 * elsewhere, leading to a crash. 96 bits works around the issue. 481 * See https://bugs.freedesktop.org/show_bug.cgi?id=105497 482 */ 483 DECLARE_BITSET_T(bitset_t, 96); 484 485 union flags { 486 struct { 487 unsigned invariant:1; 488 unsigned precise:1; 489 unsigned constant:1; 490 unsigned attribute:1; 491 unsigned varying:1; 492 unsigned in:1; 493 unsigned out:1; 494 unsigned centroid:1; 495 unsigned sample:1; 496 unsigned patch:1; 497 unsigned uniform:1; 498 unsigned buffer:1; 499 unsigned shared_storage:1; 500 unsigned smooth:1; 501 unsigned flat:1; 502 unsigned noperspective:1; 503 504 /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */ 505 /*@{*/ 506 unsigned origin_upper_left:1; 507 unsigned pixel_center_integer:1; 508 /*@}*/ 509 510 /** 511 * Flag set if GL_ARB_enhanced_layouts "align" layout qualifier is 512 * used. 513 */ 514 unsigned explicit_align:1; 515 516 /** 517 * Flag set if GL_ARB_explicit_attrib_location "location" layout 518 * qualifier is used. 519 */ 520 unsigned explicit_location:1; 521 /** 522 * Flag set if GL_ARB_explicit_attrib_location "index" layout 523 * qualifier is used. 524 */ 525 unsigned explicit_index:1; 526 527 /** 528 * Flag set if GL_ARB_enhanced_layouts "component" layout 529 * qualifier is used. 530 */ 531 unsigned explicit_component:1; 532 533 /** 534 * Flag set if GL_ARB_shading_language_420pack "binding" layout 535 * qualifier is used. 536 */ 537 unsigned explicit_binding:1; 538 539 /** 540 * Flag set if GL_ARB_shader_atomic counter "offset" layout 541 * qualifier is used. 542 */ 543 unsigned explicit_offset:1; 544 545 /** \name Layout qualifiers for GL_AMD_conservative_depth */ 546 /** \{ */ 547 unsigned depth_type:1; 548 /** \} */ 549 550 /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ 551 /** \{ */ 552 unsigned std140:1; 553 unsigned std430:1; 554 unsigned shared:1; 555 unsigned packed:1; 556 unsigned column_major:1; 557 unsigned row_major:1; 558 /** \} */ 559 560 /** \name Layout qualifiers for GLSL 1.50 geometry shaders */ 561 /** \{ */ 562 unsigned prim_type:1; 563 unsigned max_vertices:1; 564 /** \} */ 565 566 /** 567 * local_size_{x,y,z} flags for compute shaders. Bit 0 represents 568 * local_size_x, and so on. 569 */ 570 unsigned local_size:3; 571 572 /** \name Layout qualifiers for ARB_compute_variable_group_size. */ 573 /** \{ */ 574 unsigned local_size_variable:1; 575 /** \} */ 576 577 /** \name Layout and memory qualifiers for ARB_shader_image_load_store. */ 578 /** \{ */ 579 unsigned early_fragment_tests:1; 580 unsigned explicit_image_format:1; 581 unsigned coherent:1; 582 unsigned _volatile:1; 583 unsigned restrict_flag:1; 584 unsigned read_only:1; /**< "readonly" qualifier. */ 585 unsigned write_only:1; /**< "writeonly" qualifier. */ 586 /** \} */ 587 588 /** \name Layout qualifiers for GL_ARB_gpu_shader5 */ 589 /** \{ */ 590 unsigned invocations:1; 591 unsigned stream:1; /**< Has stream value assigned */ 592 unsigned explicit_stream:1; /**< stream value assigned explicitly by shader code */ 593 /** \} */ 594 595 /** \name Layout qualifiers for GL_ARB_enhanced_layouts */ 596 /** \{ */ 597 unsigned explicit_xfb_offset:1; /**< xfb_offset value assigned explicitly by shader code */ 598 unsigned xfb_buffer:1; /**< Has xfb_buffer value assigned */ 599 unsigned explicit_xfb_buffer:1; /**< xfb_buffer value assigned explicitly by shader code */ 600 unsigned xfb_stride:1; /**< Is xfb_stride value yet to be merged with global values */ 601 unsigned explicit_xfb_stride:1; /**< xfb_stride value assigned explicitly by shader code */ 602 /** \} */ 603 604 /** \name Layout qualifiers for GL_ARB_tessellation_shader */ 605 /** \{ */ 606 /* tess eval input layout */ 607 /* gs prim_type reused for primitive mode */ 608 unsigned vertex_spacing:1; 609 unsigned ordering:1; 610 unsigned point_mode:1; 611 /* tess control output layout */ 612 unsigned vertices:1; 613 /** \} */ 614 615 /** \name Qualifiers for GL_ARB_shader_subroutine */ 616 /** \{ */ 617 unsigned subroutine:1; /**< Is this marked 'subroutine' */ 618 /** \} */ 619 620 /** \name Qualifiers for GL_KHR_blend_equation_advanced */ 621 /** \{ */ 622 unsigned blend_support:1; /**< Are there any blend_support_ qualifiers */ 623 /** \} */ 624 625 /** 626 * Flag set if GL_ARB_post_depth_coverage layout qualifier is used. 627 */ 628 unsigned post_depth_coverage:1; 629 630 /** 631 * Flags for the layout qualifers added by ARB_fragment_shader_interlock 632 */ 633 634 unsigned pixel_interlock_ordered:1; 635 unsigned pixel_interlock_unordered:1; 636 unsigned sample_interlock_ordered:1; 637 unsigned sample_interlock_unordered:1; 638 639 /** 640 * Flag set if GL_INTEL_conservartive_rasterization layout qualifier 641 * is used. 642 */ 643 unsigned inner_coverage:1; 644 645 /** \name Layout qualifiers for GL_ARB_bindless_texture */ 646 /** \{ */ 647 unsigned bindless_sampler:1; 648 unsigned bindless_image:1; 649 unsigned bound_sampler:1; 650 unsigned bound_image:1; 651 /** \} */ 652 653 /** \name Layout qualifiers for GL_EXT_shader_framebuffer_fetch_non_coherent */ 654 /** \{ */ 655 unsigned non_coherent:1; 656 /** \} */ 657 } 658 /** \brief Set of flags, accessed by name. */ 659 q; 660 661 /** \brief Set of flags, accessed as a bitmask. */ 662 bitset_t i; 663 } flags; 664 665 /** Precision of the type (highp/medium/lowp). */ 666 unsigned precision:2; 667 668 /** Type of layout qualifiers for GL_AMD_conservative_depth. */ 669 unsigned depth_type:3; 670 671 /** 672 * Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier 673 */ 674 ast_expression *align; 675 676 /** Geometry shader invocations for GL_ARB_gpu_shader5. */ 677 ast_layout_expression *invocations; 678 679 /** 680 * Location specified via GL_ARB_explicit_attrib_location layout 681 * 682 * \note 683 * This field is only valid if \c explicit_location is set. 684 */ 685 ast_expression *location; 686 /** 687 * Index specified via GL_ARB_explicit_attrib_location layout 688 * 689 * \note 690 * This field is only valid if \c explicit_index is set. 691 */ 692 ast_expression *index; 693 694 /** 695 * Component specified via GL_ARB_enhaced_layouts 696 * 697 * \note 698 * This field is only valid if \c explicit_component is set. 699 */ 700 ast_expression *component; 701 702 /** Maximum output vertices in GLSL 1.50 geometry shaders. */ 703 ast_layout_expression *max_vertices; 704 705 /** Stream in GLSL 1.50 geometry shaders. */ 706 ast_expression *stream; 707 708 /** xfb_buffer specified via the GL_ARB_enhanced_layouts keyword. */ 709 ast_expression *xfb_buffer; 710 711 /** xfb_stride specified via the GL_ARB_enhanced_layouts keyword. */ 712 ast_expression *xfb_stride; 713 714 /** global xfb_stride values for each buffer */ 715 ast_layout_expression *out_xfb_stride[MAX_FEEDBACK_BUFFERS]; 716 717 /** 718 * Input or output primitive type in GLSL 1.50 geometry shaders 719 * and tessellation shaders. 720 */ 721 GLenum prim_type; 722 723 /** 724 * Binding specified via GL_ARB_shading_language_420pack's "binding" keyword. 725 * 726 * \note 727 * This field is only valid if \c explicit_binding is set. 728 */ 729 ast_expression *binding; 730 731 /** 732 * Offset specified via GL_ARB_shader_atomic_counter's or 733 * GL_ARB_enhanced_layouts "offset" keyword, or by GL_ARB_enhanced_layouts 734 * "xfb_offset" keyword. 735 * 736 * \note 737 * This field is only valid if \c explicit_offset is set. 738 */ 739 ast_expression *offset; 740 741 /** 742 * Local size specified via GL_ARB_compute_shader's "local_size_{x,y,z}" 743 * layout qualifier. Element i of this array is only valid if 744 * flags.q.local_size & (1 << i) is set. 745 */ 746 ast_layout_expression *local_size[3]; 747 748 /** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */ 749 enum gl_tess_spacing vertex_spacing; 750 751 /** Tessellation evaluation shader: vertex ordering (CW or CCW) */ 752 GLenum ordering; 753 754 /** Tessellation evaluation shader: point mode */ 755 bool point_mode; 756 757 /** Tessellation control shader: number of output vertices */ 758 ast_layout_expression *vertices; 759 760 /** 761 * Image format specified with an ARB_shader_image_load_store 762 * layout qualifier. 763 * 764 * \note 765 * This field is only valid if \c explicit_image_format is set. 766 */ 767 GLenum image_format; 768 769 /** 770 * Base type of the data read from or written to this image. Only 771 * the following enumerants are allowed: GLSL_TYPE_UINT, 772 * GLSL_TYPE_INT, GLSL_TYPE_FLOAT. 773 * 774 * \note 775 * This field is only valid if \c explicit_image_format is set. 776 */ 777 glsl_base_type image_base_type; 778 779 /** 780 * Return true if and only if an interpolation qualifier is present. 781 */ 782 bool has_interpolation() const; 783 784 /** 785 * Return whether a layout qualifier is present. 786 */ 787 bool has_layout() const; 788 789 /** 790 * Return whether a storage qualifier is present. 791 */ 792 bool has_storage() const; 793 794 /** 795 * Return whether an auxiliary storage qualifier is present. 796 */ 797 bool has_auxiliary_storage() const; 798 799 /** 800 * Return true if and only if a memory qualifier is present. 801 */ 802 bool has_memory() const; 803 804 /** 805 * Return true if the qualifier is a subroutine declaration. 806 */ 807 bool is_subroutine_decl() const; 808 809 bool merge_qualifier(YYLTYPE *loc, 810 _mesa_glsl_parse_state *state, 811 const ast_type_qualifier &q, 812 bool is_single_layout_merge, 813 bool is_multiple_layouts_merge = false); 814 815 /** 816 * Validate current qualifier against the global out one. 817 */ 818 bool validate_out_qualifier(YYLTYPE *loc, 819 _mesa_glsl_parse_state *state); 820 821 /** 822 * Merge current qualifier into the global out one. 823 */ 824 bool merge_into_out_qualifier(YYLTYPE *loc, 825 _mesa_glsl_parse_state *state, 826 ast_node* &node); 827 828 /** 829 * Validate current qualifier against the global in one. 830 */ 831 bool validate_in_qualifier(YYLTYPE *loc, 832 _mesa_glsl_parse_state *state); 833 834 /** 835 * Merge current qualifier into the global in one. 836 */ 837 bool merge_into_in_qualifier(YYLTYPE *loc, 838 _mesa_glsl_parse_state *state, 839 ast_node* &node); 840 841 /** 842 * Push pending layout qualifiers to the global values. 843 */ 844 bool push_to_global(YYLTYPE *loc, 845 _mesa_glsl_parse_state *state); 846 847 bool validate_flags(YYLTYPE *loc, 848 _mesa_glsl_parse_state *state, 849 const ast_type_qualifier &allowed_flags, 850 const char *message, const char *name); 851 852 ast_subroutine_list *subroutine_list; 853}; 854 855class ast_declarator_list; 856 857class ast_struct_specifier : public ast_node { 858public: 859 ast_struct_specifier(const char *identifier, 860 ast_declarator_list *declarator_list); 861 virtual void print(void) const; 862 863 virtual ir_rvalue *hir(exec_list *instructions, 864 struct _mesa_glsl_parse_state *state); 865 866 const char *name; 867 ast_type_qualifier *layout; 868 /* List of ast_declarator_list * */ 869 exec_list declarations; 870 bool is_declaration; 871 const glsl_type *type; 872}; 873 874 875 876class ast_type_specifier : public ast_node { 877public: 878 /** Construct a type specifier from a type name */ 879 ast_type_specifier(const char *name) 880 : type(NULL), type_name(name), structure(NULL), array_specifier(NULL), 881 default_precision(ast_precision_none) 882 { 883 /* empty */ 884 } 885 886 /** Construct a type specifier from a structure definition */ 887 ast_type_specifier(ast_struct_specifier *s) 888 : type(NULL), type_name(s->name), structure(s), array_specifier(NULL), 889 default_precision(ast_precision_none) 890 { 891 /* empty */ 892 } 893 894 ast_type_specifier(const glsl_type *t) 895 : type(t), type_name(t->name), structure(NULL), array_specifier(NULL), 896 default_precision(ast_precision_none) 897 { 898 /* empty */ 899 } 900 901 const struct glsl_type *glsl_type(const char **name, 902 struct _mesa_glsl_parse_state *state) 903 const; 904 905 virtual void print(void) const; 906 907 ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 908 909 const struct glsl_type *type; 910 const char *type_name; 911 ast_struct_specifier *structure; 912 913 ast_array_specifier *array_specifier; 914 915 /** For precision statements, this is the given precision; otherwise none. */ 916 unsigned default_precision:2; 917}; 918 919 920class ast_fully_specified_type : public ast_node { 921public: 922 virtual void print(void) const; 923 bool has_qualifiers(_mesa_glsl_parse_state *state) const; 924 925 ast_fully_specified_type() : qualifier(), specifier(NULL) 926 { 927 } 928 929 const struct glsl_type *glsl_type(const char **name, 930 struct _mesa_glsl_parse_state *state) 931 const; 932 933 ast_type_qualifier qualifier; 934 ast_type_specifier *specifier; 935}; 936 937 938class ast_declarator_list : public ast_node { 939public: 940 ast_declarator_list(ast_fully_specified_type *); 941 virtual void print(void) const; 942 943 virtual ir_rvalue *hir(exec_list *instructions, 944 struct _mesa_glsl_parse_state *state); 945 946 ast_fully_specified_type *type; 947 /** List of 'ast_declaration *' */ 948 exec_list declarations; 949 950 /** 951 * Flags for redeclarations. In these cases, no type is specified, to 952 * `type` is allowed to be NULL. In all other cases, this would be an error. 953 */ 954 int invariant; /** < `invariant` redeclaration */ 955 int precise; /** < `precise` redeclaration */ 956}; 957 958 959class ast_parameter_declarator : public ast_node { 960public: 961 ast_parameter_declarator() : 962 type(NULL), 963 identifier(NULL), 964 array_specifier(NULL), 965 formal_parameter(false), 966 is_void(false) 967 { 968 /* empty */ 969 } 970 971 virtual void print(void) const; 972 973 virtual ir_rvalue *hir(exec_list *instructions, 974 struct _mesa_glsl_parse_state *state); 975 976 ast_fully_specified_type *type; 977 const char *identifier; 978 ast_array_specifier *array_specifier; 979 980 static void parameters_to_hir(exec_list *ast_parameters, 981 bool formal, exec_list *ir_parameters, 982 struct _mesa_glsl_parse_state *state); 983 984private: 985 /** Is this parameter declaration part of a formal parameter list? */ 986 bool formal_parameter; 987 988 /** 989 * Is this parameter 'void' type? 990 * 991 * This field is set by \c ::hir. 992 */ 993 bool is_void; 994}; 995 996 997class ast_function : public ast_node { 998public: 999 ast_function(void); 1000 1001 virtual void print(void) const; 1002 1003 virtual ir_rvalue *hir(exec_list *instructions, 1004 struct _mesa_glsl_parse_state *state); 1005 1006 ast_fully_specified_type *return_type; 1007 const char *identifier; 1008 1009 exec_list parameters; 1010 1011private: 1012 /** 1013 * Is this prototype part of the function definition? 1014 * 1015 * Used by ast_function_definition::hir to process the parameters, etc. 1016 * of the function. 1017 * 1018 * \sa ::hir 1019 */ 1020 bool is_definition; 1021 1022 /** 1023 * Function signature corresponding to this function prototype instance 1024 * 1025 * Used by ast_function_definition::hir to process the parameters, etc. 1026 * of the function. 1027 * 1028 * \sa ::hir 1029 */ 1030 class ir_function_signature *signature; 1031 1032 friend class ast_function_definition; 1033}; 1034 1035 1036class ast_expression_statement : public ast_node { 1037public: 1038 ast_expression_statement(ast_expression *); 1039 virtual void print(void) const; 1040 1041 virtual ir_rvalue *hir(exec_list *instructions, 1042 struct _mesa_glsl_parse_state *state); 1043 1044 ast_expression *expression; 1045}; 1046 1047 1048class ast_case_label : public ast_node { 1049public: 1050 ast_case_label(ast_expression *test_value); 1051 virtual void print(void) const; 1052 1053 virtual ir_rvalue *hir(exec_list *instructions, 1054 struct _mesa_glsl_parse_state *state); 1055 1056 /** 1057 * An test value of NULL means 'default'. 1058 */ 1059 ast_expression *test_value; 1060}; 1061 1062 1063class ast_case_label_list : public ast_node { 1064public: 1065 ast_case_label_list(void); 1066 virtual void print(void) const; 1067 1068 virtual ir_rvalue *hir(exec_list *instructions, 1069 struct _mesa_glsl_parse_state *state); 1070 1071 /** 1072 * A list of case labels. 1073 */ 1074 exec_list labels; 1075}; 1076 1077 1078class ast_case_statement : public ast_node { 1079public: 1080 ast_case_statement(ast_case_label_list *labels); 1081 virtual void print(void) const; 1082 1083 virtual ir_rvalue *hir(exec_list *instructions, 1084 struct _mesa_glsl_parse_state *state); 1085 1086 ast_case_label_list *labels; 1087 1088 /** 1089 * A list of statements. 1090 */ 1091 exec_list stmts; 1092}; 1093 1094 1095class ast_case_statement_list : public ast_node { 1096public: 1097 ast_case_statement_list(void); 1098 virtual void print(void) const; 1099 1100 virtual ir_rvalue *hir(exec_list *instructions, 1101 struct _mesa_glsl_parse_state *state); 1102 1103 /** 1104 * A list of cases. 1105 */ 1106 exec_list cases; 1107}; 1108 1109 1110class ast_switch_body : public ast_node { 1111public: 1112 ast_switch_body(ast_case_statement_list *stmts); 1113 virtual void print(void) const; 1114 1115 virtual ir_rvalue *hir(exec_list *instructions, 1116 struct _mesa_glsl_parse_state *state); 1117 1118 ast_case_statement_list *stmts; 1119}; 1120 1121 1122class ast_selection_statement : public ast_node { 1123public: 1124 ast_selection_statement(ast_expression *condition, 1125 ast_node *then_statement, 1126 ast_node *else_statement); 1127 virtual void print(void) const; 1128 1129 virtual ir_rvalue *hir(exec_list *instructions, 1130 struct _mesa_glsl_parse_state *state); 1131 1132 ast_expression *condition; 1133 ast_node *then_statement; 1134 ast_node *else_statement; 1135}; 1136 1137 1138class ast_switch_statement : public ast_node { 1139public: 1140 ast_switch_statement(ast_expression *test_expression, 1141 ast_node *body); 1142 virtual void print(void) const; 1143 1144 virtual ir_rvalue *hir(exec_list *instructions, 1145 struct _mesa_glsl_parse_state *state); 1146 1147 ast_expression *test_expression; 1148 ast_node *body; 1149 1150protected: 1151 void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 1152}; 1153 1154class ast_iteration_statement : public ast_node { 1155public: 1156 ast_iteration_statement(int mode, ast_node *init, ast_node *condition, 1157 ast_expression *rest_expression, ast_node *body); 1158 1159 virtual void print(void) const; 1160 1161 virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); 1162 1163 enum ast_iteration_modes { 1164 ast_for, 1165 ast_while, 1166 ast_do_while 1167 } mode; 1168 1169 1170 ast_node *init_statement; 1171 ast_node *condition; 1172 ast_expression *rest_expression; 1173 1174 ast_node *body; 1175 1176 /** 1177 * Generate IR from the condition of a loop 1178 * 1179 * This is factored out of ::hir because some loops have the condition 1180 * test at the top (for and while), and others have it at the end (do-while). 1181 */ 1182 void condition_to_hir(exec_list *, struct _mesa_glsl_parse_state *); 1183}; 1184 1185 1186class ast_jump_statement : public ast_node { 1187public: 1188 ast_jump_statement(int mode, ast_expression *return_value); 1189 virtual void print(void) const; 1190 1191 virtual ir_rvalue *hir(exec_list *instructions, 1192 struct _mesa_glsl_parse_state *state); 1193 1194 enum ast_jump_modes { 1195 ast_continue, 1196 ast_break, 1197 ast_return, 1198 ast_discard 1199 } mode; 1200 1201 ast_expression *opt_return_value; 1202}; 1203 1204 1205class ast_function_definition : public ast_node { 1206public: 1207 ast_function_definition() : prototype(NULL), body(NULL) 1208 { 1209 } 1210 1211 virtual void print(void) const; 1212 1213 virtual ir_rvalue *hir(exec_list *instructions, 1214 struct _mesa_glsl_parse_state *state); 1215 1216 ast_function *prototype; 1217 ast_compound_statement *body; 1218}; 1219 1220class ast_interface_block : public ast_node { 1221public: 1222 ast_interface_block(const char *instance_name, 1223 ast_array_specifier *array_specifier) 1224 : block_name(NULL), instance_name(instance_name), 1225 array_specifier(array_specifier) 1226 { 1227 } 1228 1229 virtual ir_rvalue *hir(exec_list *instructions, 1230 struct _mesa_glsl_parse_state *state); 1231 1232 ast_type_qualifier default_layout; 1233 ast_type_qualifier layout; 1234 const char *block_name; 1235 1236 /** 1237 * Declared name of the block instance, if specified. 1238 * 1239 * If the block does not have an instance name, this field will be 1240 * \c NULL. 1241 */ 1242 const char *instance_name; 1243 1244 /** List of ast_declarator_list * */ 1245 exec_list declarations; 1246 1247 /** 1248 * Declared array size of the block instance 1249 * 1250 * If the block is not declared as an array or if the block instance array 1251 * is unsized, this field will be \c NULL. 1252 */ 1253 ast_array_specifier *array_specifier; 1254}; 1255 1256 1257/** 1258 * AST node representing a declaration of the output layout for tessellation 1259 * control shaders. 1260 */ 1261class ast_tcs_output_layout : public ast_node 1262{ 1263public: 1264 ast_tcs_output_layout(const struct YYLTYPE &locp) 1265 { 1266 set_location(locp); 1267 } 1268 1269 virtual ir_rvalue *hir(exec_list *instructions, 1270 struct _mesa_glsl_parse_state *state); 1271}; 1272 1273 1274/** 1275 * AST node representing a declaration of the input layout for geometry 1276 * shaders. 1277 */ 1278class ast_gs_input_layout : public ast_node 1279{ 1280public: 1281 ast_gs_input_layout(const struct YYLTYPE &locp, GLenum prim_type) 1282 : prim_type(prim_type) 1283 { 1284 set_location(locp); 1285 } 1286 1287 virtual ir_rvalue *hir(exec_list *instructions, 1288 struct _mesa_glsl_parse_state *state); 1289 1290private: 1291 const GLenum prim_type; 1292}; 1293 1294 1295/** 1296 * AST node representing a decalaration of the input layout for compute 1297 * shaders. 1298 */ 1299class ast_cs_input_layout : public ast_node 1300{ 1301public: 1302 ast_cs_input_layout(const struct YYLTYPE &locp, 1303 ast_layout_expression *const *local_size) 1304 { 1305 for (int i = 0; i < 3; i++) { 1306 this->local_size[i] = local_size[i]; 1307 } 1308 set_location(locp); 1309 } 1310 1311 virtual ir_rvalue *hir(exec_list *instructions, 1312 struct _mesa_glsl_parse_state *state); 1313 1314private: 1315 ast_layout_expression *local_size[3]; 1316}; 1317 1318/*@}*/ 1319 1320extern void 1321_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state); 1322 1323extern ir_rvalue * 1324_mesa_ast_field_selection_to_hir(const ast_expression *expr, 1325 exec_list *instructions, 1326 struct _mesa_glsl_parse_state *state); 1327 1328extern ir_rvalue * 1329_mesa_ast_array_index_to_hir(void *mem_ctx, 1330 struct _mesa_glsl_parse_state *state, 1331 ir_rvalue *array, ir_rvalue *idx, 1332 YYLTYPE &loc, YYLTYPE &idx_loc); 1333 1334extern void 1335_mesa_ast_set_aggregate_type(const glsl_type *type, 1336 ast_expression *expr); 1337 1338void 1339emit_function(_mesa_glsl_parse_state *state, ir_function *f); 1340 1341extern void 1342check_builtin_array_max_size(const char *name, unsigned size, 1343 YYLTYPE loc, struct _mesa_glsl_parse_state *state); 1344 1345extern void _mesa_ast_process_interface_block(YYLTYPE *locp, 1346 _mesa_glsl_parse_state *state, 1347 ast_interface_block *const block, 1348 const struct ast_type_qualifier &q); 1349 1350extern bool 1351process_qualifier_constant(struct _mesa_glsl_parse_state *state, 1352 YYLTYPE *loc, 1353 const char *qual_indentifier, 1354 ast_expression *const_expression, 1355 unsigned *value); 1356#endif /* AST_H */ 1357