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