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 * = 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 * Was the location explicitly set in the shader? 729 * 730 * If the location is explicitly set in the shader, it \b cannot be changed 731 * by the linker or by the API (e.g., calls to \c glBindAttribLocation have 732 * no effect). 733 */ 734 unsigned explicit_location:1; 735 unsigned explicit_index:1; 736 737 /** 738 * Was an initial binding explicitly set in the shader? 739 * 740 * If so, constant_value contains an integer ir_constant representing the 741 * initial binding point. 742 */ 743 unsigned explicit_binding:1; 744 745 /** 746 * Was an initial component explicitly set in the shader? 747 */ 748 unsigned explicit_component:1; 749 750 /** 751 * Does this variable have an initializer? 752 * 753 * This is used by the linker to cross-validiate initializers of global 754 * variables. 755 */ 756 unsigned has_initializer:1; 757 758 /** 759 * Is this variable a generic output or input that has not yet been matched 760 * up to a variable in another stage of the pipeline? 761 * 762 * This is used by the linker as scratch storage while assigning locations 763 * to generic inputs and outputs. 764 */ 765 unsigned is_unmatched_generic_inout:1; 766 767 /** 768 * Is this varying used only by transform feedback? 769 * 770 * This is used by the linker to decide if its safe to pack the varying. 771 */ 772 unsigned is_xfb_only:1; 773 774 /** 775 * Was a transform feedback buffer set in the shader? 776 */ 777 unsigned explicit_xfb_buffer:1; 778 779 /** 780 * Was a transform feedback offset set in the shader? 781 */ 782 unsigned explicit_xfb_offset:1; 783 784 /** 785 * Was a transform feedback stride set in the shader? 786 */ 787 unsigned explicit_xfb_stride:1; 788 789 /** 790 * If non-zero, then this variable may be packed along with other variables 791 * into a single varying slot, so this offset should be applied when 792 * accessing components. For example, an offset of 1 means that the x 793 * component of this variable is actually stored in component y of the 794 * location specified by \c location. 795 */ 796 unsigned location_frac:2; 797 798 /** 799 * Layout of the matrix. Uses glsl_matrix_layout values. 800 */ 801 unsigned matrix_layout:2; 802 803 /** 804 * Non-zero if this variable was created by lowering a named interface 805 * block. 806 */ 807 unsigned from_named_ifc_block:1; 808 809 /** 810 * Non-zero if the variable must be a shader input. This is useful for 811 * constraints on function parameters. 812 */ 813 unsigned must_be_shader_input:1; 814 815 /** 816 * Output index for dual source blending. 817 * 818 * \note 819 * The GLSL spec only allows the values 0 or 1 for the index in \b dual 820 * source blending. 821 */ 822 unsigned index:1; 823 824 /** 825 * Precision qualifier. 826 * 827 * In desktop GLSL we do not care about precision qualifiers at all, in 828 * fact, the spec says that precision qualifiers are ignored. 829 * 830 * To make things easy, we make it so that this field is always 831 * GLSL_PRECISION_NONE on desktop shaders. This way all the variables 832 * have the same precision value and the checks we add in the compiler 833 * for this field will never break a desktop shader compile. 834 */ 835 unsigned precision:2; 836 837 /** 838 * \brief Layout qualifier for gl_FragDepth. 839 * 840 * This is not equal to \c ir_depth_layout_none if and only if this 841 * variable is \c gl_FragDepth and a layout qualifier is specified. 842 */ 843 ir_depth_layout depth_layout:3; 844 845 /** 846 * Memory qualifiers. 847 */ 848 unsigned memory_read_only:1; /**< "readonly" qualifier. */ 849 unsigned memory_write_only:1; /**< "writeonly" qualifier. */ 850 unsigned memory_coherent:1; 851 unsigned memory_volatile:1; 852 unsigned memory_restrict:1; 853 854 /** 855 * ARB_shader_storage_buffer_object 856 */ 857 unsigned from_ssbo_unsized_array:1; /**< unsized array buffer variable. */ 858 859 unsigned implicit_sized_array:1; 860 861 /** 862 * Whether this is a fragment shader output implicitly initialized with 863 * the previous contents of the specified render target at the 864 * framebuffer location corresponding to this shader invocation. 865 */ 866 unsigned fb_fetch_output:1; 867 868 /** 869 * Non-zero if this variable is considered bindless as defined by 870 * ARB_bindless_texture. 871 */ 872 unsigned bindless:1; 873 874 /** 875 * Non-zero if this variable is considered bound as defined by 876 * ARB_bindless_texture. 877 */ 878 unsigned bound:1; 879 880 /** 881 * Emit a warning if this variable is accessed. 882 */ 883 private: 884 uint8_t warn_extension_index; 885 886 public: 887 /** Image internal format if specified explicitly, otherwise GL_NONE. */ 888 uint16_t image_format; 889 890 private: 891 /** 892 * Number of state slots used 893 * 894 * \note 895 * This could be stored in as few as 7-bits, if necessary. If it is made 896 * smaller, add an assertion to \c ir_variable::allocate_state_slots to 897 * be safe. 898 */ 899 uint16_t _num_state_slots; 900 901 public: 902 /** 903 * Initial binding point for a sampler, atomic, or UBO. 904 * 905 * For array types, this represents the binding point for the first element. 906 */ 907 int16_t binding; 908 909 /** 910 * Storage location of the base of this variable 911 * 912 * The precise meaning of this field depends on the nature of the variable. 913 * 914 * - Vertex shader input: one of the values from \c gl_vert_attrib. 915 * - Vertex shader output: one of the values from \c gl_varying_slot. 916 * - Geometry shader input: one of the values from \c gl_varying_slot. 917 * - Geometry shader output: one of the values from \c gl_varying_slot. 918 * - Fragment shader input: one of the values from \c gl_varying_slot. 919 * - Fragment shader output: one of the values from \c gl_frag_result. 920 * - Uniforms: Per-stage uniform slot number for default uniform block. 921 * - Uniforms: Index within the uniform block definition for UBO members. 922 * - Non-UBO Uniforms: explicit location until linking then reused to 923 * store uniform slot number. 924 * - Other: This field is not currently used. 925 * 926 * If the variable is a uniform, shader input, or shader output, and the 927 * slot has not been assigned, the value will be -1. 928 */ 929 int location; 930 931 /** 932 * for glsl->tgsi/mesa IR we need to store the index into the 933 * parameters for uniforms, initially the code overloaded location 934 * but this causes problems with indirect samplers and AoA. 935 * This is assigned in _mesa_generate_parameters_list_for_uniforms. 936 */ 937 int param_index; 938 939 /** 940 * Vertex stream output identifier. 941 * 942 * For packed outputs, bit 31 is set and bits [2*i+1,2*i] indicate the 943 * stream of the i-th component. 944 */ 945 unsigned stream; 946 947 /** 948 * Atomic, transform feedback or block member offset. 949 */ 950 unsigned offset; 951 952 /** 953 * Highest element accessed with a constant expression array index 954 * 955 * Not used for non-array variables. -1 is never accessed. 956 */ 957 int max_array_access; 958 959 /** 960 * Transform feedback buffer. 961 */ 962 unsigned xfb_buffer; 963 964 /** 965 * Transform feedback stride. 966 */ 967 unsigned xfb_stride; 968 969 /** 970 * Allow (only) ir_variable direct access private members. 971 */ 972 friend class ir_variable; 973 } data; 974 975 /** 976 * Value assigned in the initializer of a variable declared "const" 977 */ 978 ir_constant *constant_value; 979 980 /** 981 * Constant expression assigned in the initializer of the variable 982 * 983 * \warning 984 * This field and \c ::constant_value are distinct. Even if the two fields 985 * refer to constants with the same value, they must point to separate 986 * objects. 987 */ 988 ir_constant *constant_initializer; 989 990private: 991 static const char *const warn_extension_table[]; 992 993 union { 994 /** 995 * For variables which satisfy the is_interface_instance() predicate, 996 * this points to an array of integers such that if the ith member of 997 * the interface block is an array, max_ifc_array_access[i] is the 998 * maximum array element of that member that has been accessed. If the 999 * ith member of the interface block is not an array, 1000 * max_ifc_array_access[i] is unused. 1001 * 1002 * For variables whose type is not an interface block, this pointer is 1003 * NULL. 1004 */ 1005 int *max_ifc_array_access; 1006 1007 /** 1008 * Built-in state that backs this uniform 1009 * 1010 * Once set at variable creation, \c state_slots must remain invariant. 1011 * 1012 * If the variable is not a uniform, \c _num_state_slots will be zero 1013 * and \c state_slots will be \c NULL. 1014 */ 1015 ir_state_slot *state_slots; 1016 } u; 1017 1018 /** 1019 * For variables that are in an interface block or are an instance of an 1020 * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block. 1021 * 1022 * \sa ir_variable::location 1023 */ 1024 const glsl_type *interface_type; 1025 1026 /** 1027 * Name used for anonymous compiler temporaries 1028 */ 1029 static const char tmp_name[]; 1030 1031public: 1032 /** 1033 * Should the construct keep names for ir_var_temporary variables? 1034 * 1035 * When this global is false, names passed to the constructor for 1036 * \c ir_var_temporary variables will be dropped. Instead, the variable will 1037 * be named "compiler_temp". This name will be in static storage. 1038 * 1039 * \warning 1040 * \b NEVER change the mode of an \c ir_var_temporary. 1041 * 1042 * \warning 1043 * This variable is \b not thread-safe. It is global, \b not 1044 * per-context. It begins life false. A context can, at some point, make 1045 * it true. From that point on, it will be true forever. This should be 1046 * okay since it will only be set true while debugging. 1047 */ 1048 static bool temporaries_allocate_names; 1049}; 1050 1051/** 1052 * A function that returns whether a built-in function is available in the 1053 * current shading language (based on version, ES or desktop, and extensions). 1054 */ 1055typedef bool (*builtin_available_predicate)(const _mesa_glsl_parse_state *); 1056 1057#define MAKE_INTRINSIC_FOR_TYPE(op, t) \ 1058 ir_intrinsic_generic_ ## op - ir_intrinsic_generic_load + ir_intrinsic_ ## t ## _ ## load 1059 1060#define MAP_INTRINSIC_TO_TYPE(i, t) \ 1061 ir_intrinsic_id(int(i) - int(ir_intrinsic_generic_load) + int(ir_intrinsic_ ## t ## _ ## load)) 1062 1063enum ir_intrinsic_id { 1064 ir_intrinsic_invalid = 0, 1065 1066 /** 1067 * \name Generic intrinsics 1068 * 1069 * Each of these intrinsics has a specific version for shared variables and 1070 * SSBOs. 1071 */ 1072 /*@{*/ 1073 ir_intrinsic_generic_load, 1074 ir_intrinsic_generic_store, 1075 ir_intrinsic_generic_atomic_add, 1076 ir_intrinsic_generic_atomic_and, 1077 ir_intrinsic_generic_atomic_or, 1078 ir_intrinsic_generic_atomic_xor, 1079 ir_intrinsic_generic_atomic_min, 1080 ir_intrinsic_generic_atomic_max, 1081 ir_intrinsic_generic_atomic_exchange, 1082 ir_intrinsic_generic_atomic_comp_swap, 1083 /*@}*/ 1084 1085 ir_intrinsic_atomic_counter_read, 1086 ir_intrinsic_atomic_counter_increment, 1087 ir_intrinsic_atomic_counter_predecrement, 1088 ir_intrinsic_atomic_counter_add, 1089 ir_intrinsic_atomic_counter_and, 1090 ir_intrinsic_atomic_counter_or, 1091 ir_intrinsic_atomic_counter_xor, 1092 ir_intrinsic_atomic_counter_min, 1093 ir_intrinsic_atomic_counter_max, 1094 ir_intrinsic_atomic_counter_exchange, 1095 ir_intrinsic_atomic_counter_comp_swap, 1096 1097 ir_intrinsic_image_load, 1098 ir_intrinsic_image_store, 1099 ir_intrinsic_image_atomic_add, 1100 ir_intrinsic_image_atomic_and, 1101 ir_intrinsic_image_atomic_or, 1102 ir_intrinsic_image_atomic_xor, 1103 ir_intrinsic_image_atomic_min, 1104 ir_intrinsic_image_atomic_max, 1105 ir_intrinsic_image_atomic_exchange, 1106 ir_intrinsic_image_atomic_comp_swap, 1107 ir_intrinsic_image_size, 1108 ir_intrinsic_image_samples, 1109 1110 ir_intrinsic_ssbo_load, 1111 ir_intrinsic_ssbo_store = MAKE_INTRINSIC_FOR_TYPE(store, ssbo), 1112 ir_intrinsic_ssbo_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, ssbo), 1113 ir_intrinsic_ssbo_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, ssbo), 1114 ir_intrinsic_ssbo_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, ssbo), 1115 ir_intrinsic_ssbo_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, ssbo), 1116 ir_intrinsic_ssbo_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, ssbo), 1117 ir_intrinsic_ssbo_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, ssbo), 1118 ir_intrinsic_ssbo_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, ssbo), 1119 ir_intrinsic_ssbo_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, ssbo), 1120 1121 ir_intrinsic_memory_barrier, 1122 ir_intrinsic_shader_clock, 1123 ir_intrinsic_group_memory_barrier, 1124 ir_intrinsic_memory_barrier_atomic_counter, 1125 ir_intrinsic_memory_barrier_buffer, 1126 ir_intrinsic_memory_barrier_image, 1127 ir_intrinsic_memory_barrier_shared, 1128 ir_intrinsic_begin_invocation_interlock, 1129 ir_intrinsic_end_invocation_interlock, 1130 1131 ir_intrinsic_vote_all, 1132 ir_intrinsic_vote_any, 1133 ir_intrinsic_vote_eq, 1134 ir_intrinsic_ballot, 1135 ir_intrinsic_read_invocation, 1136 ir_intrinsic_read_first_invocation, 1137 1138 ir_intrinsic_shared_load, 1139 ir_intrinsic_shared_store = MAKE_INTRINSIC_FOR_TYPE(store, shared), 1140 ir_intrinsic_shared_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, shared), 1141 ir_intrinsic_shared_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, shared), 1142 ir_intrinsic_shared_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, shared), 1143 ir_intrinsic_shared_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, shared), 1144 ir_intrinsic_shared_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, shared), 1145 ir_intrinsic_shared_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, shared), 1146 ir_intrinsic_shared_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, shared), 1147 ir_intrinsic_shared_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, shared), 1148}; 1149 1150/*@{*/ 1151/** 1152 * The representation of a function instance; may be the full definition or 1153 * simply a prototype. 1154 */ 1155class ir_function_signature : public ir_instruction { 1156 /* An ir_function_signature will be part of the list of signatures in 1157 * an ir_function. 1158 */ 1159public: 1160 ir_function_signature(const glsl_type *return_type, 1161 builtin_available_predicate builtin_avail = NULL); 1162 1163 virtual ir_function_signature *clone(void *mem_ctx, 1164 struct hash_table *ht) const; 1165 ir_function_signature *clone_prototype(void *mem_ctx, 1166 struct hash_table *ht) const; 1167 1168 virtual void accept(ir_visitor *v) 1169 { 1170 v->visit(this); 1171 } 1172 1173 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1174 1175 /** 1176 * Attempt to evaluate this function as a constant expression, 1177 * given a list of the actual parameters and the variable context. 1178 * Returns NULL for non-built-ins. 1179 */ 1180 ir_constant *constant_expression_value(void *mem_ctx, 1181 exec_list *actual_parameters, 1182 struct hash_table *variable_context); 1183 1184 /** 1185 * Get the name of the function for which this is a signature 1186 */ 1187 const char *function_name() const; 1188 1189 /** 1190 * Get a handle to the function for which this is a signature 1191 * 1192 * There is no setter function, this function returns a \c const pointer, 1193 * and \c ir_function_signature::_function is private for a reason. The 1194 * only way to make a connection between a function and function signature 1195 * is via \c ir_function::add_signature. This helps ensure that certain 1196 * invariants (i.e., a function signature is in the list of signatures for 1197 * its \c _function) are met. 1198 * 1199 * \sa ir_function::add_signature 1200 */ 1201 inline const class ir_function *function() const 1202 { 1203 return this->_function; 1204 } 1205 1206 /** 1207 * Check whether the qualifiers match between this signature's parameters 1208 * and the supplied parameter list. If not, returns the name of the first 1209 * parameter with mismatched qualifiers (for use in error messages). 1210 */ 1211 const char *qualifiers_match(exec_list *params); 1212 1213 /** 1214 * Replace the current parameter list with the given one. This is useful 1215 * if the current information came from a prototype, and either has invalid 1216 * or missing parameter names. 1217 */ 1218 void replace_parameters(exec_list *new_params); 1219 1220 /** 1221 * Function return type. 1222 * 1223 * \note This discards the optional precision qualifier. 1224 */ 1225 const struct glsl_type *return_type; 1226 1227 /** 1228 * List of ir_variable of function parameters. 1229 * 1230 * This represents the storage. The paramaters passed in a particular 1231 * call will be in ir_call::actual_paramaters. 1232 */ 1233 struct exec_list parameters; 1234 1235 /** Whether or not this function has a body (which may be empty). */ 1236 unsigned is_defined:1; 1237 1238 /** Whether or not this function signature is a built-in. */ 1239 bool is_builtin() const; 1240 1241 /** 1242 * Whether or not this function is an intrinsic to be implemented 1243 * by the driver. 1244 */ 1245 inline bool is_intrinsic() const 1246 { 1247 return intrinsic_id != ir_intrinsic_invalid; 1248 } 1249 1250 /** Indentifier for this intrinsic. */ 1251 enum ir_intrinsic_id intrinsic_id; 1252 1253 /** Whether or not a built-in is available for this shader. */ 1254 bool is_builtin_available(const _mesa_glsl_parse_state *state) const; 1255 1256 /** Body of instructions in the function. */ 1257 struct exec_list body; 1258 1259private: 1260 /** 1261 * A function pointer to a predicate that answers whether a built-in 1262 * function is available in the current shader. NULL if not a built-in. 1263 */ 1264 builtin_available_predicate builtin_avail; 1265 1266 /** Function of which this signature is one overload. */ 1267 class ir_function *_function; 1268 1269 /** Function signature of which this one is a prototype clone */ 1270 const ir_function_signature *origin; 1271 1272 friend class ir_function; 1273 1274 /** 1275 * Helper function to run a list of instructions for constant 1276 * expression evaluation. 1277 * 1278 * The hash table represents the values of the visible variables. 1279 * There are no scoping issues because the table is indexed on 1280 * ir_variable pointers, not variable names. 1281 * 1282 * Returns false if the expression is not constant, true otherwise, 1283 * and the value in *result if result is non-NULL. 1284 */ 1285 bool constant_expression_evaluate_expression_list(void *mem_ctx, 1286 const struct exec_list &body, 1287 struct hash_table *variable_context, 1288 ir_constant **result); 1289}; 1290 1291 1292/** 1293 * Header for tracking multiple overloaded functions with the same name. 1294 * Contains a list of ir_function_signatures representing each of the 1295 * actual functions. 1296 */ 1297class ir_function : public ir_instruction { 1298public: 1299 ir_function(const char *name); 1300 1301 virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 1302 1303 virtual void accept(ir_visitor *v) 1304 { 1305 v->visit(this); 1306 } 1307 1308 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1309 1310 void add_signature(ir_function_signature *sig) 1311 { 1312 sig->_function = this; 1313 this->signatures.push_tail(sig); 1314 } 1315 1316 /** 1317 * Find a signature that matches a set of actual parameters, taking implicit 1318 * conversions into account. Also flags whether the match was exact. 1319 */ 1320 ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, 1321 const exec_list *actual_param, 1322 bool allow_builtins, 1323 bool *match_is_exact); 1324 1325 /** 1326 * Find a signature that matches a set of actual parameters, taking implicit 1327 * conversions into account. 1328 */ 1329 ir_function_signature *matching_signature(_mesa_glsl_parse_state *state, 1330 const exec_list *actual_param, 1331 bool allow_builtins); 1332 1333 /** 1334 * Find a signature that exactly matches a set of actual parameters without 1335 * any implicit type conversions. 1336 */ 1337 ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state *state, 1338 const exec_list *actual_ps); 1339 1340 /** 1341 * Name of the function. 1342 */ 1343 const char *name; 1344 1345 /** Whether or not this function has a signature that isn't a built-in. */ 1346 bool has_user_signature(); 1347 1348 /** 1349 * List of ir_function_signature for each overloaded function with this name. 1350 */ 1351 struct exec_list signatures; 1352 1353 /** 1354 * is this function a subroutine type declaration 1355 * e.g. subroutine void type1(float arg1); 1356 */ 1357 bool is_subroutine; 1358 1359 /** 1360 * is this function associated to a subroutine type 1361 * e.g. subroutine (type1, type2) function_name { function_body }; 1362 * would have num_subroutine_types 2, 1363 * and pointers to the type1 and type2 types. 1364 */ 1365 int num_subroutine_types; 1366 const struct glsl_type **subroutine_types; 1367 1368 int subroutine_index; 1369}; 1370 1371inline const char *ir_function_signature::function_name() const 1372{ 1373 return this->_function->name; 1374} 1375/*@}*/ 1376 1377 1378/** 1379 * IR instruction representing high-level if-statements 1380 */ 1381class ir_if : public ir_instruction { 1382public: 1383 ir_if(ir_rvalue *condition) 1384 : ir_instruction(ir_type_if), condition(condition) 1385 { 1386 } 1387 1388 virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 1389 1390 virtual void accept(ir_visitor *v) 1391 { 1392 v->visit(this); 1393 } 1394 1395 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1396 1397 ir_rvalue *condition; 1398 /** List of ir_instruction for the body of the then branch */ 1399 exec_list then_instructions; 1400 /** List of ir_instruction for the body of the else branch */ 1401 exec_list else_instructions; 1402}; 1403 1404 1405/** 1406 * IR instruction representing a high-level loop structure. 1407 */ 1408class ir_loop : public ir_instruction { 1409public: 1410 ir_loop(); 1411 1412 virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 1413 1414 virtual void accept(ir_visitor *v) 1415 { 1416 v->visit(this); 1417 } 1418 1419 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1420 1421 /** List of ir_instruction that make up the body of the loop. */ 1422 exec_list body_instructions; 1423}; 1424 1425 1426class ir_assignment : public ir_instruction { 1427public: 1428 ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL); 1429 1430 /** 1431 * Construct an assignment with an explicit write mask 1432 * 1433 * \note 1434 * Since a write mask is supplied, the LHS must already be a bare 1435 * \c ir_dereference. The cannot be any swizzles in the LHS. 1436 */ 1437 ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 1438 unsigned write_mask); 1439 1440 virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 1441 1442 virtual ir_constant *constant_expression_value(void *mem_ctx, 1443 struct hash_table *variable_context = NULL); 1444 1445 virtual void accept(ir_visitor *v) 1446 { 1447 v->visit(this); 1448 } 1449 1450 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1451 1452 /** 1453 * Get a whole variable written by an assignment 1454 * 1455 * If the LHS of the assignment writes a whole variable, the variable is 1456 * returned. Otherwise \c NULL is returned. Examples of whole-variable 1457 * assignment are: 1458 * 1459 * - Assigning to a scalar 1460 * - Assigning to all components of a vector 1461 * - Whole array (or matrix) assignment 1462 * - Whole structure assignment 1463 */ 1464 ir_variable *whole_variable_written(); 1465 1466 /** 1467 * Set the LHS of an assignment 1468 */ 1469 void set_lhs(ir_rvalue *lhs); 1470 1471 /** 1472 * Left-hand side of the assignment. 1473 * 1474 * This should be treated as read only. If you need to set the LHS of an 1475 * assignment, use \c ir_assignment::set_lhs. 1476 */ 1477 ir_dereference *lhs; 1478 1479 /** 1480 * Value being assigned 1481 */ 1482 ir_rvalue *rhs; 1483 1484 /** 1485 * Optional condition for the assignment. 1486 */ 1487 ir_rvalue *condition; 1488 1489 1490 /** 1491 * Component mask written 1492 * 1493 * For non-vector types in the LHS, this field will be zero. For vector 1494 * types, a bit will be set for each component that is written. Note that 1495 * for \c vec2 and \c vec3 types only the lower bits will ever be set. 1496 * 1497 * A partially-set write mask means that each enabled channel gets 1498 * the value from a consecutive channel of the rhs. For example, 1499 * to write just .xyw of gl_FrontColor with color: 1500 * 1501 * (assign (constant bool (1)) (xyw) 1502 * (var_ref gl_FragColor) 1503 * (swiz xyw (var_ref color))) 1504 */ 1505 unsigned write_mask:4; 1506}; 1507 1508#include "ir_expression_operation.h" 1509 1510extern const char *const ir_expression_operation_strings[ir_last_opcode + 1]; 1511extern const char *const ir_expression_operation_enum_strings[ir_last_opcode + 1]; 1512 1513class ir_expression : public ir_rvalue { 1514public: 1515 ir_expression(int op, const struct glsl_type *type, 1516 ir_rvalue *op0, ir_rvalue *op1 = NULL, 1517 ir_rvalue *op2 = NULL, ir_rvalue *op3 = NULL); 1518 1519 /** 1520 * Constructor for unary operation expressions 1521 */ 1522 ir_expression(int op, ir_rvalue *); 1523 1524 /** 1525 * Constructor for binary operation expressions 1526 */ 1527 ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1); 1528 1529 /** 1530 * Constructor for ternary operation expressions 1531 */ 1532 ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2); 1533 1534 virtual bool equals(const ir_instruction *ir, 1535 enum ir_node_type ignore = ir_type_unset) const; 1536 1537 virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 1538 1539 /** 1540 * Attempt to constant-fold the expression 1541 * 1542 * The "variable_context" hash table links ir_variable * to ir_constant * 1543 * that represent the variables' values. \c NULL represents an empty 1544 * context. 1545 * 1546 * If the expression cannot be constant folded, this method will return 1547 * \c NULL. 1548 */ 1549 virtual ir_constant *constant_expression_value(void *mem_ctx, 1550 struct hash_table *variable_context = NULL); 1551 1552 /** 1553 * This is only here for ir_reader to used for testing purposes please use 1554 * the precomputed num_operands field if you need the number of operands. 1555 */ 1556 static unsigned get_num_operands(ir_expression_operation); 1557 1558 /** 1559 * Return whether the expression operates on vectors horizontally. 1560 */ 1561 bool is_horizontal() const 1562 { 1563 return operation == ir_binop_all_equal || 1564 operation == ir_binop_any_nequal || 1565 operation == ir_binop_dot || 1566 operation == ir_binop_vector_extract || 1567 operation == ir_triop_vector_insert || 1568 operation == ir_binop_ubo_load || 1569 operation == ir_quadop_vector; 1570 } 1571 1572 /** 1573 * Do a reverse-lookup to translate the given string into an operator. 1574 */ 1575 static ir_expression_operation get_operator(const char *); 1576 1577 virtual void accept(ir_visitor *v) 1578 { 1579 v->visit(this); 1580 } 1581 1582 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1583 1584 virtual ir_variable *variable_referenced() const; 1585 1586 /** 1587 * Determine the number of operands used by an expression 1588 */ 1589 void init_num_operands() 1590 { 1591 if (operation == ir_quadop_vector) { 1592 num_operands = this->type->vector_elements; 1593 } else { 1594 num_operands = get_num_operands(operation); 1595 } 1596 } 1597 1598 ir_expression_operation operation; 1599 ir_rvalue *operands[4]; 1600 uint8_t num_operands; 1601}; 1602 1603 1604/** 1605 * HIR instruction representing a high-level function call, containing a list 1606 * of parameters and returning a value in the supplied temporary. 1607 */ 1608class ir_call : public ir_instruction { 1609public: 1610 ir_call(ir_function_signature *callee, 1611 ir_dereference_variable *return_deref, 1612 exec_list *actual_parameters) 1613 : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(NULL), array_idx(NULL) 1614 { 1615 assert(callee->return_type != NULL); 1616 actual_parameters->move_nodes_to(& this->actual_parameters); 1617 } 1618 1619 ir_call(ir_function_signature *callee, 1620 ir_dereference_variable *return_deref, 1621 exec_list *actual_parameters, 1622 ir_variable *var, ir_rvalue *array_idx) 1623 : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(var), array_idx(array_idx) 1624 { 1625 assert(callee->return_type != NULL); 1626 actual_parameters->move_nodes_to(& this->actual_parameters); 1627 } 1628 1629 virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 1630 1631 virtual ir_constant *constant_expression_value(void *mem_ctx, 1632 struct hash_table *variable_context = NULL); 1633 1634 virtual void accept(ir_visitor *v) 1635 { 1636 v->visit(this); 1637 } 1638 1639 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1640 1641 /** 1642 * Get the name of the function being called. 1643 */ 1644 const char *callee_name() const 1645 { 1646 return callee->function_name(); 1647 } 1648 1649 /** 1650 * Generates an inline version of the function before @ir, 1651 * storing the return value in return_deref. 1652 */ 1653 void generate_inline(ir_instruction *ir); 1654 1655 /** 1656 * Storage for the function's return value. 1657 * This must be NULL if the return type is void. 1658 */ 1659 ir_dereference_variable *return_deref; 1660 1661 /** 1662 * The specific function signature being called. 1663 */ 1664 ir_function_signature *callee; 1665 1666 /* List of ir_rvalue of paramaters passed in this call. */ 1667 exec_list actual_parameters; 1668 1669 /* 1670 * ARB_shader_subroutine support - 1671 * the subroutine uniform variable and array index 1672 * rvalue to be used in the lowering pass later. 1673 */ 1674 ir_variable *sub_var; 1675 ir_rvalue *array_idx; 1676}; 1677 1678 1679/** 1680 * \name Jump-like IR instructions. 1681 * 1682 * These include \c break, \c continue, \c return, and \c discard. 1683 */ 1684/*@{*/ 1685class ir_jump : public ir_instruction { 1686protected: 1687 ir_jump(enum ir_node_type t) 1688 : ir_instruction(t) 1689 { 1690 } 1691}; 1692 1693class ir_return : public ir_jump { 1694public: 1695 ir_return() 1696 : ir_jump(ir_type_return), value(NULL) 1697 { 1698 } 1699 1700 ir_return(ir_rvalue *value) 1701 : ir_jump(ir_type_return), value(value) 1702 { 1703 } 1704 1705 virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 1706 1707 ir_rvalue *get_value() const 1708 { 1709 return value; 1710 } 1711 1712 virtual void accept(ir_visitor *v) 1713 { 1714 v->visit(this); 1715 } 1716 1717 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1718 1719 ir_rvalue *value; 1720}; 1721 1722 1723/** 1724 * Jump instructions used inside loops 1725 * 1726 * These include \c break and \c continue. The \c break within a loop is 1727 * different from the \c break within a switch-statement. 1728 * 1729 * \sa ir_switch_jump 1730 */ 1731class ir_loop_jump : public ir_jump { 1732public: 1733 enum jump_mode { 1734 jump_break, 1735 jump_continue 1736 }; 1737 1738 ir_loop_jump(jump_mode mode) 1739 : ir_jump(ir_type_loop_jump) 1740 { 1741 this->mode = mode; 1742 } 1743 1744 virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 1745 1746 virtual void accept(ir_visitor *v) 1747 { 1748 v->visit(this); 1749 } 1750 1751 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1752 1753 bool is_break() const 1754 { 1755 return mode == jump_break; 1756 } 1757 1758 bool is_continue() const 1759 { 1760 return mode == jump_continue; 1761 } 1762 1763 /** Mode selector for the jump instruction. */ 1764 enum jump_mode mode; 1765}; 1766 1767/** 1768 * IR instruction representing discard statements. 1769 */ 1770class ir_discard : public ir_jump { 1771public: 1772 ir_discard() 1773 : ir_jump(ir_type_discard) 1774 { 1775 this->condition = NULL; 1776 } 1777 1778 ir_discard(ir_rvalue *cond) 1779 : ir_jump(ir_type_discard) 1780 { 1781 this->condition = cond; 1782 } 1783 1784 virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 1785 1786 virtual void accept(ir_visitor *v) 1787 { 1788 v->visit(this); 1789 } 1790 1791 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1792 1793 ir_rvalue *condition; 1794}; 1795/*@}*/ 1796 1797 1798/** 1799 * Texture sampling opcodes used in ir_texture 1800 */ 1801enum ir_texture_opcode { 1802 ir_tex, /**< Regular texture look-up */ 1803 ir_txb, /**< Texture look-up with LOD bias */ 1804 ir_txl, /**< Texture look-up with explicit LOD */ 1805 ir_txd, /**< Texture look-up with partial derivatvies */ 1806 ir_txf, /**< Texel fetch with explicit LOD */ 1807 ir_txf_ms, /**< Multisample texture fetch */ 1808 ir_txs, /**< Texture size */ 1809 ir_lod, /**< Texture lod query */ 1810 ir_tg4, /**< Texture gather */ 1811 ir_query_levels, /**< Texture levels query */ 1812 ir_texture_samples, /**< Texture samples query */ 1813 ir_samples_identical, /**< Query whether all samples are definitely identical. */ 1814}; 1815 1816 1817/** 1818 * IR instruction to sample a texture 1819 * 1820 * The specific form of the IR instruction depends on the \c mode value 1821 * selected from \c ir_texture_opcodes. In the printed IR, these will 1822 * appear as: 1823 * 1824 * Texel offset (0 or an expression) 1825 * | Projection divisor 1826 * | | Shadow comparator 1827 * | | | 1828 * v v v 1829 * (tex <type> <sampler> <coordinate> 0 1 ( )) 1830 * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>) 1831 * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>) 1832 * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy)) 1833 * (txf <type> <sampler> <coordinate> 0 <lod>) 1834 * (txf_ms 1835 * <type> <sampler> <coordinate> <sample_index>) 1836 * (txs <type> <sampler> <lod>) 1837 * (lod <type> <sampler> <coordinate>) 1838 * (tg4 <type> <sampler> <coordinate> <offset> <component>) 1839 * (query_levels <type> <sampler>) 1840 * (samples_identical <sampler> <coordinate>) 1841 */ 1842class ir_texture : public ir_rvalue { 1843public: 1844 ir_texture(enum ir_texture_opcode op) 1845 : ir_rvalue(ir_type_texture), 1846 op(op), sampler(NULL), coordinate(NULL), projector(NULL), 1847 shadow_comparator(NULL), offset(NULL) 1848 { 1849 memset(&lod_info, 0, sizeof(lod_info)); 1850 } 1851 1852 virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 1853 1854 virtual ir_constant *constant_expression_value(void *mem_ctx, 1855 struct hash_table *variable_context = NULL); 1856 1857 virtual void accept(ir_visitor *v) 1858 { 1859 v->visit(this); 1860 } 1861 1862 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1863 1864 virtual bool equals(const ir_instruction *ir, 1865 enum ir_node_type ignore = ir_type_unset) const; 1866 1867 /** 1868 * Return a string representing the ir_texture_opcode. 1869 */ 1870 const char *opcode_string(); 1871 1872 /** Set the sampler and type. */ 1873 void set_sampler(ir_dereference *sampler, const glsl_type *type); 1874 1875 /** 1876 * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1877 */ 1878 static ir_texture_opcode get_opcode(const char *); 1879 1880 enum ir_texture_opcode op; 1881 1882 /** Sampler to use for the texture access. */ 1883 ir_dereference *sampler; 1884 1885 /** Texture coordinate to sample */ 1886 ir_rvalue *coordinate; 1887 1888 /** 1889 * Value used for projective divide. 1890 * 1891 * If there is no projective divide (the common case), this will be 1892 * \c NULL. Optimization passes should check for this to point to a constant 1893 * of 1.0 and replace that with \c NULL. 1894 */ 1895 ir_rvalue *projector; 1896 1897 /** 1898 * Coordinate used for comparison on shadow look-ups. 1899 * 1900 * If there is no shadow comparison, this will be \c NULL. For the 1901 * \c ir_txf opcode, this *must* be \c NULL. 1902 */ 1903 ir_rvalue *shadow_comparator; 1904 1905 /** Texel offset. */ 1906 ir_rvalue *offset; 1907 1908 union { 1909 ir_rvalue *lod; /**< Floating point LOD */ 1910 ir_rvalue *bias; /**< Floating point LOD bias */ 1911 ir_rvalue *sample_index; /**< MSAA sample index */ 1912 ir_rvalue *component; /**< Gather component selector */ 1913 struct { 1914 ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 1915 ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 1916 } grad; 1917 } lod_info; 1918}; 1919 1920 1921struct ir_swizzle_mask { 1922 unsigned x:2; 1923 unsigned y:2; 1924 unsigned z:2; 1925 unsigned w:2; 1926 1927 /** 1928 * Number of components in the swizzle. 1929 */ 1930 unsigned num_components:3; 1931 1932 /** 1933 * Does the swizzle contain duplicate components? 1934 * 1935 * L-value swizzles cannot contain duplicate components. 1936 */ 1937 unsigned has_duplicates:1; 1938}; 1939 1940 1941class ir_swizzle : public ir_rvalue { 1942public: 1943 ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1944 unsigned count); 1945 1946 ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 1947 1948 ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1949 1950 virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 1951 1952 virtual ir_constant *constant_expression_value(void *mem_ctx, 1953 struct hash_table *variable_context = NULL); 1954 1955 /** 1956 * Construct an ir_swizzle from the textual representation. Can fail. 1957 */ 1958 static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1959 1960 virtual void accept(ir_visitor *v) 1961 { 1962 v->visit(this); 1963 } 1964 1965 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1966 1967 virtual bool equals(const ir_instruction *ir, 1968 enum ir_node_type ignore = ir_type_unset) const; 1969 1970 bool is_lvalue(const struct _mesa_glsl_parse_state *state) const 1971 { 1972 return val->is_lvalue(state) && !mask.has_duplicates; 1973 } 1974 1975 /** 1976 * Get the variable that is ultimately referenced by an r-value 1977 */ 1978 virtual ir_variable *variable_referenced() const; 1979 1980 ir_rvalue *val; 1981 ir_swizzle_mask mask; 1982 1983private: 1984 /** 1985 * Initialize the mask component of a swizzle 1986 * 1987 * This is used by the \c ir_swizzle constructors. 1988 */ 1989 void init_mask(const unsigned *components, unsigned count); 1990}; 1991 1992 1993class ir_dereference : public ir_rvalue { 1994public: 1995 virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1996 1997 bool is_lvalue(const struct _mesa_glsl_parse_state *state) const; 1998 1999 /** 2000 * Get the variable that is ultimately referenced by an r-value 2001 */ 2002 virtual ir_variable *variable_referenced() const = 0; 2003 2004protected: 2005 ir_dereference(enum ir_node_type t) 2006 : ir_rvalue(t) 2007 { 2008 } 2009}; 2010 2011 2012class ir_dereference_variable : public ir_dereference { 2013public: 2014 ir_dereference_variable(ir_variable *var); 2015 2016 virtual ir_dereference_variable *clone(void *mem_ctx, 2017 struct hash_table *) const; 2018 2019 virtual ir_constant *constant_expression_value(void *mem_ctx, 2020 struct hash_table *variable_context = NULL); 2021 2022 virtual bool equals(const ir_instruction *ir, 2023 enum ir_node_type ignore = ir_type_unset) const; 2024 2025 /** 2026 * Get the variable that is ultimately referenced by an r-value 2027 */ 2028 virtual ir_variable *variable_referenced() const 2029 { 2030 return this->var; 2031 } 2032 2033 virtual ir_variable *whole_variable_referenced() 2034 { 2035 /* ir_dereference_variable objects always dereference the entire 2036 * variable. However, if this dereference is dereferenced by anything 2037 * else, the complete deferefernce chain is not a whole-variable 2038 * dereference. This method should only be called on the top most 2039 * ir_rvalue in a dereference chain. 2040 */ 2041 return this->var; 2042 } 2043 2044 virtual void accept(ir_visitor *v) 2045 { 2046 v->visit(this); 2047 } 2048 2049 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2050 2051 /** 2052 * Object being dereferenced. 2053 */ 2054 ir_variable *var; 2055}; 2056 2057 2058class ir_dereference_array : public ir_dereference { 2059public: 2060 ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 2061 2062 ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 2063 2064 virtual ir_dereference_array *clone(void *mem_ctx, 2065 struct hash_table *) const; 2066 2067 virtual ir_constant *constant_expression_value(void *mem_ctx, 2068 struct hash_table *variable_context = NULL); 2069 2070 virtual bool equals(const ir_instruction *ir, 2071 enum ir_node_type ignore = ir_type_unset) const; 2072 2073 /** 2074 * Get the variable that is ultimately referenced by an r-value 2075 */ 2076 virtual ir_variable *variable_referenced() const 2077 { 2078 return this->array->variable_referenced(); 2079 } 2080 2081 virtual void accept(ir_visitor *v) 2082 { 2083 v->visit(this); 2084 } 2085 2086 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2087 2088 ir_rvalue *array; 2089 ir_rvalue *array_index; 2090 2091private: 2092 void set_array(ir_rvalue *value); 2093}; 2094 2095 2096class ir_dereference_record : public ir_dereference { 2097public: 2098 ir_dereference_record(ir_rvalue *value, const char *field); 2099 2100 ir_dereference_record(ir_variable *var, const char *field); 2101 2102 virtual ir_dereference_record *clone(void *mem_ctx, 2103 struct hash_table *) const; 2104 2105 virtual ir_constant *constant_expression_value(void *mem_ctx, 2106 struct hash_table *variable_context = NULL); 2107 2108 /** 2109 * Get the variable that is ultimately referenced by an r-value 2110 */ 2111 virtual ir_variable *variable_referenced() const 2112 { 2113 return this->record->variable_referenced(); 2114 } 2115 2116 virtual void accept(ir_visitor *v) 2117 { 2118 v->visit(this); 2119 } 2120 2121 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2122 2123 ir_rvalue *record; 2124 int field_idx; 2125}; 2126 2127 2128/** 2129 * Data stored in an ir_constant 2130 */ 2131union ir_constant_data { 2132 unsigned u[16]; 2133 int i[16]; 2134 float f[16]; 2135 bool b[16]; 2136 double d[16]; 2137 uint64_t u64[16]; 2138 int64_t i64[16]; 2139}; 2140 2141 2142class ir_constant : public ir_rvalue { 2143public: 2144 ir_constant(const struct glsl_type *type, const ir_constant_data *data); 2145 ir_constant(bool b, unsigned vector_elements=1); 2146 ir_constant(unsigned int u, unsigned vector_elements=1); 2147 ir_constant(int i, unsigned vector_elements=1); 2148 ir_constant(float f, unsigned vector_elements=1); 2149 ir_constant(double d, unsigned vector_elements=1); 2150 ir_constant(uint64_t u64, unsigned vector_elements=1); 2151 ir_constant(int64_t i64, unsigned vector_elements=1); 2152 2153 /** 2154 * Construct an ir_constant from a list of ir_constant values 2155 */ 2156 ir_constant(const struct glsl_type *type, exec_list *values); 2157 2158 /** 2159 * Construct an ir_constant from a scalar component of another ir_constant 2160 * 2161 * The new \c ir_constant inherits the type of the component from the 2162 * source constant. 2163 * 2164 * \note 2165 * In the case of a matrix constant, the new constant is a scalar, \b not 2166 * a vector. 2167 */ 2168 ir_constant(const ir_constant *c, unsigned i); 2169 2170 /** 2171 * Return a new ir_constant of the specified type containing all zeros. 2172 */ 2173 static ir_constant *zero(void *mem_ctx, const glsl_type *type); 2174 2175 virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 2176 2177 virtual ir_constant *constant_expression_value(void *mem_ctx, 2178 struct hash_table *variable_context = NULL); 2179 2180 virtual void accept(ir_visitor *v) 2181 { 2182 v->visit(this); 2183 } 2184 2185 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2186 2187 virtual bool equals(const ir_instruction *ir, 2188 enum ir_node_type ignore = ir_type_unset) const; 2189 2190 /** 2191 * Get a particular component of a constant as a specific type 2192 * 2193 * This is useful, for example, to get a value from an integer constant 2194 * as a float or bool. This appears frequently when constructors are 2195 * called with all constant parameters. 2196 */ 2197 /*@{*/ 2198 bool get_bool_component(unsigned i) const; 2199 float get_float_component(unsigned i) const; 2200 double get_double_component(unsigned i) const; 2201 int get_int_component(unsigned i) const; 2202 unsigned get_uint_component(unsigned i) const; 2203 int64_t get_int64_component(unsigned i) const; 2204 uint64_t get_uint64_component(unsigned i) const; 2205 /*@}*/ 2206 2207 ir_constant *get_array_element(unsigned i) const; 2208 2209 ir_constant *get_record_field(int idx); 2210 2211 /** 2212 * Copy the values on another constant at a given offset. 2213 * 2214 * The offset is ignored for array or struct copies, it's only for 2215 * scalars or vectors into vectors or matrices. 2216 * 2217 * With identical types on both sides and zero offset it's clone() 2218 * without creating a new object. 2219 */ 2220 2221 void copy_offset(ir_constant *src, int offset); 2222 2223 /** 2224 * Copy the values on another constant at a given offset and 2225 * following an assign-like mask. 2226 * 2227 * The mask is ignored for scalars. 2228 * 2229 * Note that this function only handles what assign can handle, 2230 * i.e. at most a vector as source and a column of a matrix as 2231 * destination. 2232 */ 2233 2234 void copy_masked_offset(ir_constant *src, int offset, unsigned int mask); 2235 2236 /** 2237 * Determine whether a constant has the same value as another constant 2238 * 2239 * \sa ir_constant::is_zero, ir_constant::is_one, 2240 * ir_constant::is_negative_one 2241 */ 2242 bool has_value(const ir_constant *) const; 2243 2244 /** 2245 * Return true if this ir_constant represents the given value. 2246 * 2247 * For vectors, this checks that each component is the given value. 2248 */ 2249 virtual bool is_value(float f, int i) const; 2250 virtual bool is_zero() const; 2251 virtual bool is_one() const; 2252 virtual bool is_negative_one() const; 2253 2254 /** 2255 * Return true for constants that could be stored as 16-bit unsigned values. 2256 * 2257 * Note that this will return true even for signed integer ir_constants, as 2258 * long as the value is non-negative and fits in 16-bits. 2259 */ 2260 virtual bool is_uint16_constant() const; 2261 2262 /** 2263 * Value of the constant. 2264 * 2265 * The field used to back the values supplied by the constant is determined 2266 * by the type associated with the \c ir_instruction. Constants may be 2267 * scalars, vectors, or matrices. 2268 */ 2269 union ir_constant_data value; 2270 2271 /* Array elements and structure fields */ 2272 ir_constant **const_elements; 2273 2274private: 2275 /** 2276 * Parameterless constructor only used by the clone method 2277 */ 2278 ir_constant(void); 2279}; 2280 2281/** 2282 * IR instruction to emit a vertex in a geometry shader. 2283 */ 2284class ir_emit_vertex : public ir_instruction { 2285public: 2286 ir_emit_vertex(ir_rvalue *stream) 2287 : ir_instruction(ir_type_emit_vertex), 2288 stream(stream) 2289 { 2290 assert(stream); 2291 } 2292 2293 virtual void accept(ir_visitor *v) 2294 { 2295 v->visit(this); 2296 } 2297 2298 virtual ir_emit_vertex *clone(void *mem_ctx, struct hash_table *ht) const 2299 { 2300 return new(mem_ctx) ir_emit_vertex(this->stream->clone(mem_ctx, ht)); 2301 } 2302 2303 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2304 2305 int stream_id() const 2306 { 2307 return stream->as_constant()->value.i[0]; 2308 } 2309 2310 ir_rvalue *stream; 2311}; 2312 2313/** 2314 * IR instruction to complete the current primitive and start a new one in a 2315 * geometry shader. 2316 */ 2317class ir_end_primitive : public ir_instruction { 2318public: 2319 ir_end_primitive(ir_rvalue *stream) 2320 : ir_instruction(ir_type_end_primitive), 2321 stream(stream) 2322 { 2323 assert(stream); 2324 } 2325 2326 virtual void accept(ir_visitor *v) 2327 { 2328 v->visit(this); 2329 } 2330 2331 virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *ht) const 2332 { 2333 return new(mem_ctx) ir_end_primitive(this->stream->clone(mem_ctx, ht)); 2334 } 2335 2336 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2337 2338 int stream_id() const 2339 { 2340 return stream->as_constant()->value.i[0]; 2341 } 2342 2343 ir_rvalue *stream; 2344}; 2345 2346/** 2347 * IR instruction for tessellation control and compute shader barrier. 2348 */ 2349class ir_barrier : public ir_instruction { 2350public: 2351 ir_barrier() 2352 : ir_instruction(ir_type_barrier) 2353 { 2354 } 2355 2356 virtual void accept(ir_visitor *v) 2357 { 2358 v->visit(this); 2359 } 2360 2361 virtual ir_barrier *clone(void *mem_ctx, struct hash_table *) const 2362 { 2363 return new(mem_ctx) ir_barrier(); 2364 } 2365 2366 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2367}; 2368 2369/*@}*/ 2370 2371/** 2372 * Apply a visitor to each IR node in a list 2373 */ 2374void 2375visit_exec_list(exec_list *list, ir_visitor *visitor); 2376 2377/** 2378 * Validate invariants on each IR node in a list 2379 */ 2380void validate_ir_tree(exec_list *instructions); 2381 2382struct _mesa_glsl_parse_state; 2383struct gl_shader_program; 2384 2385/** 2386 * Detect whether an unlinked shader contains static recursion 2387 * 2388 * If the list of instructions is determined to contain static recursion, 2389 * \c _mesa_glsl_error will be called to emit error messages for each function 2390 * that is in the recursion cycle. 2391 */ 2392void 2393detect_recursion_unlinked(struct _mesa_glsl_parse_state *state, 2394 exec_list *instructions); 2395 2396/** 2397 * Detect whether a linked shader contains static recursion 2398 * 2399 * If the list of instructions is determined to contain static recursion, 2400 * \c link_error_printf will be called to emit error messages for each function 2401 * that is in the recursion cycle. In addition, 2402 * \c gl_shader_program::LinkStatus will be set to false. 2403 */ 2404void 2405detect_recursion_linked(struct gl_shader_program *prog, 2406 exec_list *instructions); 2407 2408/** 2409 * Make a clone of each IR instruction in a list 2410 * 2411 * \param in List of IR instructions that are to be cloned 2412 * \param out List to hold the cloned instructions 2413 */ 2414void 2415clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 2416 2417extern void 2418_mesa_glsl_initialize_variables(exec_list *instructions, 2419 struct _mesa_glsl_parse_state *state); 2420 2421extern void 2422reparent_ir(exec_list *list, void *mem_ctx); 2423 2424extern void 2425do_set_program_inouts(exec_list *instructions, struct gl_program *prog, 2426 gl_shader_stage shader_stage); 2427 2428extern char * 2429prototype_string(const glsl_type *return_type, const char *name, 2430 exec_list *parameters); 2431 2432const char * 2433mode_string(const ir_variable *var); 2434 2435/** 2436 * Built-in / reserved GL variables names start with "gl_" 2437 */ 2438static inline bool 2439is_gl_identifier(const char *s) 2440{ 2441 return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_'; 2442} 2443 2444extern "C" { 2445#endif /* __cplusplus */ 2446 2447extern void _mesa_print_ir(FILE *f, struct exec_list *instructions, 2448 struct _mesa_glsl_parse_state *state); 2449 2450extern void 2451fprint_ir(FILE *f, const void *instruction); 2452 2453extern const struct gl_builtin_uniform_desc * 2454_mesa_glsl_get_builtin_uniform_desc(const char *name); 2455 2456#ifdef __cplusplus 2457} /* extern "C" */ 2458#endif 2459 2460unsigned 2461vertices_per_prim(GLenum prim); 2462 2463#endif /* IR_H */ 2464