1 /* -*- c++ -*- */ 2 /* 3 * Copyright 2010 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 #pragma once 26 #ifndef IR_H 27 #define IR_H 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 32 #include "util/ralloc.h" 33 #include "compiler/glsl_types.h" 34 #include "list.h" 35 #include "ir_visitor.h" 36 #include "ir_hierarchical_visitor.h" 37 #include "main/mtypes.h" 38 39 #ifdef __cplusplus 40 41 /** 42 * \defgroup IR Intermediate representation nodes 43 * 44 * @{ 45 */ 46 47 /** 48 * Class tags 49 * 50 * Each concrete class derived from \c ir_instruction has a value in this 51 * enumerant. The value for the type is stored in \c ir_instruction::ir_type 52 * by the constructor. While using type tags is not very C++, it is extremely 53 * convenient. For example, during debugging you can simply inspect 54 * \c ir_instruction::ir_type to find out the actual type of the object. 55 * 56 * In addition, it is possible to use a switch-statement based on \c 57 * \c ir_instruction::ir_type to select different behavior for different object 58 * types. For functions that have only slight differences for several object 59 * types, this allows writing very straightforward, readable code. 60 */ 61 enum ir_node_type { 62 ir_type_dereference_array, 63 ir_type_dereference_record, 64 ir_type_dereference_variable, 65 ir_type_constant, 66 ir_type_expression, 67 ir_type_swizzle, 68 ir_type_texture, 69 ir_type_variable, 70 ir_type_assignment, 71 ir_type_call, 72 ir_type_function, 73 ir_type_function_signature, 74 ir_type_if, 75 ir_type_loop, 76 ir_type_loop_jump, 77 ir_type_return, 78 ir_type_discard, 79 ir_type_emit_vertex, 80 ir_type_end_primitive, 81 ir_type_barrier, 82 ir_type_max, /**< maximum ir_type enum number, for validation */ 83 ir_type_unset = ir_type_max 84 }; 85 86 87 /** 88 * Base class of all IR instructions 89 */ 90 class ir_instruction : public exec_node { 91 public: 92 enum ir_node_type ir_type; 93 94 /** 95 * GCC 4.7+ and clang warn when deleting an ir_instruction unless 96 * there's a virtual destructor present. Because we almost 97 * universally use ralloc for our memory management of 98 * ir_instructions, the destructor doesn't need to do any work. 99 */ 100 virtual ~ir_instruction() 101 { 102 } 103 104 /** ir_print_visitor helper for debugging. */ 105 void print(void) const; 106 void fprint(FILE *f) const; 107 108 virtual void accept(ir_visitor *) = 0; 109 virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 110 virtual ir_instruction *clone(void *mem_ctx, 111 struct hash_table *ht) const = 0; 112 113 bool is_rvalue() const 114 { 115 return ir_type == ir_type_dereference_array || 116 ir_type == ir_type_dereference_record || 117 ir_type == ir_type_dereference_variable || 118 ir_type == ir_type_constant || 119 ir_type == ir_type_expression || 120 ir_type == ir_type_swizzle || 121 ir_type == ir_type_texture; 122 } 123 124 bool is_dereference() const 125 { 126 return ir_type == ir_type_dereference_array || 127 ir_type == ir_type_dereference_record || 128 ir_type == ir_type_dereference_variable; 129 } 130 131 bool is_jump() const 132 { 133 return ir_type == ir_type_loop_jump || 134 ir_type == ir_type_return || 135 ir_type == ir_type_discard; 136 } 137 138 /** 139 * \name IR instruction downcast functions 140 * 141 * These functions either cast the object to a derived class or return 142 * \c NULL if the object's type does not match the specified derived class. 143 * Additional downcast functions will be added as needed. 144 */ 145 /*@{*/ 146 #define AS_BASE(TYPE) \ 147 class ir_##TYPE *as_##TYPE() \ 148 { \ 149 assume(this != NULL); \ 150 return is_##TYPE() ? (ir_##TYPE *) this : NULL; \ 151 } \ 152 const class ir_##TYPE *as_##TYPE() const \ 153 { \ 154 assume(this != NULL); \ 155 return is_##TYPE() ? (ir_##TYPE *) this : NULL; \ 156 } 157 158 AS_BASE(rvalue) 159 AS_BASE(dereference) 160 AS_BASE(jump) 161 #undef AS_BASE 162 163 #define AS_CHILD(TYPE) \ 164 class ir_##TYPE * as_##TYPE() \ 165 { \ 166 assume(this != NULL); \ 167 return ir_type == ir_type_##TYPE ? (ir_##TYPE *) this : NULL; \ 168 } \ 169 const class ir_##TYPE * as_##TYPE() const \ 170 { \ 171 assume(this != NULL); \ 172 return ir_type == ir_type_##TYPE ? (const ir_##TYPE *) this : NULL; \ 173 } 174 AS_CHILD(variable) 175 AS_CHILD(function) 176 AS_CHILD(dereference_array) 177 AS_CHILD(dereference_variable) 178 AS_CHILD(dereference_record) 179 AS_CHILD(expression) 180 AS_CHILD(loop) 181 AS_CHILD(assignment) 182 AS_CHILD(call) 183 AS_CHILD(return) 184 AS_CHILD(if) 185 AS_CHILD(swizzle) 186 AS_CHILD(texture) 187 AS_CHILD(constant) 188 AS_CHILD(discard) 189 #undef AS_CHILD 190 /*@}*/ 191 192 /** 193 * IR equality method: Return true if the referenced instruction would 194 * return the same value as this one. 195 * 196 * This intended to be used for CSE and algebraic optimizations, on rvalues 197 * in particular. No support for other instruction types (assignments, 198 * jumps, calls, etc.) is planned. 199 */ 200 virtual bool equals(const ir_instruction *ir, 201 enum ir_node_type ignore = ir_type_unset) const; 202 203 protected: 204 ir_instruction(enum ir_node_type t) 205 : ir_type(t) 206 { 207 } 208 209 private: 210 ir_instruction() 211 { 212 assert(!"Should not get here."); 213 } 214 }; 215 216 217 /** 218 * The base class for all "values"/expression trees. 219 */ 220 class ir_rvalue : public ir_instruction { 221 public: 222 const struct glsl_type *type; 223 224 virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const; 225 226 virtual void accept(ir_visitor *v) 227 { 228 v->visit(this); 229 } 230 231 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 232 233 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 234 235 ir_rvalue *as_rvalue_to_saturate(); 236 237 virtual bool is_lvalue() const 238 { 239 return false; 240 } 241 242 /** 243 * Get the variable that is ultimately referenced by an r-value 244 */ 245 virtual ir_variable *variable_referenced() const 246 { 247 return NULL; 248 } 249 250 251 /** 252 * If an r-value is a reference to a whole variable, get that variable 253 * 254 * \return 255 * Pointer to a variable that is completely dereferenced by the r-value. If 256 * the r-value is not a dereference or the dereference does not access the 257 * entire variable (i.e., it's just one array element, struct field), \c NULL 258 * is returned. 259 */ 260 virtual ir_variable *whole_variable_referenced() 261 { 262 return NULL; 263 } 264 265 /** 266 * Determine if an r-value has the value zero 267 * 268 * The base implementation of this function always returns \c false. The 269 * \c ir_constant class over-rides this function to return \c true \b only 270 * for vector and scalar types that have all elements set to the value 271 * zero (or \c false for booleans). 272 * 273 * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one 274 */ 275 virtual bool is_zero() const; 276 277 /** 278 * Determine if an r-value has the value one 279 * 280 * The base implementation of this function always returns \c false. The 281 * \c ir_constant class over-rides this function to return \c true \b only 282 * for vector and scalar types that have all elements set to the value 283 * one (or \c true for booleans). 284 * 285 * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one 286 */ 287 virtual bool is_one() const; 288 289 /** 290 * Determine if an r-value has the value negative one 291 * 292 * The base implementation of this function always returns \c false. The 293 * \c ir_constant class over-rides this function to return \c true \b only 294 * for vector and scalar types that have all elements set to the value 295 * negative one. For boolean types, the result is always \c false. 296 * 297 * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one 298 */ 299 virtual bool is_negative_one() const; 300 301 /** 302 * Determine if an r-value is an unsigned integer constant which can be 303 * stored in 16 bits. 304 * 305 * \sa ir_constant::is_uint16_constant. 306 */ 307 virtual bool is_uint16_constant() const { return false; } 308 309 /** 310 * Return a generic value of error_type. 311 * 312 * Allocation will be performed with 'mem_ctx' as ralloc owner. 313 */ 314 static ir_rvalue *error_value(void *mem_ctx); 315 316 protected: 317 ir_rvalue(enum ir_node_type t); 318 }; 319 320 321 /** 322 * Variable storage classes 323 */ 324 enum ir_variable_mode { 325 ir_var_auto = 0, /**< Function local variables and globals. */ 326 ir_var_uniform, /**< Variable declared as a uniform. */ 327 ir_var_shader_storage, /**< Variable declared as an ssbo. */ 328 ir_var_shader_shared, /**< Variable declared as shared. */ 329 ir_var_shader_in, 330 ir_var_shader_out, 331 ir_var_function_in, 332 ir_var_function_out, 333 ir_var_function_inout, 334 ir_var_const_in, /**< "in" param that must be a constant expression */ 335 ir_var_system_value, /**< Ex: front-face, instance-id, etc. */ 336 ir_var_temporary, /**< Temporary variable generated during compilation. */ 337 ir_var_mode_count /**< Number of variable modes */ 338 }; 339 340 /** 341 * Enum keeping track of how a variable was declared. For error checking of 342 * the gl_PerVertex redeclaration rules. 343 */ 344 enum ir_var_declaration_type { 345 /** 346 * Normal declaration (for most variables, this means an explicit 347 * declaration. Exception: temporaries are always implicitly declared, but 348 * they still use ir_var_declared_normally). 349 * 350 * Note: an ir_variable that represents a named interface block uses 351 * ir_var_declared_normally. 352 */ 353 ir_var_declared_normally = 0, 354 355 /** 356 * Variable was explicitly declared (or re-declared) in an unnamed 357 * interface block. 358 */ 359 ir_var_declared_in_block, 360 361 /** 362 * Variable is an implicitly declared built-in that has not been explicitly 363 * re-declared by the shader. 364 */ 365 ir_var_declared_implicitly, 366 367 /** 368 * Variable is implicitly generated by the compiler and should not be 369 * visible via the API. 370 */ 371 ir_var_hidden, 372 }; 373 374 /** 375 * \brief Layout qualifiers for gl_FragDepth. 376 * 377 * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared 378 * with a layout qualifier. 379 */ 380 enum ir_depth_layout { 381 ir_depth_layout_none, /**< No depth layout is specified. */ 382 ir_depth_layout_any, 383 ir_depth_layout_greater, 384 ir_depth_layout_less, 385 ir_depth_layout_unchanged 386 }; 387 388 /** 389 * \brief Convert depth layout qualifier to string. 390 */ 391 const char* 392 depth_layout_string(ir_depth_layout layout); 393 394 /** 395 * Description of built-in state associated with a uniform 396 * 397 * \sa ir_variable::state_slots 398 */ 399 struct ir_state_slot { 400 int tokens[5]; 401 int swizzle; 402 }; 403 404 405 /** 406 * Get the string value for an interpolation qualifier 407 * 408 * \return The string that would be used in a shader to specify \c 409 * mode will be returned. 410 * 411 * This function is used to generate error messages of the form "shader 412 * uses %s interpolation qualifier", so in the case where there is no 413 * interpolation qualifier, it returns "no". 414 * 415 * This function should only be used on a shader input or output variable. 416 */ 417 const char *interpolation_string(unsigned interpolation); 418 419 420 class ir_variable : public ir_instruction { 421 public: 422 ir_variable(const struct glsl_type *, const char *, ir_variable_mode); 423 424 virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; 425 426 virtual void accept(ir_visitor *v) 427 { 428 v->visit(this); 429 } 430 431 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 432 433 434 /** 435 * Determine whether or not a variable is part of a uniform or 436 * shader storage block. 437 */ 438 inline bool is_in_buffer_block() const 439 { 440 return (this->data.mode == ir_var_uniform || 441 this->data.mode == ir_var_shader_storage) && 442 this->interface_type != NULL; 443 } 444 445 /** 446 * Determine whether or not a variable is part of a shader storage block. 447 */ 448 inline bool is_in_shader_storage_block() const 449 { 450 return this->data.mode == ir_var_shader_storage && 451 this->interface_type != NULL; 452 } 453 454 /** 455 * Determine whether or not a variable is the declaration of an interface 456 * block 457 * 458 * For the first declaration below, there will be an \c ir_variable named 459 * "instance" whose type and whose instance_type will be the same 460 * \cglsl_type. For the second declaration, there will be an \c ir_variable 461 * named "f" whose type is float and whose instance_type is B2. 462 * 463 * "instance" is an interface instance variable, but "f" is not. 464 * 465 * uniform B1 { 466 * float f; 467 * } instance; 468 * 469 * uniform B2 { 470 * float f; 471 * }; 472 */ 473 inline bool is_interface_instance() const 474 { 475 return this->type->without_array() == this->interface_type; 476 } 477 478 /** 479 * Set this->interface_type on a newly created variable. 480 */ 481 void init_interface_type(const struct glsl_type *type) 482 { 483 assert(this->interface_type == NULL); 484 this->interface_type = type; 485 if (this->is_interface_instance()) { 486 this->u.max_ifc_array_access = 487 ralloc_array(this, int, type->length); 488 for (unsigned i = 0; i < type->length; i++) { 489 this->u.max_ifc_array_access[i] = -1; 490 } 491 } 492 } 493 494 /** 495 * Change this->interface_type on a variable that previously had a 496 * different, but compatible, interface_type. This is used during linking 497 * to set the size of arrays in interface blocks. 498 */ 499 void change_interface_type(const struct glsl_type *type) 500 { 501 if (this->u.max_ifc_array_access != NULL) { 502 /* max_ifc_array_access has already been allocated, so make sure the 503 * new interface has the same number of fields as the old one. 504 */ 505 assert(this->interface_type->length == type->length); 506 } 507 this->interface_type = type; 508 } 509 510 /** 511 * Change this->interface_type on a variable that previously had a 512 * different, and incompatible, interface_type. This is used during 513 * compilation to handle redeclaration of the built-in gl_PerVertex 514 * interface block. 515 */ 516 void reinit_interface_type(const struct glsl_type *type) 517 { 518 if (this->u.max_ifc_array_access != NULL) { 519 #ifndef NDEBUG 520 /* Redeclaring gl_PerVertex is only allowed if none of the built-ins 521 * it defines have been accessed yet; so it's safe to throw away the 522 * old max_ifc_array_access pointer, since all of its values are 523 * zero. 524 */ 525 for (unsigned i = 0; i < this->interface_type->length; i++) 526 assert(this->u.max_ifc_array_access[i] == -1); 527 #endif 528 ralloc_free(this->u.max_ifc_array_access); 529 this->u.max_ifc_array_access = NULL; 530 } 531 this->interface_type = NULL; 532 init_interface_type(type); 533 } 534 535 const glsl_type *get_interface_type() const 536 { 537 return this->interface_type; 538 } 539 540 enum glsl_interface_packing get_interface_type_packing() const 541 { 542 return this->interface_type->get_interface_packing(); 543 } 544 /** 545 * Get the max_ifc_array_access pointer 546 * 547 * A "set" function is not needed because the array is dynmically allocated 548 * as necessary. 549 */ 550 inline int *get_max_ifc_array_access() 551 { 552 assert(this->data._num_state_slots == 0); 553 return this->u.max_ifc_array_access; 554 } 555 556 inline unsigned get_num_state_slots() const 557 { 558 assert(!this->is_interface_instance() 559 || this->data._num_state_slots == 0); 560 return this->data._num_state_slots; 561 } 562 563 inline void set_num_state_slots(unsigned n) 564 { 565 assert(!this->is_interface_instance() 566 || n == 0); 567 this->data._num_state_slots = n; 568 } 569 570 inline ir_state_slot *get_state_slots() 571 { 572 return this->is_interface_instance() ? NULL : this->u.state_slots; 573 } 574 575 inline const ir_state_slot *get_state_slots() const 576 { 577 return this->is_interface_instance() ? NULL : this->u.state_slots; 578 } 579 580 inline ir_state_slot *allocate_state_slots(unsigned n) 581 { 582 assert(!this->is_interface_instance()); 583 584 this->u.state_slots = ralloc_array(this, ir_state_slot, n); 585 this->data._num_state_slots = 0; 586 587 if (this->u.state_slots != NULL) 588 this->data._num_state_slots = n; 589 590 return this->u.state_slots; 591 } 592 593 inline bool is_interpolation_flat() const 594 { 595 return this->data.interpolation == INTERP_MODE_FLAT || 596 this->type->contains_integer() || 597 this->type->contains_double(); 598 } 599 600 inline bool is_name_ralloced() const 601 { 602 return this->name != ir_variable::tmp_name && 603 this->name != this->name_storage; 604 } 605 606 /** 607 * Enable emitting extension warnings for this variable 608 */ 609 void enable_extension_warning(const char *extension); 610 611 /** 612 * Get the extension warning string for this variable 613 * 614 * If warnings are not enabled, \c NULL is returned. 615 */ 616 const char *get_extension_warning() const; 617 618 /** 619 * Declared type of the variable 620 */ 621 const struct glsl_type *type; 622 623 /** 624 * Declared name of the variable 625 */ 626 const char *name; 627 628 private: 629 /** 630 * If the name length fits into name_storage, it's used, otherwise 631 * the name is ralloc'd. shader-db mining showed that 70% of variables 632 * fit here. This is a win over ralloc where only ralloc_header has 633 * 20 bytes on 64-bit (28 bytes with DEBUG), and we can also skip malloc. 634 */ 635 char name_storage[16]; 636 637 public: 638 struct ir_variable_data { 639 640 /** 641 * Is the variable read-only? 642 * 643 * This is set for variables declared as \c const, shader inputs, 644 * and uniforms. 645 */ 646 unsigned read_only:1; 647 unsigned centroid:1; 648 unsigned sample:1; 649 unsigned patch:1; 650 unsigned invariant:1; 651 unsigned precise:1; 652 653 /** 654 * Has this variable been used for reading or writing? 655 * 656 * Several GLSL semantic checks require knowledge of whether or not a 657 * variable has been used. For example, it is an error to redeclare a 658 * variable as invariant after it has been used. 659 * 660 * This is only maintained in the ast_to_hir.cpp path, not in 661 * Mesa's fixed function or ARB program paths. 662 */ 663 unsigned used:1; 664 665 /** 666 * Has this variable been statically assigned? 667 * 668 * This answers whether the variable was assigned in any path of 669 * the shader during ast_to_hir. This doesn't answer whether it is 670 * still written after dead code removal, nor is it maintained in 671 * non-ast_to_hir.cpp (GLSL parsing) paths. 672 */ 673 unsigned assigned:1; 674 675 /** 676 * When separate shader programs are enabled, only input/outputs between 677 * the stages of a multi-stage separate program can be safely removed 678 * from the shader interface. Other input/outputs must remains active. 679 */ 680 unsigned always_active_io:1; 681 682 /** 683 * Enum indicating how the variable was declared. See 684 * ir_var_declaration_type. 685 * 686 * This is used to detect certain kinds of illegal variable redeclarations. 687 */ 688 unsigned how_declared:2; 689 690 /** 691 * Storage class of the variable. 692 * 693 * \sa ir_variable_mode 694 */ 695 unsigned mode:4; 696 697 /** 698 * Interpolation mode for shader inputs / outputs 699 * 700 * \sa glsl_interp_mode 701 */ 702 unsigned interpolation:2; 703 704 /** 705 * \name ARB_fragment_coord_conventions 706 * @{ 707 */ 708 unsigned origin_upper_left:1; 709 unsigned pixel_center_integer:1; 710 /*@}*/ 711 712 /** 713 * Was the location explicitly set in the shader? 714 * 715 * If the location is explicitly set in the shader, it \b cannot be changed 716 * by the linker or by the API (e.g., calls to \c glBindAttribLocation have 717 * no effect). 718 */ 719 unsigned explicit_location:1; 720 unsigned explicit_index:1; 721 722 /** 723 * Was an initial binding explicitly set in the shader? 724 * 725 * If so, constant_value contains an integer ir_constant representing the 726 * initial binding point. 727 */ 728 unsigned explicit_binding:1; 729 730 /** 731 * Was an initial component explicitly set in the shader? 732 */ 733 unsigned explicit_component:1; 734 735 /** 736 * Does this variable have an initializer? 737 * 738 * This is used by the linker to cross-validiate initializers of global 739 * variables. 740 */ 741 unsigned has_initializer:1; 742 743 /** 744 * Is this variable a generic output or input that has not yet been matched 745 * up to a variable in another stage of the pipeline? 746 * 747 * This is used by the linker as scratch storage while assigning locations 748 * to generic inputs and outputs. 749 */ 750 unsigned is_unmatched_generic_inout:1; 751 752 /** 753 * Is this varying used only by transform feedback? 754 * 755 * This is used by the linker to decide if its safe to pack the varying. 756 */ 757 unsigned is_xfb_only:1; 758 759 /** 760 * Was a transfor feedback buffer set in the shader? 761 */ 762 unsigned explicit_xfb_buffer:1; 763 764 /** 765 * Was a transfor feedback offset set in the shader? 766 */ 767 unsigned explicit_xfb_offset:1; 768 769 /** 770 * Was a transfor feedback stride set in the shader? 771 */ 772 unsigned explicit_xfb_stride:1; 773 774 /** 775 * If non-zero, then this variable may be packed along with other variables 776 * into a single varying slot, so this offset should be applied when 777 * accessing components. For example, an offset of 1 means that the x 778 * component of this variable is actually stored in component y of the 779 * location specified by \c location. 780 */ 781 unsigned location_frac:2; 782 783 /** 784 * Layout of the matrix. Uses glsl_matrix_layout values. 785 */ 786 unsigned matrix_layout:2; 787 788 /** 789 * Non-zero if this variable was created by lowering a named interface 790 * block. 791 */ 792 unsigned from_named_ifc_block:1; 793 794 /** 795 * Non-zero if the variable must be a shader input. This is useful for 796 * constraints on function parameters. 797 */ 798 unsigned must_be_shader_input:1; 799 800 /** 801 * Output index for dual source blending. 802 * 803 * \note 804 * The GLSL spec only allows the values 0 or 1 for the index in \b dual 805 * source blending. 806 */ 807 unsigned index:1; 808 809 /** 810 * Precision qualifier. 811 * 812 * In desktop GLSL we do not care about precision qualifiers at all, in 813 * fact, the spec says that precision qualifiers are ignored. 814 * 815 * To make things easy, we make it so that this field is always 816 * GLSL_PRECISION_NONE on desktop shaders. This way all the variables 817 * have the same precision value and the checks we add in the compiler 818 * for this field will never break a desktop shader compile. 819 */ 820 unsigned precision:2; 821 822 /** 823 * \brief Layout qualifier for gl_FragDepth. 824 * 825 * This is not equal to \c ir_depth_layout_none if and only if this 826 * variable is \c gl_FragDepth and a layout qualifier is specified. 827 */ 828 ir_depth_layout depth_layout:3; 829 830 /** 831 * ARB_shader_image_load_store qualifiers. 832 */ 833 unsigned image_read_only:1; /**< "readonly" qualifier. */ 834 unsigned image_write_only:1; /**< "writeonly" qualifier. */ 835 unsigned image_coherent:1; 836 unsigned image_volatile:1; 837 unsigned image_restrict:1; 838 839 /** 840 * ARB_shader_storage_buffer_object 841 */ 842 unsigned from_ssbo_unsized_array:1; /**< unsized array buffer variable. */ 843 844 unsigned implicit_sized_array:1; 845 846 /** 847 * Is this a non-patch TCS output / TES input array that was implicitly 848 * sized to gl_MaxPatchVertices? 849 */ 850 unsigned tess_varying_implicit_sized_array:1; 851 852 /** 853 * Whether this is a fragment shader output implicitly initialized with 854 * the previous contents of the specified render target at the 855 * framebuffer location corresponding to this shader invocation. 856 */ 857 unsigned fb_fetch_output:1; 858 859 /** 860 * Emit a warning if this variable is accessed. 861 */ 862 private: 863 uint8_t warn_extension_index; 864 865 public: 866 /** Image internal format if specified explicitly, otherwise GL_NONE. */ 867 uint16_t image_format; 868 869 private: 870 /** 871 * Number of state slots used 872 * 873 * \note 874 * This could be stored in as few as 7-bits, if necessary. If it is made 875 * smaller, add an assertion to \c ir_variable::allocate_state_slots to 876 * be safe. 877 */ 878 uint16_t _num_state_slots; 879 880 public: 881 /** 882 * Initial binding point for a sampler, atomic, or UBO. 883 * 884 * For array types, this represents the binding point for the first element. 885 */ 886 int16_t binding; 887 888 /** 889 * Storage location of the base of this variable 890 * 891 * The precise meaning of this field depends on the nature of the variable. 892 * 893 * - Vertex shader input: one of the values from \c gl_vert_attrib. 894 * - Vertex shader output: one of the values from \c gl_varying_slot. 895 * - Geometry shader input: one of the values from \c gl_varying_slot. 896 * - Geometry shader output: one of the values from \c gl_varying_slot. 897 * - Fragment shader input: one of the values from \c gl_varying_slot. 898 * - Fragment shader output: one of the values from \c gl_frag_result. 899 * - Uniforms: Per-stage uniform slot number for default uniform block. 900 * - Uniforms: Index within the uniform block definition for UBO members. 901 * - Non-UBO Uniforms: explicit location until linking then reused to 902 * store uniform slot number. 903 * - Other: This field is not currently used. 904 * 905 * If the variable is a uniform, shader input, or shader output, and the 906 * slot has not been assigned, the value will be -1. 907 */ 908 int location; 909 910 /** 911 * for glsl->tgsi/mesa IR we need to store the index into the 912 * parameters for uniforms, initially the code overloaded location 913 * but this causes problems with indirect samplers and AoA. 914 * This is assigned in _mesa_generate_parameters_list_for_uniforms. 915 */ 916 int param_index; 917 918 /** 919 * Vertex stream output identifier. 920 * 921 * For packed outputs, bit 31 is set and bits [2*i+1,2*i] indicate the 922 * stream of the i-th component. 923 */ 924 unsigned stream; 925 926 /** 927 * Atomic, transform feedback or block member offset. 928 */ 929 unsigned offset; 930 931 /** 932 * Highest element accessed with a constant expression array index 933 * 934 * Not used for non-array variables. -1 is never accessed. 935 */ 936 int max_array_access; 937 938 /** 939 * Transform feedback buffer. 940 */ 941 unsigned xfb_buffer; 942 943 /** 944 * Transform feedback stride. 945 */ 946 unsigned xfb_stride; 947 948 /** 949 * Allow (only) ir_variable direct access private members. 950 */ 951 friend class ir_variable; 952 } data; 953 954 /** 955 * Value assigned in the initializer of a variable declared "const" 956 */ 957 ir_constant *constant_value; 958 959 /** 960 * Constant expression assigned in the initializer of the variable 961 * 962 * \warning 963 * This field and \c ::constant_value are distinct. Even if the two fields 964 * refer to constants with the same value, they must point to separate 965 * objects. 966 */ 967 ir_constant *constant_initializer; 968 969 private: 970 static const char *const warn_extension_table[]; 971 972 union { 973 /** 974 * For variables which satisfy the is_interface_instance() predicate, 975 * this points to an array of integers such that if the ith member of 976 * the interface block is an array, max_ifc_array_access[i] is the 977 * maximum array element of that member that has been accessed. If the 978 * ith member of the interface block is not an array, 979 * max_ifc_array_access[i] is unused. 980 * 981 * For variables whose type is not an interface block, this pointer is 982 * NULL. 983 */ 984 int *max_ifc_array_access; 985 986 /** 987 * Built-in state that backs this uniform 988 * 989 * Once set at variable creation, \c state_slots must remain invariant. 990 * 991 * If the variable is not a uniform, \c _num_state_slots will be zero 992 * and \c state_slots will be \c NULL. 993 */ 994 ir_state_slot *state_slots; 995 } u; 996 997 /** 998 * For variables that are in an interface block or are an instance of an 999 * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block. 1000 * 1001 * \sa ir_variable::location 1002 */ 1003 const glsl_type *interface_type; 1004 1005 /** 1006 * Name used for anonymous compiler temporaries 1007 */ 1008 static const char tmp_name[]; 1009 1010 public: 1011 /** 1012 * Should the construct keep names for ir_var_temporary variables? 1013 * 1014 * When this global is false, names passed to the constructor for 1015 * \c ir_var_temporary variables will be dropped. Instead, the variable will 1016 * be named "compiler_temp". This name will be in static storage. 1017 * 1018 * \warning 1019 * \b NEVER change the mode of an \c ir_var_temporary. 1020 * 1021 * \warning 1022 * This variable is \b not thread-safe. It is global, \b not 1023 * per-context. It begins life false. A context can, at some point, make 1024 * it true. From that point on, it will be true forever. This should be 1025 * okay since it will only be set true while debugging. 1026 */ 1027 static bool temporaries_allocate_names; 1028 }; 1029 1030 /** 1031 * A function that returns whether a built-in function is available in the 1032 * current shading language (based on version, ES or desktop, and extensions). 1033 */ 1034 typedef bool (*builtin_available_predicate)(const _mesa_glsl_parse_state *); 1035 1036 #define MAKE_INTRINSIC_FOR_TYPE(op, t) \ 1037 ir_intrinsic_generic_ ## op - ir_intrinsic_generic_load + ir_intrinsic_ ## t ## _ ## load 1038 1039 #define MAP_INTRINSIC_TO_TYPE(i, t) \ 1040 ir_intrinsic_id(int(i) - int(ir_intrinsic_generic_load) + int(ir_intrinsic_ ## t ## _ ## load)) 1041 1042 enum ir_intrinsic_id { 1043 ir_intrinsic_invalid = 0, 1044 1045 /** 1046 * \name Generic intrinsics 1047 * 1048 * Each of these intrinsics has a specific version for shared variables and 1049 * SSBOs. 1050 */ 1051 /*@{*/ 1052 ir_intrinsic_generic_load, 1053 ir_intrinsic_generic_store, 1054 ir_intrinsic_generic_atomic_add, 1055 ir_intrinsic_generic_atomic_and, 1056 ir_intrinsic_generic_atomic_or, 1057 ir_intrinsic_generic_atomic_xor, 1058 ir_intrinsic_generic_atomic_min, 1059 ir_intrinsic_generic_atomic_max, 1060 ir_intrinsic_generic_atomic_exchange, 1061 ir_intrinsic_generic_atomic_comp_swap, 1062 /*@}*/ 1063 1064 ir_intrinsic_atomic_counter_read, 1065 ir_intrinsic_atomic_counter_increment, 1066 ir_intrinsic_atomic_counter_predecrement, 1067 ir_intrinsic_atomic_counter_add, 1068 ir_intrinsic_atomic_counter_and, 1069 ir_intrinsic_atomic_counter_or, 1070 ir_intrinsic_atomic_counter_xor, 1071 ir_intrinsic_atomic_counter_min, 1072 ir_intrinsic_atomic_counter_max, 1073 ir_intrinsic_atomic_counter_exchange, 1074 ir_intrinsic_atomic_counter_comp_swap, 1075 1076 ir_intrinsic_image_load, 1077 ir_intrinsic_image_store, 1078 ir_intrinsic_image_atomic_add, 1079 ir_intrinsic_image_atomic_and, 1080 ir_intrinsic_image_atomic_or, 1081 ir_intrinsic_image_atomic_xor, 1082 ir_intrinsic_image_atomic_min, 1083 ir_intrinsic_image_atomic_max, 1084 ir_intrinsic_image_atomic_exchange, 1085 ir_intrinsic_image_atomic_comp_swap, 1086 ir_intrinsic_image_size, 1087 ir_intrinsic_image_samples, 1088 1089 ir_intrinsic_ssbo_load, 1090 ir_intrinsic_ssbo_store = MAKE_INTRINSIC_FOR_TYPE(store, ssbo), 1091 ir_intrinsic_ssbo_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, ssbo), 1092 ir_intrinsic_ssbo_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, ssbo), 1093 ir_intrinsic_ssbo_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, ssbo), 1094 ir_intrinsic_ssbo_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, ssbo), 1095 ir_intrinsic_ssbo_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, ssbo), 1096 ir_intrinsic_ssbo_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, ssbo), 1097 ir_intrinsic_ssbo_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, ssbo), 1098 ir_intrinsic_ssbo_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, ssbo), 1099 1100 ir_intrinsic_memory_barrier, 1101 ir_intrinsic_shader_clock, 1102 ir_intrinsic_group_memory_barrier, 1103 ir_intrinsic_memory_barrier_atomic_counter, 1104 ir_intrinsic_memory_barrier_buffer, 1105 ir_intrinsic_memory_barrier_image, 1106 ir_intrinsic_memory_barrier_shared, 1107 1108 ir_intrinsic_shared_load, 1109 ir_intrinsic_shared_store = MAKE_INTRINSIC_FOR_TYPE(store, shared), 1110 ir_intrinsic_shared_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, shared), 1111 ir_intrinsic_shared_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, shared), 1112 ir_intrinsic_shared_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, shared), 1113 ir_intrinsic_shared_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, shared), 1114 ir_intrinsic_shared_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, shared), 1115 ir_intrinsic_shared_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, shared), 1116 ir_intrinsic_shared_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, shared), 1117 ir_intrinsic_shared_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, shared), 1118 }; 1119 1120 /*@{*/ 1121 /** 1122 * The representation of a function instance; may be the full definition or 1123 * simply a prototype. 1124 */ 1125 class ir_function_signature : public ir_instruction { 1126 /* An ir_function_signature will be part of the list of signatures in 1127 * an ir_function. 1128 */ 1129 public: 1130 ir_function_signature(const glsl_type *return_type, 1131 builtin_available_predicate builtin_avail = NULL); 1132 1133 virtual ir_function_signature *clone(void *mem_ctx, 1134 struct hash_table *ht) const; 1135 ir_function_signature *clone_prototype(void *mem_ctx, 1136 struct hash_table *ht) const; 1137 1138 virtual void accept(ir_visitor *v) 1139 { 1140 v->visit(this); 1141 } 1142 1143 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1144 1145 /** 1146 * Attempt to evaluate this function as a constant expression, 1147 * given a list of the actual parameters and the variable context. 1148 * Returns NULL for non-built-ins. 1149 */ 1150 ir_constant *constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context); 1151 1152 /** 1153 * Get the name of the function for which this is a signature 1154 */ 1155 const char *function_name() const; 1156 1157 /** 1158 * Get a handle to the function for which this is a signature 1159 * 1160 * There is no setter function, this function returns a \c const pointer, 1161 * and \c ir_function_signature::_function is private for a reason. The 1162 * only way to make a connection between a function and function signature 1163 * is via \c ir_function::add_signature. This helps ensure that certain 1164 * invariants (i.e., a function signature is in the list of signatures for 1165 * its \c _function) are met. 1166 * 1167 * \sa ir_function::add_signature 1168 */ 1169 inline const class ir_function *function() const 1170 { 1171 return this->_function; 1172 } 1173 1174 /** 1175 * Check whether the qualifiers match between this signature's parameters 1176 * and the supplied parameter list. If not, returns the name of the first 1177 * parameter with mismatched qualifiers (for use in error messages). 1178 */ 1179 const char *qualifiers_match(exec_list *params); 1180 1181 /** 1182 * Replace the current parameter list with the given one. This is useful 1183 * if the current information came from a prototype, and either has invalid 1184 * or missing parameter names. 1185 */ 1186 void replace_parameters(exec_list *new_params); 1187 1188 /** 1189 * Function return type. 1190 * 1191 * \note This discards the optional precision qualifier. 1192 */ 1193 const struct glsl_type *return_type; 1194 1195 /** 1196 * List of ir_variable of function parameters. 1197 * 1198 * This represents the storage. The paramaters passed in a particular 1199 * call will be in ir_call::actual_paramaters. 1200 */ 1201 struct exec_list parameters; 1202 1203 /** Whether or not this function has a body (which may be empty). */ 1204 unsigned is_defined:1; 1205 1206 /** Whether or not this function signature is a built-in. */ 1207 bool is_builtin() const; 1208 1209 /** 1210 * Whether or not this function is an intrinsic to be implemented 1211 * by the driver. 1212 */ 1213 inline bool is_intrinsic() const 1214 { 1215 return intrinsic_id != ir_intrinsic_invalid; 1216 } 1217 1218 /** Indentifier for this intrinsic. */ 1219 enum ir_intrinsic_id intrinsic_id; 1220 1221 /** Whether or not a built-in is available for this shader. */ 1222 bool is_builtin_available(const _mesa_glsl_parse_state *state) const; 1223 1224 /** Body of instructions in the function. */ 1225 struct exec_list body; 1226 1227 private: 1228 /** 1229 * A function pointer to a predicate that answers whether a built-in 1230 * function is available in the current shader. NULL if not a built-in. 1231 */ 1232 builtin_available_predicate builtin_avail; 1233 1234 /** Function of which this signature is one overload. */ 1235 class ir_function *_function; 1236 1237 /** Function signature of which this one is a prototype clone */ 1238 const ir_function_signature *origin; 1239 1240 friend class ir_function; 1241 1242 /** 1243 * Helper function to run a list of instructions for constant 1244 * expression evaluation. 1245 * 1246 * The hash table represents the values of the visible variables. 1247 * There are no scoping issues because the table is indexed on 1248 * ir_variable pointers, not variable names. 1249 * 1250 * Returns false if the expression is not constant, true otherwise, 1251 * and the value in *result if result is non-NULL. 1252 */ 1253 bool constant_expression_evaluate_expression_list(const struct exec_list &body, 1254 struct hash_table *variable_context, 1255 ir_constant **result); 1256 }; 1257 1258 1259 /** 1260 * Header for tracking multiple overloaded functions with the same name. 1261 * Contains a list of ir_function_signatures representing each of the 1262 * actual functions. 1263 */ 1264 class ir_function : public ir_instruction { 1265 public: 1266 ir_function(const char *name); 1267 1268 virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 1269 1270 virtual void accept(ir_visitor *v) 1271 { 1272 v->visit(this); 1273 } 1274 1275 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1276 1277 void add_signature(ir_function_signature *sig) 1278 { 1279 sig->_function = this; 1280 this->signatures.push_tail(sig); 1281 } 1282 1283 /** 1284 * Find a signature that matches a set of actual parameters, taking implicit 1285 * conversions into account. Also flags whether the match was exact. 1286 */ 1287 ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, 1288 const exec_list *actual_param, 1289 bool allow_builtins, 1290 bool *match_is_exact); 1291 1292 /** 1293 * Find a signature that matches a set of actual parameters, taking implicit 1294 * conversions into account. 1295 */ 1296 ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, 1297 const exec_list *actual_param, 1298 bool allow_builtins); 1299 1300 /** 1301 * Find a signature that exactly matches a set of actual parameters without 1302 * any implicit type conversions. 1303 */ 1304 ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state *state, 1305 const exec_list *actual_ps); 1306 1307 /** 1308 * Name of the function. 1309 */ 1310 const char *name; 1311 1312 /** Whether or not this function has a signature that isn't a built-in. */ 1313 bool has_user_signature(); 1314 1315 /** 1316 * List of ir_function_signature for each overloaded function with this name. 1317 */ 1318 struct exec_list signatures; 1319 1320 /** 1321 * is this function a subroutine type declaration 1322 * e.g. subroutine void type1(float arg1); 1323 */ 1324 bool is_subroutine; 1325 1326 /** 1327 * is this function associated to a subroutine type 1328 * e.g. subroutine (type1, type2) function_name { function_body }; 1329 * would have num_subroutine_types 2, 1330 * and pointers to the type1 and type2 types. 1331 */ 1332 int num_subroutine_types; 1333 const struct glsl_type **subroutine_types; 1334 1335 int subroutine_index; 1336 }; 1337 1338 inline const char *ir_function_signature::function_name() const 1339 { 1340 return this->_function->name; 1341 } 1342 /*@}*/ 1343 1344 1345 /** 1346 * IR instruction representing high-level if-statements 1347 */ 1348 class ir_if : public ir_instruction { 1349 public: 1350 ir_if(ir_rvalue *condition) 1351 : ir_instruction(ir_type_if), condition(condition) 1352 { 1353 } 1354 1355 virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 1356 1357 virtual void accept(ir_visitor *v) 1358 { 1359 v->visit(this); 1360 } 1361 1362 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1363 1364 ir_rvalue *condition; 1365 /** List of ir_instruction for the body of the then branch */ 1366 exec_list then_instructions; 1367 /** List of ir_instruction for the body of the else branch */ 1368 exec_list else_instructions; 1369 }; 1370 1371 1372 /** 1373 * IR instruction representing a high-level loop structure. 1374 */ 1375 class ir_loop : public ir_instruction { 1376 public: 1377 ir_loop(); 1378 1379 virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 1380 1381 virtual void accept(ir_visitor *v) 1382 { 1383 v->visit(this); 1384 } 1385 1386 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1387 1388 /** List of ir_instruction that make up the body of the loop. */ 1389 exec_list body_instructions; 1390 }; 1391 1392 1393 class ir_assignment : public ir_instruction { 1394 public: 1395 ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL); 1396 1397 /** 1398 * Construct an assignment with an explicit write mask 1399 * 1400 * \note 1401 * Since a write mask is supplied, the LHS must already be a bare 1402 * \c ir_dereference. The cannot be any swizzles in the LHS. 1403 */ 1404 ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 1405 unsigned write_mask); 1406 1407 virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 1408 1409 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1410 1411 virtual void accept(ir_visitor *v) 1412 { 1413 v->visit(this); 1414 } 1415 1416 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1417 1418 /** 1419 * Get a whole variable written by an assignment 1420 * 1421 * If the LHS of the assignment writes a whole variable, the variable is 1422 * returned. Otherwise \c NULL is returned. Examples of whole-variable 1423 * assignment are: 1424 * 1425 * - Assigning to a scalar 1426 * - Assigning to all components of a vector 1427 * - Whole array (or matrix) assignment 1428 * - Whole structure assignment 1429 */ 1430 ir_variable *whole_variable_written(); 1431 1432 /** 1433 * Set the LHS of an assignment 1434 */ 1435 void set_lhs(ir_rvalue *lhs); 1436 1437 /** 1438 * Left-hand side of the assignment. 1439 * 1440 * This should be treated as read only. If you need to set the LHS of an 1441 * assignment, use \c ir_assignment::set_lhs. 1442 */ 1443 ir_dereference *lhs; 1444 1445 /** 1446 * Value being assigned 1447 */ 1448 ir_rvalue *rhs; 1449 1450 /** 1451 * Optional condition for the assignment. 1452 */ 1453 ir_rvalue *condition; 1454 1455 1456 /** 1457 * Component mask written 1458 * 1459 * For non-vector types in the LHS, this field will be zero. For vector 1460 * types, a bit will be set for each component that is written. Note that 1461 * for \c vec2 and \c vec3 types only the lower bits will ever be set. 1462 * 1463 * A partially-set write mask means that each enabled channel gets 1464 * the value from a consecutive channel of the rhs. For example, 1465 * to write just .xyw of gl_FrontColor with color: 1466 * 1467 * (assign (constant bool (1)) (xyw) 1468 * (var_ref gl_FragColor) 1469 * (swiz xyw (var_ref color))) 1470 */ 1471 unsigned write_mask:4; 1472 }; 1473 1474 #include "ir_expression_operation.h" 1475 1476 extern const char *const ir_expression_operation_strings[ir_last_opcode + 1]; 1477 extern const char *const ir_expression_operation_enum_strings[ir_last_opcode + 1]; 1478 1479 class ir_expression : public ir_rvalue { 1480 public: 1481 ir_expression(int op, const struct glsl_type *type, 1482 ir_rvalue *op0, ir_rvalue *op1 = NULL, 1483 ir_rvalue *op2 = NULL, ir_rvalue *op3 = NULL); 1484 1485 /** 1486 * Constructor for unary operation expressions 1487 */ 1488 ir_expression(int op, ir_rvalue *); 1489 1490 /** 1491 * Constructor for binary operation expressions 1492 */ 1493 ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1); 1494 1495 /** 1496 * Constructor for ternary operation expressions 1497 */ 1498 ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2); 1499 1500 virtual bool equals(const ir_instruction *ir, 1501 enum ir_node_type ignore = ir_type_unset) const; 1502 1503 virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 1504 1505 /** 1506 * Attempt to constant-fold the expression 1507 * 1508 * The "variable_context" hash table links ir_variable * to ir_constant * 1509 * that represent the variables' values. \c NULL represents an empty 1510 * context. 1511 * 1512 * If the expression cannot be constant folded, this method will return 1513 * \c NULL. 1514 */ 1515 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1516 1517 /** 1518 * Determine the number of operands used by an expression 1519 */ 1520 static unsigned int get_num_operands(ir_expression_operation); 1521 1522 /** 1523 * Determine the number of operands used by an expression 1524 */ 1525 unsigned int get_num_operands() const 1526 { 1527 return (this->operation == ir_quadop_vector) 1528 ? this->type->vector_elements : get_num_operands(operation); 1529 } 1530 1531 /** 1532 * Return whether the expression operates on vectors horizontally. 1533 */ 1534 bool is_horizontal() const 1535 { 1536 return operation == ir_binop_all_equal || 1537 operation == ir_binop_any_nequal || 1538 operation == ir_binop_dot || 1539 operation == ir_binop_vector_extract || 1540 operation == ir_triop_vector_insert || 1541 operation == ir_binop_ubo_load || 1542 operation == ir_quadop_vector; 1543 } 1544 1545 /** 1546 * Do a reverse-lookup to translate the given string into an operator. 1547 */ 1548 static ir_expression_operation get_operator(const char *); 1549 1550 virtual void accept(ir_visitor *v) 1551 { 1552 v->visit(this); 1553 } 1554 1555 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1556 1557 virtual ir_variable *variable_referenced() const; 1558 1559 ir_expression_operation operation; 1560 ir_rvalue *operands[4]; 1561 }; 1562 1563 1564 /** 1565 * HIR instruction representing a high-level function call, containing a list 1566 * of parameters and returning a value in the supplied temporary. 1567 */ 1568 class ir_call : public ir_instruction { 1569 public: 1570 ir_call(ir_function_signature *callee, 1571 ir_dereference_variable *return_deref, 1572 exec_list *actual_parameters) 1573 : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(NULL), array_idx(NULL) 1574 { 1575 assert(callee->return_type != NULL); 1576 actual_parameters->move_nodes_to(& this->actual_parameters); 1577 this->use_builtin = callee->is_builtin(); 1578 } 1579 1580 ir_call(ir_function_signature *callee, 1581 ir_dereference_variable *return_deref, 1582 exec_list *actual_parameters, 1583 ir_variable *var, ir_rvalue *array_idx) 1584 : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(var), array_idx(array_idx) 1585 { 1586 assert(callee->return_type != NULL); 1587 actual_parameters->move_nodes_to(& this->actual_parameters); 1588 this->use_builtin = callee->is_builtin(); 1589 } 1590 1591 virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 1592 1593 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1594 1595 virtual void accept(ir_visitor *v) 1596 { 1597 v->visit(this); 1598 } 1599 1600 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1601 1602 /** 1603 * Get the name of the function being called. 1604 */ 1605 const char *callee_name() const 1606 { 1607 return callee->function_name(); 1608 } 1609 1610 /** 1611 * Generates an inline version of the function before @ir, 1612 * storing the return value in return_deref. 1613 */ 1614 void generate_inline(ir_instruction *ir); 1615 1616 /** 1617 * Storage for the function's return value. 1618 * This must be NULL if the return type is void. 1619 */ 1620 ir_dereference_variable *return_deref; 1621 1622 /** 1623 * The specific function signature being called. 1624 */ 1625 ir_function_signature *callee; 1626 1627 /* List of ir_rvalue of paramaters passed in this call. */ 1628 exec_list actual_parameters; 1629 1630 /** Should this call only bind to a built-in function? */ 1631 bool use_builtin; 1632 1633 /* 1634 * ARB_shader_subroutine support - 1635 * the subroutine uniform variable and array index 1636 * rvalue to be used in the lowering pass later. 1637 */ 1638 ir_variable *sub_var; 1639 ir_rvalue *array_idx; 1640 }; 1641 1642 1643 /** 1644 * \name Jump-like IR instructions. 1645 * 1646 * These include \c break, \c continue, \c return, and \c discard. 1647 */ 1648 /*@{*/ 1649 class ir_jump : public ir_instruction { 1650 protected: 1651 ir_jump(enum ir_node_type t) 1652 : ir_instruction(t) 1653 { 1654 } 1655 }; 1656 1657 class ir_return : public ir_jump { 1658 public: 1659 ir_return() 1660 : ir_jump(ir_type_return), value(NULL) 1661 { 1662 } 1663 1664 ir_return(ir_rvalue *value) 1665 : ir_jump(ir_type_return), value(value) 1666 { 1667 } 1668 1669 virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 1670 1671 ir_rvalue *get_value() const 1672 { 1673 return value; 1674 } 1675 1676 virtual void accept(ir_visitor *v) 1677 { 1678 v->visit(this); 1679 } 1680 1681 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1682 1683 ir_rvalue *value; 1684 }; 1685 1686 1687 /** 1688 * Jump instructions used inside loops 1689 * 1690 * These include \c break and \c continue. The \c break within a loop is 1691 * different from the \c break within a switch-statement. 1692 * 1693 * \sa ir_switch_jump 1694 */ 1695 class ir_loop_jump : public ir_jump { 1696 public: 1697 enum jump_mode { 1698 jump_break, 1699 jump_continue 1700 }; 1701 1702 ir_loop_jump(jump_mode mode) 1703 : ir_jump(ir_type_loop_jump) 1704 { 1705 this->mode = mode; 1706 } 1707 1708 virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 1709 1710 virtual void accept(ir_visitor *v) 1711 { 1712 v->visit(this); 1713 } 1714 1715 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1716 1717 bool is_break() const 1718 { 1719 return mode == jump_break; 1720 } 1721 1722 bool is_continue() const 1723 { 1724 return mode == jump_continue; 1725 } 1726 1727 /** Mode selector for the jump instruction. */ 1728 enum jump_mode mode; 1729 }; 1730 1731 /** 1732 * IR instruction representing discard statements. 1733 */ 1734 class ir_discard : public ir_jump { 1735 public: 1736 ir_discard() 1737 : ir_jump(ir_type_discard) 1738 { 1739 this->condition = NULL; 1740 } 1741 1742 ir_discard(ir_rvalue *cond) 1743 : ir_jump(ir_type_discard) 1744 { 1745 this->condition = cond; 1746 } 1747 1748 virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 1749 1750 virtual void accept(ir_visitor *v) 1751 { 1752 v->visit(this); 1753 } 1754 1755 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1756 1757 ir_rvalue *condition; 1758 }; 1759 /*@}*/ 1760 1761 1762 /** 1763 * Texture sampling opcodes used in ir_texture 1764 */ 1765 enum ir_texture_opcode { 1766 ir_tex, /**< Regular texture look-up */ 1767 ir_txb, /**< Texture look-up with LOD bias */ 1768 ir_txl, /**< Texture look-up with explicit LOD */ 1769 ir_txd, /**< Texture look-up with partial derivatvies */ 1770 ir_txf, /**< Texel fetch with explicit LOD */ 1771 ir_txf_ms, /**< Multisample texture fetch */ 1772 ir_txs, /**< Texture size */ 1773 ir_lod, /**< Texture lod query */ 1774 ir_tg4, /**< Texture gather */ 1775 ir_query_levels, /**< Texture levels query */ 1776 ir_texture_samples, /**< Texture samples query */ 1777 ir_samples_identical, /**< Query whether all samples are definitely identical. */ 1778 }; 1779 1780 1781 /** 1782 * IR instruction to sample a texture 1783 * 1784 * The specific form of the IR instruction depends on the \c mode value 1785 * selected from \c ir_texture_opcodes. In the printed IR, these will 1786 * appear as: 1787 * 1788 * Texel offset (0 or an expression) 1789 * | Projection divisor 1790 * | | Shadow comparator 1791 * | | | 1792 * v v v 1793 * (tex <type> <sampler> <coordinate> 0 1 ( )) 1794 * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>) 1795 * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>) 1796 * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy)) 1797 * (txf <type> <sampler> <coordinate> 0 <lod>) 1798 * (txf_ms 1799 * <type> <sampler> <coordinate> <sample_index>) 1800 * (txs <type> <sampler> <lod>) 1801 * (lod <type> <sampler> <coordinate>) 1802 * (tg4 <type> <sampler> <coordinate> <offset> <component>) 1803 * (query_levels <type> <sampler>) 1804 * (samples_identical <sampler> <coordinate>) 1805 */ 1806 class ir_texture : public ir_rvalue { 1807 public: 1808 ir_texture(enum ir_texture_opcode op) 1809 : ir_rvalue(ir_type_texture), 1810 op(op), sampler(NULL), coordinate(NULL), projector(NULL), 1811 shadow_comparator(NULL), offset(NULL) 1812 { 1813 memset(&lod_info, 0, sizeof(lod_info)); 1814 } 1815 1816 virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 1817 1818 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1819 1820 virtual void accept(ir_visitor *v) 1821 { 1822 v->visit(this); 1823 } 1824 1825 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1826 1827 virtual bool equals(const ir_instruction *ir, 1828 enum ir_node_type ignore = ir_type_unset) const; 1829 1830 /** 1831 * Return a string representing the ir_texture_opcode. 1832 */ 1833 const char *opcode_string(); 1834 1835 /** Set the sampler and type. */ 1836 void set_sampler(ir_dereference *sampler, const glsl_type *type); 1837 1838 /** 1839 * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1840 */ 1841 static ir_texture_opcode get_opcode(const char *); 1842 1843 enum ir_texture_opcode op; 1844 1845 /** Sampler to use for the texture access. */ 1846 ir_dereference *sampler; 1847 1848 /** Texture coordinate to sample */ 1849 ir_rvalue *coordinate; 1850 1851 /** 1852 * Value used for projective divide. 1853 * 1854 * If there is no projective divide (the common case), this will be 1855 * \c NULL. Optimization passes should check for this to point to a constant 1856 * of 1.0 and replace that with \c NULL. 1857 */ 1858 ir_rvalue *projector; 1859 1860 /** 1861 * Coordinate used for comparison on shadow look-ups. 1862 * 1863 * If there is no shadow comparison, this will be \c NULL. For the 1864 * \c ir_txf opcode, this *must* be \c NULL. 1865 */ 1866 ir_rvalue *shadow_comparator; 1867 1868 /** Texel offset. */ 1869 ir_rvalue *offset; 1870 1871 union { 1872 ir_rvalue *lod; /**< Floating point LOD */ 1873 ir_rvalue *bias; /**< Floating point LOD bias */ 1874 ir_rvalue *sample_index; /**< MSAA sample index */ 1875 ir_rvalue *component; /**< Gather component selector */ 1876 struct { 1877 ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 1878 ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 1879 } grad; 1880 } lod_info; 1881 }; 1882 1883 1884 struct ir_swizzle_mask { 1885 unsigned x:2; 1886 unsigned y:2; 1887 unsigned z:2; 1888 unsigned w:2; 1889 1890 /** 1891 * Number of components in the swizzle. 1892 */ 1893 unsigned num_components:3; 1894 1895 /** 1896 * Does the swizzle contain duplicate components? 1897 * 1898 * L-value swizzles cannot contain duplicate components. 1899 */ 1900 unsigned has_duplicates:1; 1901 }; 1902 1903 1904 class ir_swizzle : public ir_rvalue { 1905 public: 1906 ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1907 unsigned count); 1908 1909 ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 1910 1911 ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1912 1913 virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 1914 1915 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1916 1917 /** 1918 * Construct an ir_swizzle from the textual representation. Can fail. 1919 */ 1920 static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1921 1922 virtual void accept(ir_visitor *v) 1923 { 1924 v->visit(this); 1925 } 1926 1927 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1928 1929 virtual bool equals(const ir_instruction *ir, 1930 enum ir_node_type ignore = ir_type_unset) const; 1931 1932 bool is_lvalue() const 1933 { 1934 return val->is_lvalue() && !mask.has_duplicates; 1935 } 1936 1937 /** 1938 * Get the variable that is ultimately referenced by an r-value 1939 */ 1940 virtual ir_variable *variable_referenced() const; 1941 1942 ir_rvalue *val; 1943 ir_swizzle_mask mask; 1944 1945 private: 1946 /** 1947 * Initialize the mask component of a swizzle 1948 * 1949 * This is used by the \c ir_swizzle constructors. 1950 */ 1951 void init_mask(const unsigned *components, unsigned count); 1952 }; 1953 1954 1955 class ir_dereference : public ir_rvalue { 1956 public: 1957 virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1958 1959 bool is_lvalue() const; 1960 1961 /** 1962 * Get the variable that is ultimately referenced by an r-value 1963 */ 1964 virtual ir_variable *variable_referenced() const = 0; 1965 1966 protected: 1967 ir_dereference(enum ir_node_type t) 1968 : ir_rvalue(t) 1969 { 1970 } 1971 }; 1972 1973 1974 class ir_dereference_variable : public ir_dereference { 1975 public: 1976 ir_dereference_variable(ir_variable *var); 1977 1978 virtual ir_dereference_variable *clone(void *mem_ctx, 1979 struct hash_table *) const; 1980 1981 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1982 1983 virtual bool equals(const ir_instruction *ir, 1984 enum ir_node_type ignore = ir_type_unset) const; 1985 1986 /** 1987 * Get the variable that is ultimately referenced by an r-value 1988 */ 1989 virtual ir_variable *variable_referenced() const 1990 { 1991 return this->var; 1992 } 1993 1994 virtual ir_variable *whole_variable_referenced() 1995 { 1996 /* ir_dereference_variable objects always dereference the entire 1997 * variable. However, if this dereference is dereferenced by anything 1998 * else, the complete deferefernce chain is not a whole-variable 1999 * dereference. This method should only be called on the top most 2000 * ir_rvalue in a dereference chain. 2001 */ 2002 return this->var; 2003 } 2004 2005 virtual void accept(ir_visitor *v) 2006 { 2007 v->visit(this); 2008 } 2009 2010 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2011 2012 /** 2013 * Object being dereferenced. 2014 */ 2015 ir_variable *var; 2016 }; 2017 2018 2019 class ir_dereference_array : public ir_dereference { 2020 public: 2021 ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 2022 2023 ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 2024 2025 virtual ir_dereference_array *clone(void *mem_ctx, 2026 struct hash_table *) const; 2027 2028 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 2029 2030 virtual bool equals(const ir_instruction *ir, 2031 enum ir_node_type ignore = ir_type_unset) const; 2032 2033 /** 2034 * Get the variable that is ultimately referenced by an r-value 2035 */ 2036 virtual ir_variable *variable_referenced() const 2037 { 2038 return this->array->variable_referenced(); 2039 } 2040 2041 virtual void accept(ir_visitor *v) 2042 { 2043 v->visit(this); 2044 } 2045 2046 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2047 2048 ir_rvalue *array; 2049 ir_rvalue *array_index; 2050 2051 private: 2052 void set_array(ir_rvalue *value); 2053 }; 2054 2055 2056 class ir_dereference_record : public ir_dereference { 2057 public: 2058 ir_dereference_record(ir_rvalue *value, const char *field); 2059 2060 ir_dereference_record(ir_variable *var, const char *field); 2061 2062 virtual ir_dereference_record *clone(void *mem_ctx, 2063 struct hash_table *) const; 2064 2065 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 2066 2067 /** 2068 * Get the variable that is ultimately referenced by an r-value 2069 */ 2070 virtual ir_variable *variable_referenced() const 2071 { 2072 return this->record->variable_referenced(); 2073 } 2074 2075 virtual void accept(ir_visitor *v) 2076 { 2077 v->visit(this); 2078 } 2079 2080 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2081 2082 ir_rvalue *record; 2083 const char *field; 2084 }; 2085 2086 2087 /** 2088 * Data stored in an ir_constant 2089 */ 2090 union ir_constant_data { 2091 unsigned u[16]; 2092 int i[16]; 2093 float f[16]; 2094 bool b[16]; 2095 double d[16]; 2096 }; 2097 2098 2099 class ir_constant : public ir_rvalue { 2100 public: 2101 ir_constant(const struct glsl_type *type, const ir_constant_data *data); 2102 ir_constant(bool b, unsigned vector_elements=1); 2103 ir_constant(unsigned int u, unsigned vector_elements=1); 2104 ir_constant(int i, unsigned vector_elements=1); 2105 ir_constant(float f, unsigned vector_elements=1); 2106 ir_constant(double d, unsigned vector_elements=1); 2107 2108 /** 2109 * Construct an ir_constant from a list of ir_constant values 2110 */ 2111 ir_constant(const struct glsl_type *type, exec_list *values); 2112 2113 /** 2114 * Construct an ir_constant from a scalar component of another ir_constant 2115 * 2116 * The new \c ir_constant inherits the type of the component from the 2117 * source constant. 2118 * 2119 * \note 2120 * In the case of a matrix constant, the new constant is a scalar, \b not 2121 * a vector. 2122 */ 2123 ir_constant(const ir_constant *c, unsigned i); 2124 2125 /** 2126 * Return a new ir_constant of the specified type containing all zeros. 2127 */ 2128 static ir_constant *zero(void *mem_ctx, const glsl_type *type); 2129 2130 virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 2131 2132 virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 2133 2134 virtual void accept(ir_visitor *v) 2135 { 2136 v->visit(this); 2137 } 2138 2139 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2140 2141 virtual bool equals(const ir_instruction *ir, 2142 enum ir_node_type ignore = ir_type_unset) const; 2143 2144 /** 2145 * Get a particular component of a constant as a specific type 2146 * 2147 * This is useful, for example, to get a value from an integer constant 2148 * as a float or bool. This appears frequently when constructors are 2149 * called with all constant parameters. 2150 */ 2151 /*@{*/ 2152 bool get_bool_component(unsigned i) const; 2153 float get_float_component(unsigned i) const; 2154 double get_double_component(unsigned i) const; 2155 int get_int_component(unsigned i) const; 2156 unsigned get_uint_component(unsigned i) const; 2157 /*@}*/ 2158 2159 ir_constant *get_array_element(unsigned i) const; 2160 2161 ir_constant *get_record_field(const char *name); 2162 2163 /** 2164 * Copy the values on another constant at a given offset. 2165 * 2166 * The offset is ignored for array or struct copies, it's only for 2167 * scalars or vectors into vectors or matrices. 2168 * 2169 * With identical types on both sides and zero offset it's clone() 2170 * without creating a new object. 2171 */ 2172 2173 void copy_offset(ir_constant *src, int offset); 2174 2175 /** 2176 * Copy the values on another constant at a given offset and 2177 * following an assign-like mask. 2178 * 2179 * The mask is ignored for scalars. 2180 * 2181 * Note that this function only handles what assign can handle, 2182 * i.e. at most a vector as source and a column of a matrix as 2183 * destination. 2184 */ 2185 2186 void copy_masked_offset(ir_constant *src, int offset, unsigned int mask); 2187 2188 /** 2189 * Determine whether a constant has the same value as another constant 2190 * 2191 * \sa ir_constant::is_zero, ir_constant::is_one, 2192 * ir_constant::is_negative_one 2193 */ 2194 bool has_value(const ir_constant *) const; 2195 2196 /** 2197 * Return true if this ir_constant represents the given value. 2198 * 2199 * For vectors, this checks that each component is the given value. 2200 */ 2201 virtual bool is_value(float f, int i) const; 2202 virtual bool is_zero() const; 2203 virtual bool is_one() const; 2204 virtual bool is_negative_one() const; 2205 2206 /** 2207 * Return true for constants that could be stored as 16-bit unsigned values. 2208 * 2209 * Note that this will return true even for signed integer ir_constants, as 2210 * long as the value is non-negative and fits in 16-bits. 2211 */ 2212 virtual bool is_uint16_constant() const; 2213 2214 /** 2215 * Value of the constant. 2216 * 2217 * The field used to back the values supplied by the constant is determined 2218 * by the type associated with the \c ir_instruction. Constants may be 2219 * scalars, vectors, or matrices. 2220 */ 2221 union ir_constant_data value; 2222 2223 /* Array elements */ 2224 ir_constant **array_elements; 2225 2226 /* Structure fields */ 2227 exec_list components; 2228 2229 private: 2230 /** 2231 * Parameterless constructor only used by the clone method 2232 */ 2233 ir_constant(void); 2234 }; 2235 2236 /** 2237 * IR instruction to emit a vertex in a geometry shader. 2238 */ 2239 class ir_emit_vertex : public ir_instruction { 2240 public: 2241 ir_emit_vertex(ir_rvalue *stream) 2242 : ir_instruction(ir_type_emit_vertex), 2243 stream(stream) 2244 { 2245 assert(stream); 2246 } 2247 2248 virtual void accept(ir_visitor *v) 2249 { 2250 v->visit(this); 2251 } 2252 2253 virtual ir_emit_vertex *clone(void *mem_ctx, struct hash_table *ht) const 2254 { 2255 return new(mem_ctx) ir_emit_vertex(this->stream->clone(mem_ctx, ht)); 2256 } 2257 2258 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2259 2260 int stream_id() const 2261 { 2262 return stream->as_constant()->value.i[0]; 2263 } 2264 2265 ir_rvalue *stream; 2266 }; 2267 2268 /** 2269 * IR instruction to complete the current primitive and start a new one in a 2270 * geometry shader. 2271 */ 2272 class ir_end_primitive : public ir_instruction { 2273 public: 2274 ir_end_primitive(ir_rvalue *stream) 2275 : ir_instruction(ir_type_end_primitive), 2276 stream(stream) 2277 { 2278 assert(stream); 2279 } 2280 2281 virtual void accept(ir_visitor *v) 2282 { 2283 v->visit(this); 2284 } 2285 2286 virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *ht) const 2287 { 2288 return new(mem_ctx) ir_end_primitive(this->stream->clone(mem_ctx, ht)); 2289 } 2290 2291 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2292 2293 int stream_id() const 2294 { 2295 return stream->as_constant()->value.i[0]; 2296 } 2297 2298 ir_rvalue *stream; 2299 }; 2300 2301 /** 2302 * IR instruction for tessellation control and compute shader barrier. 2303 */ 2304 class ir_barrier : public ir_instruction { 2305 public: 2306 ir_barrier() 2307 : ir_instruction(ir_type_barrier) 2308 { 2309 } 2310 2311 virtual void accept(ir_visitor *v) 2312 { 2313 v->visit(this); 2314 } 2315 2316 virtual ir_barrier *clone(void *mem_ctx, struct hash_table *) const 2317 { 2318 return new(mem_ctx) ir_barrier(); 2319 } 2320 2321 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2322 }; 2323 2324 /*@}*/ 2325 2326 /** 2327 * Apply a visitor to each IR node in a list 2328 */ 2329 void 2330 visit_exec_list(exec_list *list, ir_visitor *visitor); 2331 2332 /** 2333 * Validate invariants on each IR node in a list 2334 */ 2335 void validate_ir_tree(exec_list *instructions); 2336 2337 struct _mesa_glsl_parse_state; 2338 struct gl_shader_program; 2339 2340 /** 2341 * Detect whether an unlinked shader contains static recursion 2342 * 2343 * If the list of instructions is determined to contain static recursion, 2344 * \c _mesa_glsl_error will be called to emit error messages for each function 2345 * that is in the recursion cycle. 2346 */ 2347 void 2348 detect_recursion_unlinked(struct _mesa_glsl_parse_state *state, 2349 exec_list *instructions); 2350 2351 /** 2352 * Detect whether a linked shader contains static recursion 2353 * 2354 * If the list of instructions is determined to contain static recursion, 2355 * \c link_error_printf will be called to emit error messages for each function 2356 * that is in the recursion cycle. In addition, 2357 * \c gl_shader_program::LinkStatus will be set to false. 2358 */ 2359 void 2360 detect_recursion_linked(struct gl_shader_program *prog, 2361 exec_list *instructions); 2362 2363 /** 2364 * Make a clone of each IR instruction in a list 2365 * 2366 * \param in List of IR instructions that are to be cloned 2367 * \param out List to hold the cloned instructions 2368 */ 2369 void 2370 clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 2371 2372 extern void 2373 _mesa_glsl_initialize_variables(exec_list *instructions, 2374 struct _mesa_glsl_parse_state *state); 2375 2376 extern void 2377 _mesa_glsl_initialize_derived_variables(struct gl_context *ctx, 2378 gl_shader *shader); 2379 2380 extern void 2381 _mesa_glsl_initialize_builtin_functions(); 2382 2383 extern ir_function_signature * 2384 _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state, 2385 const char *name, exec_list *actual_parameters); 2386 2387 extern ir_function * 2388 _mesa_glsl_find_builtin_function_by_name(const char *name); 2389 2390 extern gl_shader * 2391 _mesa_glsl_get_builtin_function_shader(void); 2392 2393 extern ir_function_signature * 2394 _mesa_get_main_function_signature(glsl_symbol_table *symbols); 2395 2396 extern void 2397 _mesa_glsl_release_builtin_functions(void); 2398 2399 extern void 2400 reparent_ir(exec_list *list, void *mem_ctx); 2401 2402 extern void 2403 do_set_program_inouts(exec_list *instructions, struct gl_program *prog, 2404 gl_shader_stage shader_stage); 2405 2406 extern char * 2407 prototype_string(const glsl_type *return_type, const char *name, 2408 exec_list *parameters); 2409 2410 const char * 2411 mode_string(const ir_variable *var); 2412 2413 /** 2414 * Built-in / reserved GL variables names start with "gl_" 2415 */ 2416 static inline bool 2417 is_gl_identifier(const char *s) 2418 { 2419 return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_'; 2420 } 2421 2422 extern "C" { 2423 #endif /* __cplusplus */ 2424 2425 extern void _mesa_print_ir(FILE *f, struct exec_list *instructions, 2426 struct _mesa_glsl_parse_state *state); 2427 2428 extern void 2429 fprint_ir(FILE *f, const void *instruction); 2430 2431 extern const struct gl_builtin_uniform_desc * 2432 _mesa_glsl_get_builtin_uniform_desc(const char *name); 2433 2434 #ifdef __cplusplus 2435 } /* extern "C" */ 2436 #endif 2437 2438 unsigned 2439 vertices_per_prim(GLenum prim); 2440 2441 #endif /* IR_H */ 2442