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