1 /* 2 * Copyright 2010 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 #include <string.h> 24 #include "main/core.h" /* for MAX2 */ 25 #include "ir.h" 26 #include "compiler/glsl_types.h" 27 28 ir_rvalue::ir_rvalue(enum ir_node_type t) 29 : ir_instruction(t) 30 { 31 this->type = glsl_type::error_type; 32 } 33 34 bool ir_rvalue::is_zero() const 35 { 36 return false; 37 } 38 39 bool ir_rvalue::is_one() const 40 { 41 return false; 42 } 43 44 bool ir_rvalue::is_negative_one() const 45 { 46 return false; 47 } 48 49 /** 50 * Modify the swizzle make to move one component to another 51 * 52 * \param m IR swizzle to be modified 53 * \param from Component in the RHS that is to be swizzled 54 * \param to Desired swizzle location of \c from 55 */ 56 static void 57 update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to) 58 { 59 switch (to) { 60 case 0: m.x = from; break; 61 case 1: m.y = from; break; 62 case 2: m.z = from; break; 63 case 3: m.w = from; break; 64 default: assert(!"Should not get here."); 65 } 66 } 67 68 void 69 ir_assignment::set_lhs(ir_rvalue *lhs) 70 { 71 void *mem_ctx = this; 72 bool swizzled = false; 73 74 while (lhs != NULL) { 75 ir_swizzle *swiz = lhs->as_swizzle(); 76 77 if (swiz == NULL) 78 break; 79 80 unsigned write_mask = 0; 81 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 }; 82 83 for (unsigned i = 0; i < swiz->mask.num_components; i++) { 84 unsigned c = 0; 85 86 switch (i) { 87 case 0: c = swiz->mask.x; break; 88 case 1: c = swiz->mask.y; break; 89 case 2: c = swiz->mask.z; break; 90 case 3: c = swiz->mask.w; break; 91 default: assert(!"Should not get here."); 92 } 93 94 write_mask |= (((this->write_mask >> i) & 1) << c); 95 update_rhs_swizzle(rhs_swiz, i, c); 96 rhs_swiz.num_components = swiz->val->type->vector_elements; 97 } 98 99 this->write_mask = write_mask; 100 lhs = swiz->val; 101 102 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz); 103 swizzled = true; 104 } 105 106 if (swizzled) { 107 /* Now, RHS channels line up with the LHS writemask. Collapse it 108 * to just the channels that will be written. 109 */ 110 ir_swizzle_mask rhs_swiz = { 0, 0, 0, 0, 0, 0 }; 111 int rhs_chan = 0; 112 for (int i = 0; i < 4; i++) { 113 if (write_mask & (1 << i)) 114 update_rhs_swizzle(rhs_swiz, i, rhs_chan++); 115 } 116 rhs_swiz.num_components = rhs_chan; 117 this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz); 118 } 119 120 assert((lhs == NULL) || lhs->as_dereference()); 121 122 this->lhs = (ir_dereference *) lhs; 123 } 124 125 ir_variable * 126 ir_assignment::whole_variable_written() 127 { 128 ir_variable *v = this->lhs->whole_variable_referenced(); 129 130 if (v == NULL) 131 return NULL; 132 133 if (v->type->is_scalar()) 134 return v; 135 136 if (v->type->is_vector()) { 137 const unsigned mask = (1U << v->type->vector_elements) - 1; 138 139 if (mask != this->write_mask) 140 return NULL; 141 } 142 143 /* Either all the vector components are assigned or the variable is some 144 * composite type (and the whole thing is assigned. 145 */ 146 return v; 147 } 148 149 ir_assignment::ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, 150 ir_rvalue *condition, unsigned write_mask) 151 : ir_instruction(ir_type_assignment) 152 { 153 this->condition = condition; 154 this->rhs = rhs; 155 this->lhs = lhs; 156 this->write_mask = write_mask; 157 158 if (lhs->type->is_scalar() || lhs->type->is_vector()) { 159 int lhs_components = 0; 160 for (int i = 0; i < 4; i++) { 161 if (write_mask & (1 << i)) 162 lhs_components++; 163 } 164 165 assert(lhs_components == this->rhs->type->vector_elements); 166 } 167 } 168 169 ir_assignment::ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, 170 ir_rvalue *condition) 171 : ir_instruction(ir_type_assignment) 172 { 173 this->condition = condition; 174 this->rhs = rhs; 175 176 /* If the RHS is a vector type, assume that all components of the vector 177 * type are being written to the LHS. The write mask comes from the RHS 178 * because we can have a case where the LHS is a vec4 and the RHS is a 179 * vec3. In that case, the assignment is: 180 * 181 * (assign (...) (xyz) (var_ref lhs) (var_ref rhs)) 182 */ 183 if (rhs->type->is_vector()) 184 this->write_mask = (1U << rhs->type->vector_elements) - 1; 185 else if (rhs->type->is_scalar()) 186 this->write_mask = 1; 187 else 188 this->write_mask = 0; 189 190 this->set_lhs(lhs); 191 } 192 193 ir_expression::ir_expression(int op, const struct glsl_type *type, 194 ir_rvalue *op0, ir_rvalue *op1, 195 ir_rvalue *op2, ir_rvalue *op3) 196 : ir_rvalue(ir_type_expression) 197 { 198 this->type = type; 199 this->operation = ir_expression_operation(op); 200 this->operands[0] = op0; 201 this->operands[1] = op1; 202 this->operands[2] = op2; 203 this->operands[3] = op3; 204 #ifndef NDEBUG 205 int num_operands = get_num_operands(this->operation); 206 for (int i = num_operands; i < 4; i++) { 207 assert(this->operands[i] == NULL); 208 } 209 #endif 210 } 211 212 ir_expression::ir_expression(int op, ir_rvalue *op0) 213 : ir_rvalue(ir_type_expression) 214 { 215 this->operation = ir_expression_operation(op); 216 this->operands[0] = op0; 217 this->operands[1] = NULL; 218 this->operands[2] = NULL; 219 this->operands[3] = NULL; 220 221 assert(op <= ir_last_unop); 222 223 switch (this->operation) { 224 case ir_unop_bit_not: 225 case ir_unop_logic_not: 226 case ir_unop_neg: 227 case ir_unop_abs: 228 case ir_unop_sign: 229 case ir_unop_rcp: 230 case ir_unop_rsq: 231 case ir_unop_sqrt: 232 case ir_unop_exp: 233 case ir_unop_log: 234 case ir_unop_exp2: 235 case ir_unop_log2: 236 case ir_unop_trunc: 237 case ir_unop_ceil: 238 case ir_unop_floor: 239 case ir_unop_fract: 240 case ir_unop_round_even: 241 case ir_unop_sin: 242 case ir_unop_cos: 243 case ir_unop_dFdx: 244 case ir_unop_dFdx_coarse: 245 case ir_unop_dFdx_fine: 246 case ir_unop_dFdy: 247 case ir_unop_dFdy_coarse: 248 case ir_unop_dFdy_fine: 249 case ir_unop_bitfield_reverse: 250 case ir_unop_interpolate_at_centroid: 251 case ir_unop_saturate: 252 this->type = op0->type; 253 break; 254 255 case ir_unop_f2i: 256 case ir_unop_b2i: 257 case ir_unop_u2i: 258 case ir_unop_d2i: 259 case ir_unop_bitcast_f2i: 260 case ir_unop_bit_count: 261 case ir_unop_find_msb: 262 case ir_unop_find_lsb: 263 case ir_unop_subroutine_to_int: 264 this->type = glsl_type::get_instance(GLSL_TYPE_INT, 265 op0->type->vector_elements, 1); 266 break; 267 268 case ir_unop_b2f: 269 case ir_unop_i2f: 270 case ir_unop_u2f: 271 case ir_unop_d2f: 272 case ir_unop_bitcast_i2f: 273 case ir_unop_bitcast_u2f: 274 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, 275 op0->type->vector_elements, 1); 276 break; 277 278 case ir_unop_f2b: 279 case ir_unop_i2b: 280 case ir_unop_d2b: 281 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, 282 op0->type->vector_elements, 1); 283 break; 284 285 case ir_unop_f2d: 286 case ir_unop_i2d: 287 case ir_unop_u2d: 288 this->type = glsl_type::get_instance(GLSL_TYPE_DOUBLE, 289 op0->type->vector_elements, 1); 290 break; 291 292 case ir_unop_i2u: 293 case ir_unop_f2u: 294 case ir_unop_d2u: 295 case ir_unop_bitcast_f2u: 296 this->type = glsl_type::get_instance(GLSL_TYPE_UINT, 297 op0->type->vector_elements, 1); 298 break; 299 300 case ir_unop_noise: 301 this->type = glsl_type::float_type; 302 break; 303 304 case ir_unop_unpack_double_2x32: 305 this->type = glsl_type::uvec2_type; 306 break; 307 308 case ir_unop_pack_snorm_2x16: 309 case ir_unop_pack_snorm_4x8: 310 case ir_unop_pack_unorm_2x16: 311 case ir_unop_pack_unorm_4x8: 312 case ir_unop_pack_half_2x16: 313 this->type = glsl_type::uint_type; 314 break; 315 316 case ir_unop_pack_double_2x32: 317 this->type = glsl_type::double_type; 318 break; 319 320 case ir_unop_unpack_snorm_2x16: 321 case ir_unop_unpack_unorm_2x16: 322 case ir_unop_unpack_half_2x16: 323 this->type = glsl_type::vec2_type; 324 break; 325 326 case ir_unop_unpack_snorm_4x8: 327 case ir_unop_unpack_unorm_4x8: 328 this->type = glsl_type::vec4_type; 329 break; 330 331 case ir_unop_frexp_sig: 332 this->type = op0->type; 333 break; 334 case ir_unop_frexp_exp: 335 this->type = glsl_type::get_instance(GLSL_TYPE_INT, 336 op0->type->vector_elements, 1); 337 break; 338 339 case ir_unop_get_buffer_size: 340 case ir_unop_ssbo_unsized_array_length: 341 this->type = glsl_type::int_type; 342 break; 343 344 case ir_unop_vote_any: 345 case ir_unop_vote_all: 346 case ir_unop_vote_eq: 347 this->type = glsl_type::bool_type; 348 break; 349 350 default: 351 assert(!"not reached: missing automatic type setup for ir_expression"); 352 this->type = op0->type; 353 break; 354 } 355 } 356 357 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1) 358 : ir_rvalue(ir_type_expression) 359 { 360 this->operation = ir_expression_operation(op); 361 this->operands[0] = op0; 362 this->operands[1] = op1; 363 this->operands[2] = NULL; 364 this->operands[3] = NULL; 365 366 assert(op > ir_last_unop); 367 368 switch (this->operation) { 369 case ir_binop_all_equal: 370 case ir_binop_any_nequal: 371 this->type = glsl_type::bool_type; 372 break; 373 374 case ir_binop_add: 375 case ir_binop_sub: 376 case ir_binop_min: 377 case ir_binop_max: 378 case ir_binop_pow: 379 case ir_binop_mul: 380 case ir_binop_div: 381 case ir_binop_mod: 382 if (op0->type->is_scalar()) { 383 this->type = op1->type; 384 } else if (op1->type->is_scalar()) { 385 this->type = op0->type; 386 } else { 387 if (this->operation == ir_binop_mul) { 388 this->type = glsl_type::get_mul_type(op0->type, op1->type); 389 } else { 390 assert(op0->type == op1->type); 391 this->type = op0->type; 392 } 393 } 394 break; 395 396 case ir_binop_logic_and: 397 case ir_binop_logic_xor: 398 case ir_binop_logic_or: 399 case ir_binop_bit_and: 400 case ir_binop_bit_xor: 401 case ir_binop_bit_or: 402 assert(!op0->type->is_matrix()); 403 assert(!op1->type->is_matrix()); 404 if (op0->type->is_scalar()) { 405 this->type = op1->type; 406 } else if (op1->type->is_scalar()) { 407 this->type = op0->type; 408 } else { 409 assert(op0->type->vector_elements == op1->type->vector_elements); 410 this->type = op0->type; 411 } 412 break; 413 414 case ir_binop_equal: 415 case ir_binop_nequal: 416 case ir_binop_lequal: 417 case ir_binop_gequal: 418 case ir_binop_less: 419 case ir_binop_greater: 420 assert(op0->type == op1->type); 421 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, 422 op0->type->vector_elements, 1); 423 break; 424 425 case ir_binop_dot: 426 this->type = op0->type->get_base_type(); 427 break; 428 429 case ir_binop_imul_high: 430 case ir_binop_carry: 431 case ir_binop_borrow: 432 case ir_binop_lshift: 433 case ir_binop_rshift: 434 case ir_binop_ldexp: 435 case ir_binop_interpolate_at_offset: 436 case ir_binop_interpolate_at_sample: 437 this->type = op0->type; 438 break; 439 440 case ir_binop_vector_extract: 441 this->type = op0->type->get_scalar_type(); 442 break; 443 444 default: 445 assert(!"not reached: missing automatic type setup for ir_expression"); 446 this->type = glsl_type::float_type; 447 } 448 } 449 450 ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, 451 ir_rvalue *op2) 452 : ir_rvalue(ir_type_expression) 453 { 454 this->operation = ir_expression_operation(op); 455 this->operands[0] = op0; 456 this->operands[1] = op1; 457 this->operands[2] = op2; 458 this->operands[3] = NULL; 459 460 assert(op > ir_last_binop && op <= ir_last_triop); 461 462 switch (this->operation) { 463 case ir_triop_fma: 464 case ir_triop_lrp: 465 case ir_triop_bitfield_extract: 466 case ir_triop_vector_insert: 467 this->type = op0->type; 468 break; 469 470 case ir_triop_csel: 471 this->type = op1->type; 472 break; 473 474 default: 475 assert(!"not reached: missing automatic type setup for ir_expression"); 476 this->type = glsl_type::float_type; 477 } 478 } 479 480 unsigned int 481 ir_expression::get_num_operands(ir_expression_operation op) 482 { 483 assert(op <= ir_last_opcode); 484 485 if (op <= ir_last_unop) 486 return 1; 487 488 if (op <= ir_last_binop) 489 return 2; 490 491 if (op <= ir_last_triop) 492 return 3; 493 494 if (op <= ir_last_quadop) 495 return 4; 496 497 assert(false); 498 return 0; 499 } 500 501 #include "ir_expression_operation_strings.h" 502 503 const char* 504 depth_layout_string(ir_depth_layout layout) 505 { 506 switch(layout) { 507 case ir_depth_layout_none: return ""; 508 case ir_depth_layout_any: return "depth_any"; 509 case ir_depth_layout_greater: return "depth_greater"; 510 case ir_depth_layout_less: return "depth_less"; 511 case ir_depth_layout_unchanged: return "depth_unchanged"; 512 513 default: 514 assert(0); 515 return ""; 516 } 517 } 518 519 ir_expression_operation 520 ir_expression::get_operator(const char *str) 521 { 522 for (int op = 0; op <= int(ir_last_opcode); op++) { 523 if (strcmp(str, ir_expression_operation_strings[op]) == 0) 524 return (ir_expression_operation) op; 525 } 526 return (ir_expression_operation) -1; 527 } 528 529 ir_variable * 530 ir_expression::variable_referenced() const 531 { 532 switch (operation) { 533 case ir_binop_vector_extract: 534 case ir_triop_vector_insert: 535 /* We get these for things like a[0] where a is a vector type. In these 536 * cases we want variable_referenced() to return the actual vector 537 * variable this is wrapping. 538 */ 539 return operands[0]->variable_referenced(); 540 default: 541 return ir_rvalue::variable_referenced(); 542 } 543 } 544 545 ir_constant::ir_constant() 546 : ir_rvalue(ir_type_constant) 547 { 548 this->array_elements = NULL; 549 } 550 551 ir_constant::ir_constant(const struct glsl_type *type, 552 const ir_constant_data *data) 553 : ir_rvalue(ir_type_constant) 554 { 555 this->array_elements = NULL; 556 557 assert((type->base_type >= GLSL_TYPE_UINT) 558 && (type->base_type <= GLSL_TYPE_BOOL)); 559 560 this->type = type; 561 memcpy(& this->value, data, sizeof(this->value)); 562 } 563 564 ir_constant::ir_constant(float f, unsigned vector_elements) 565 : ir_rvalue(ir_type_constant) 566 { 567 assert(vector_elements <= 4); 568 this->type = glsl_type::get_instance(GLSL_TYPE_FLOAT, vector_elements, 1); 569 for (unsigned i = 0; i < vector_elements; i++) { 570 this->value.f[i] = f; 571 } 572 for (unsigned i = vector_elements; i < 16; i++) { 573 this->value.f[i] = 0; 574 } 575 } 576 577 ir_constant::ir_constant(double d, unsigned vector_elements) 578 : ir_rvalue(ir_type_constant) 579 { 580 assert(vector_elements <= 4); 581 this->type = glsl_type::get_instance(GLSL_TYPE_DOUBLE, vector_elements, 1); 582 for (unsigned i = 0; i < vector_elements; i++) { 583 this->value.d[i] = d; 584 } 585 for (unsigned i = vector_elements; i < 16; i++) { 586 this->value.d[i] = 0.0; 587 } 588 } 589 590 ir_constant::ir_constant(unsigned int u, unsigned vector_elements) 591 : ir_rvalue(ir_type_constant) 592 { 593 assert(vector_elements <= 4); 594 this->type = glsl_type::get_instance(GLSL_TYPE_UINT, vector_elements, 1); 595 for (unsigned i = 0; i < vector_elements; i++) { 596 this->value.u[i] = u; 597 } 598 for (unsigned i = vector_elements; i < 16; i++) { 599 this->value.u[i] = 0; 600 } 601 } 602 603 ir_constant::ir_constant(int integer, unsigned vector_elements) 604 : ir_rvalue(ir_type_constant) 605 { 606 assert(vector_elements <= 4); 607 this->type = glsl_type::get_instance(GLSL_TYPE_INT, vector_elements, 1); 608 for (unsigned i = 0; i < vector_elements; i++) { 609 this->value.i[i] = integer; 610 } 611 for (unsigned i = vector_elements; i < 16; i++) { 612 this->value.i[i] = 0; 613 } 614 } 615 616 ir_constant::ir_constant(bool b, unsigned vector_elements) 617 : ir_rvalue(ir_type_constant) 618 { 619 assert(vector_elements <= 4); 620 this->type = glsl_type::get_instance(GLSL_TYPE_BOOL, vector_elements, 1); 621 for (unsigned i = 0; i < vector_elements; i++) { 622 this->value.b[i] = b; 623 } 624 for (unsigned i = vector_elements; i < 16; i++) { 625 this->value.b[i] = false; 626 } 627 } 628 629 ir_constant::ir_constant(const ir_constant *c, unsigned i) 630 : ir_rvalue(ir_type_constant) 631 { 632 this->array_elements = NULL; 633 this->type = c->type->get_base_type(); 634 635 switch (this->type->base_type) { 636 case GLSL_TYPE_UINT: this->value.u[0] = c->value.u[i]; break; 637 case GLSL_TYPE_INT: this->value.i[0] = c->value.i[i]; break; 638 case GLSL_TYPE_FLOAT: this->value.f[0] = c->value.f[i]; break; 639 case GLSL_TYPE_BOOL: this->value.b[0] = c->value.b[i]; break; 640 case GLSL_TYPE_DOUBLE: this->value.d[0] = c->value.d[i]; break; 641 default: assert(!"Should not get here."); break; 642 } 643 } 644 645 ir_constant::ir_constant(const struct glsl_type *type, exec_list *value_list) 646 : ir_rvalue(ir_type_constant) 647 { 648 this->array_elements = NULL; 649 this->type = type; 650 651 assert(type->is_scalar() || type->is_vector() || type->is_matrix() 652 || type->is_record() || type->is_array()); 653 654 if (type->is_array()) { 655 this->array_elements = ralloc_array(this, ir_constant *, type->length); 656 unsigned i = 0; 657 foreach_in_list(ir_constant, value, value_list) { 658 assert(value->as_constant() != NULL); 659 660 this->array_elements[i++] = value; 661 } 662 return; 663 } 664 665 /* If the constant is a record, the types of each of the entries in 666 * value_list must be a 1-for-1 match with the structure components. Each 667 * entry must also be a constant. Just move the nodes from the value_list 668 * to the list in the ir_constant. 669 */ 670 /* FINISHME: Should there be some type checking and / or assertions here? */ 671 /* FINISHME: Should the new constant take ownership of the nodes from 672 * FINISHME: value_list, or should it make copies? 673 */ 674 if (type->is_record()) { 675 value_list->move_nodes_to(& this->components); 676 return; 677 } 678 679 for (unsigned i = 0; i < 16; i++) { 680 this->value.u[i] = 0; 681 } 682 683 ir_constant *value = (ir_constant *) (value_list->get_head_raw()); 684 685 /* Constructors with exactly one scalar argument are special for vectors 686 * and matrices. For vectors, the scalar value is replicated to fill all 687 * the components. For matrices, the scalar fills the components of the 688 * diagonal while the rest is filled with 0. 689 */ 690 if (value->type->is_scalar() && value->next->is_tail_sentinel()) { 691 if (type->is_matrix()) { 692 /* Matrix - fill diagonal (rest is already set to 0) */ 693 assert(type->base_type == GLSL_TYPE_FLOAT || 694 type->base_type == GLSL_TYPE_DOUBLE); 695 for (unsigned i = 0; i < type->matrix_columns; i++) { 696 if (type->base_type == GLSL_TYPE_FLOAT) 697 this->value.f[i * type->vector_elements + i] = 698 value->value.f[0]; 699 else 700 this->value.d[i * type->vector_elements + i] = 701 value->value.d[0]; 702 } 703 } else { 704 /* Vector or scalar - fill all components */ 705 switch (type->base_type) { 706 case GLSL_TYPE_UINT: 707 case GLSL_TYPE_INT: 708 for (unsigned i = 0; i < type->components(); i++) 709 this->value.u[i] = value->value.u[0]; 710 break; 711 case GLSL_TYPE_FLOAT: 712 for (unsigned i = 0; i < type->components(); i++) 713 this->value.f[i] = value->value.f[0]; 714 break; 715 case GLSL_TYPE_DOUBLE: 716 for (unsigned i = 0; i < type->components(); i++) 717 this->value.d[i] = value->value.d[0]; 718 break; 719 case GLSL_TYPE_BOOL: 720 for (unsigned i = 0; i < type->components(); i++) 721 this->value.b[i] = value->value.b[0]; 722 break; 723 default: 724 assert(!"Should not get here."); 725 break; 726 } 727 } 728 return; 729 } 730 731 if (type->is_matrix() && value->type->is_matrix()) { 732 assert(value->next->is_tail_sentinel()); 733 734 /* From section 5.4.2 of the GLSL 1.20 spec: 735 * "If a matrix is constructed from a matrix, then each component 736 * (column i, row j) in the result that has a corresponding component 737 * (column i, row j) in the argument will be initialized from there." 738 */ 739 unsigned cols = MIN2(type->matrix_columns, value->type->matrix_columns); 740 unsigned rows = MIN2(type->vector_elements, value->type->vector_elements); 741 for (unsigned i = 0; i < cols; i++) { 742 for (unsigned j = 0; j < rows; j++) { 743 const unsigned src = i * value->type->vector_elements + j; 744 const unsigned dst = i * type->vector_elements + j; 745 this->value.f[dst] = value->value.f[src]; 746 } 747 } 748 749 /* "All other components will be initialized to the identity matrix." */ 750 for (unsigned i = cols; i < type->matrix_columns; i++) 751 this->value.f[i * type->vector_elements + i] = 1.0; 752 753 return; 754 } 755 756 /* Use each component from each entry in the value_list to initialize one 757 * component of the constant being constructed. 758 */ 759 unsigned i = 0; 760 for (;;) { 761 assert(value->as_constant() != NULL); 762 assert(!value->is_tail_sentinel()); 763 764 for (unsigned j = 0; j < value->type->components(); j++) { 765 switch (type->base_type) { 766 case GLSL_TYPE_UINT: 767 this->value.u[i] = value->get_uint_component(j); 768 break; 769 case GLSL_TYPE_INT: 770 this->value.i[i] = value->get_int_component(j); 771 break; 772 case GLSL_TYPE_FLOAT: 773 this->value.f[i] = value->get_float_component(j); 774 break; 775 case GLSL_TYPE_BOOL: 776 this->value.b[i] = value->get_bool_component(j); 777 break; 778 case GLSL_TYPE_DOUBLE: 779 this->value.d[i] = value->get_double_component(j); 780 break; 781 default: 782 /* FINISHME: What to do? Exceptions are not the answer. 783 */ 784 break; 785 } 786 787 i++; 788 if (i >= type->components()) 789 break; 790 } 791 792 if (i >= type->components()) 793 break; /* avoid downcasting a list sentinel */ 794 value = (ir_constant *) value->next; 795 } 796 } 797 798 ir_constant * 799 ir_constant::zero(void *mem_ctx, const glsl_type *type) 800 { 801 assert(type->is_scalar() || type->is_vector() || type->is_matrix() 802 || type->is_record() || type->is_array()); 803 804 ir_constant *c = new(mem_ctx) ir_constant; 805 c->type = type; 806 memset(&c->value, 0, sizeof(c->value)); 807 808 if (type->is_array()) { 809 c->array_elements = ralloc_array(c, ir_constant *, type->length); 810 811 for (unsigned i = 0; i < type->length; i++) 812 c->array_elements[i] = ir_constant::zero(c, type->fields.array); 813 } 814 815 if (type->is_record()) { 816 for (unsigned i = 0; i < type->length; i++) { 817 ir_constant *comp = ir_constant::zero(mem_ctx, type->fields.structure[i].type); 818 c->components.push_tail(comp); 819 } 820 } 821 822 return c; 823 } 824 825 bool 826 ir_constant::get_bool_component(unsigned i) const 827 { 828 switch (this->type->base_type) { 829 case GLSL_TYPE_UINT: return this->value.u[i] != 0; 830 case GLSL_TYPE_INT: return this->value.i[i] != 0; 831 case GLSL_TYPE_FLOAT: return ((int)this->value.f[i]) != 0; 832 case GLSL_TYPE_BOOL: return this->value.b[i]; 833 case GLSL_TYPE_DOUBLE: return this->value.d[i] != 0.0; 834 default: assert(!"Should not get here."); break; 835 } 836 837 /* Must return something to make the compiler happy. This is clearly an 838 * error case. 839 */ 840 return false; 841 } 842 843 float 844 ir_constant::get_float_component(unsigned i) const 845 { 846 switch (this->type->base_type) { 847 case GLSL_TYPE_UINT: return (float) this->value.u[i]; 848 case GLSL_TYPE_INT: return (float) this->value.i[i]; 849 case GLSL_TYPE_FLOAT: return this->value.f[i]; 850 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0f : 0.0f; 851 case GLSL_TYPE_DOUBLE: return (float) this->value.d[i]; 852 default: assert(!"Should not get here."); break; 853 } 854 855 /* Must return something to make the compiler happy. This is clearly an 856 * error case. 857 */ 858 return 0.0; 859 } 860 861 double 862 ir_constant::get_double_component(unsigned i) const 863 { 864 switch (this->type->base_type) { 865 case GLSL_TYPE_UINT: return (double) this->value.u[i]; 866 case GLSL_TYPE_INT: return (double) this->value.i[i]; 867 case GLSL_TYPE_FLOAT: return (double) this->value.f[i]; 868 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1.0 : 0.0; 869 case GLSL_TYPE_DOUBLE: return this->value.d[i]; 870 default: assert(!"Should not get here."); break; 871 } 872 873 /* Must return something to make the compiler happy. This is clearly an 874 * error case. 875 */ 876 return 0.0; 877 } 878 879 int 880 ir_constant::get_int_component(unsigned i) const 881 { 882 switch (this->type->base_type) { 883 case GLSL_TYPE_UINT: return this->value.u[i]; 884 case GLSL_TYPE_INT: return this->value.i[i]; 885 case GLSL_TYPE_FLOAT: return (int) this->value.f[i]; 886 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0; 887 case GLSL_TYPE_DOUBLE: return (int) this->value.d[i]; 888 default: assert(!"Should not get here."); break; 889 } 890 891 /* Must return something to make the compiler happy. This is clearly an 892 * error case. 893 */ 894 return 0; 895 } 896 897 unsigned 898 ir_constant::get_uint_component(unsigned i) const 899 { 900 switch (this->type->base_type) { 901 case GLSL_TYPE_UINT: return this->value.u[i]; 902 case GLSL_TYPE_INT: return this->value.i[i]; 903 case GLSL_TYPE_FLOAT: return (unsigned) this->value.f[i]; 904 case GLSL_TYPE_BOOL: return this->value.b[i] ? 1 : 0; 905 case GLSL_TYPE_DOUBLE: return (unsigned) this->value.d[i]; 906 default: assert(!"Should not get here."); break; 907 } 908 909 /* Must return something to make the compiler happy. This is clearly an 910 * error case. 911 */ 912 return 0; 913 } 914 915 ir_constant * 916 ir_constant::get_array_element(unsigned i) const 917 { 918 assert(this->type->is_array()); 919 920 /* From page 35 (page 41 of the PDF) of the GLSL 1.20 spec: 921 * 922 * "Behavior is undefined if a shader subscripts an array with an index 923 * less than 0 or greater than or equal to the size the array was 924 * declared with." 925 * 926 * Most out-of-bounds accesses are removed before things could get this far. 927 * There are cases where non-constant array index values can get constant 928 * folded. 929 */ 930 if (int(i) < 0) 931 i = 0; 932 else if (i >= this->type->length) 933 i = this->type->length - 1; 934 935 return array_elements[i]; 936 } 937 938 ir_constant * 939 ir_constant::get_record_field(const char *name) 940 { 941 int idx = this->type->field_index(name); 942 943 if (idx < 0) 944 return NULL; 945 946 if (this->components.is_empty()) 947 return NULL; 948 949 exec_node *node = this->components.get_head_raw(); 950 for (int i = 0; i < idx; i++) { 951 node = node->next; 952 953 /* If the end of the list is encountered before the element matching the 954 * requested field is found, return NULL. 955 */ 956 if (node->is_tail_sentinel()) 957 return NULL; 958 } 959 960 return (ir_constant *) node; 961 } 962 963 void 964 ir_constant::copy_offset(ir_constant *src, int offset) 965 { 966 switch (this->type->base_type) { 967 case GLSL_TYPE_UINT: 968 case GLSL_TYPE_INT: 969 case GLSL_TYPE_FLOAT: 970 case GLSL_TYPE_DOUBLE: 971 case GLSL_TYPE_BOOL: { 972 unsigned int size = src->type->components(); 973 assert (size <= this->type->components() - offset); 974 for (unsigned int i=0; i<size; i++) { 975 switch (this->type->base_type) { 976 case GLSL_TYPE_UINT: 977 value.u[i+offset] = src->get_uint_component(i); 978 break; 979 case GLSL_TYPE_INT: 980 value.i[i+offset] = src->get_int_component(i); 981 break; 982 case GLSL_TYPE_FLOAT: 983 value.f[i+offset] = src->get_float_component(i); 984 break; 985 case GLSL_TYPE_BOOL: 986 value.b[i+offset] = src->get_bool_component(i); 987 break; 988 case GLSL_TYPE_DOUBLE: 989 value.d[i+offset] = src->get_double_component(i); 990 break; 991 default: // Shut up the compiler 992 break; 993 } 994 } 995 break; 996 } 997 998 case GLSL_TYPE_STRUCT: { 999 assert (src->type == this->type); 1000 this->components.make_empty(); 1001 foreach_in_list(ir_constant, orig, &src->components) { 1002 this->components.push_tail(orig->clone(this, NULL)); 1003 } 1004 break; 1005 } 1006 1007 case GLSL_TYPE_ARRAY: { 1008 assert (src->type == this->type); 1009 for (unsigned i = 0; i < this->type->length; i++) { 1010 this->array_elements[i] = src->array_elements[i]->clone(this, NULL); 1011 } 1012 break; 1013 } 1014 1015 default: 1016 assert(!"Should not get here."); 1017 break; 1018 } 1019 } 1020 1021 void 1022 ir_constant::copy_masked_offset(ir_constant *src, int offset, unsigned int mask) 1023 { 1024 assert (!type->is_array() && !type->is_record()); 1025 1026 if (!type->is_vector() && !type->is_matrix()) { 1027 offset = 0; 1028 mask = 1; 1029 } 1030 1031 int id = 0; 1032 for (int i=0; i<4; i++) { 1033 if (mask & (1 << i)) { 1034 switch (this->type->base_type) { 1035 case GLSL_TYPE_UINT: 1036 value.u[i+offset] = src->get_uint_component(id++); 1037 break; 1038 case GLSL_TYPE_INT: 1039 value.i[i+offset] = src->get_int_component(id++); 1040 break; 1041 case GLSL_TYPE_FLOAT: 1042 value.f[i+offset] = src->get_float_component(id++); 1043 break; 1044 case GLSL_TYPE_BOOL: 1045 value.b[i+offset] = src->get_bool_component(id++); 1046 break; 1047 case GLSL_TYPE_DOUBLE: 1048 value.d[i+offset] = src->get_double_component(id++); 1049 break; 1050 default: 1051 assert(!"Should not get here."); 1052 return; 1053 } 1054 } 1055 } 1056 } 1057 1058 bool 1059 ir_constant::has_value(const ir_constant *c) const 1060 { 1061 if (this->type != c->type) 1062 return false; 1063 1064 if (this->type->is_array()) { 1065 for (unsigned i = 0; i < this->type->length; i++) { 1066 if (!this->array_elements[i]->has_value(c->array_elements[i])) 1067 return false; 1068 } 1069 return true; 1070 } 1071 1072 if (this->type->base_type == GLSL_TYPE_STRUCT) { 1073 const exec_node *a_node = this->components.get_head_raw(); 1074 const exec_node *b_node = c->components.get_head_raw(); 1075 1076 while (!a_node->is_tail_sentinel()) { 1077 assert(!b_node->is_tail_sentinel()); 1078 1079 const ir_constant *const a_field = (ir_constant *) a_node; 1080 const ir_constant *const b_field = (ir_constant *) b_node; 1081 1082 if (!a_field->has_value(b_field)) 1083 return false; 1084 1085 a_node = a_node->next; 1086 b_node = b_node->next; 1087 } 1088 1089 return true; 1090 } 1091 1092 for (unsigned i = 0; i < this->type->components(); i++) { 1093 switch (this->type->base_type) { 1094 case GLSL_TYPE_UINT: 1095 if (this->value.u[i] != c->value.u[i]) 1096 return false; 1097 break; 1098 case GLSL_TYPE_INT: 1099 if (this->value.i[i] != c->value.i[i]) 1100 return false; 1101 break; 1102 case GLSL_TYPE_FLOAT: 1103 if (this->value.f[i] != c->value.f[i]) 1104 return false; 1105 break; 1106 case GLSL_TYPE_BOOL: 1107 if (this->value.b[i] != c->value.b[i]) 1108 return false; 1109 break; 1110 case GLSL_TYPE_DOUBLE: 1111 if (this->value.d[i] != c->value.d[i]) 1112 return false; 1113 break; 1114 default: 1115 assert(!"Should not get here."); 1116 return false; 1117 } 1118 } 1119 1120 return true; 1121 } 1122 1123 bool 1124 ir_constant::is_value(float f, int i) const 1125 { 1126 if (!this->type->is_scalar() && !this->type->is_vector()) 1127 return false; 1128 1129 /* Only accept boolean values for 0/1. */ 1130 if (int(bool(i)) != i && this->type->is_boolean()) 1131 return false; 1132 1133 for (unsigned c = 0; c < this->type->vector_elements; c++) { 1134 switch (this->type->base_type) { 1135 case GLSL_TYPE_FLOAT: 1136 if (this->value.f[c] != f) 1137 return false; 1138 break; 1139 case GLSL_TYPE_INT: 1140 if (this->value.i[c] != i) 1141 return false; 1142 break; 1143 case GLSL_TYPE_UINT: 1144 if (this->value.u[c] != unsigned(i)) 1145 return false; 1146 break; 1147 case GLSL_TYPE_BOOL: 1148 if (this->value.b[c] != bool(i)) 1149 return false; 1150 break; 1151 case GLSL_TYPE_DOUBLE: 1152 if (this->value.d[c] != double(f)) 1153 return false; 1154 break; 1155 default: 1156 /* The only other base types are structures, arrays, and samplers. 1157 * Samplers cannot be constants, and the others should have been 1158 * filtered out above. 1159 */ 1160 assert(!"Should not get here."); 1161 return false; 1162 } 1163 } 1164 1165 return true; 1166 } 1167 1168 bool 1169 ir_constant::is_zero() const 1170 { 1171 return is_value(0.0, 0); 1172 } 1173 1174 bool 1175 ir_constant::is_one() const 1176 { 1177 return is_value(1.0, 1); 1178 } 1179 1180 bool 1181 ir_constant::is_negative_one() const 1182 { 1183 return is_value(-1.0, -1); 1184 } 1185 1186 bool 1187 ir_constant::is_uint16_constant() const 1188 { 1189 if (!type->is_integer()) 1190 return false; 1191 1192 return value.u[0] < (1 << 16); 1193 } 1194 1195 ir_loop::ir_loop() 1196 : ir_instruction(ir_type_loop) 1197 { 1198 } 1199 1200 1201 ir_dereference_variable::ir_dereference_variable(ir_variable *var) 1202 : ir_dereference(ir_type_dereference_variable) 1203 { 1204 assert(var != NULL); 1205 1206 this->var = var; 1207 this->type = var->type; 1208 } 1209 1210 1211 ir_dereference_array::ir_dereference_array(ir_rvalue *value, 1212 ir_rvalue *array_index) 1213 : ir_dereference(ir_type_dereference_array) 1214 { 1215 this->array_index = array_index; 1216 this->set_array(value); 1217 } 1218 1219 1220 ir_dereference_array::ir_dereference_array(ir_variable *var, 1221 ir_rvalue *array_index) 1222 : ir_dereference(ir_type_dereference_array) 1223 { 1224 void *ctx = ralloc_parent(var); 1225 1226 this->array_index = array_index; 1227 this->set_array(new(ctx) ir_dereference_variable(var)); 1228 } 1229 1230 1231 void 1232 ir_dereference_array::set_array(ir_rvalue *value) 1233 { 1234 assert(value != NULL); 1235 1236 this->array = value; 1237 1238 const glsl_type *const vt = this->array->type; 1239 1240 if (vt->is_array()) { 1241 type = vt->fields.array; 1242 } else if (vt->is_matrix()) { 1243 type = vt->column_type(); 1244 } else if (vt->is_vector()) { 1245 type = vt->get_base_type(); 1246 } 1247 } 1248 1249 1250 ir_dereference_record::ir_dereference_record(ir_rvalue *value, 1251 const char *field) 1252 : ir_dereference(ir_type_dereference_record) 1253 { 1254 assert(value != NULL); 1255 1256 this->record = value; 1257 this->field = ralloc_strdup(this, field); 1258 this->type = this->record->type->field_type(field); 1259 } 1260 1261 1262 ir_dereference_record::ir_dereference_record(ir_variable *var, 1263 const char *field) 1264 : ir_dereference(ir_type_dereference_record) 1265 { 1266 void *ctx = ralloc_parent(var); 1267 1268 this->record = new(ctx) ir_dereference_variable(var); 1269 this->field = ralloc_strdup(this, field); 1270 this->type = this->record->type->field_type(field); 1271 } 1272 1273 bool 1274 ir_dereference::is_lvalue() const 1275 { 1276 ir_variable *var = this->variable_referenced(); 1277 1278 /* Every l-value derference chain eventually ends in a variable. 1279 */ 1280 if ((var == NULL) || var->data.read_only) 1281 return false; 1282 1283 /* From section 4.1.7 of the GLSL 4.40 spec: 1284 * 1285 * "Opaque variables cannot be treated as l-values; hence cannot 1286 * be used as out or inout function parameters, nor can they be 1287 * assigned into." 1288 */ 1289 if (this->type->contains_opaque()) 1290 return false; 1291 1292 return true; 1293 } 1294 1295 1296 static const char * const tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4", "query_levels", "texture_samples", "samples_identical" }; 1297 1298 const char *ir_texture::opcode_string() 1299 { 1300 assert((unsigned int) op < ARRAY_SIZE(tex_opcode_strs)); 1301 return tex_opcode_strs[op]; 1302 } 1303 1304 ir_texture_opcode 1305 ir_texture::get_opcode(const char *str) 1306 { 1307 const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); 1308 for (int op = 0; op < count; op++) { 1309 if (strcmp(str, tex_opcode_strs[op]) == 0) 1310 return (ir_texture_opcode) op; 1311 } 1312 return (ir_texture_opcode) -1; 1313 } 1314 1315 1316 void 1317 ir_texture::set_sampler(ir_dereference *sampler, const glsl_type *type) 1318 { 1319 assert(sampler != NULL); 1320 assert(type != NULL); 1321 this->sampler = sampler; 1322 this->type = type; 1323 1324 if (this->op == ir_txs || this->op == ir_query_levels || 1325 this->op == ir_texture_samples) { 1326 assert(type->base_type == GLSL_TYPE_INT); 1327 } else if (this->op == ir_lod) { 1328 assert(type->vector_elements == 2); 1329 assert(type->base_type == GLSL_TYPE_FLOAT); 1330 } else if (this->op == ir_samples_identical) { 1331 assert(type == glsl_type::bool_type); 1332 assert(sampler->type->base_type == GLSL_TYPE_SAMPLER); 1333 assert(sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS); 1334 } else { 1335 assert(sampler->type->sampled_type == (int) type->base_type); 1336 if (sampler->type->sampler_shadow) 1337 assert(type->vector_elements == 4 || type->vector_elements == 1); 1338 else 1339 assert(type->vector_elements == 4); 1340 } 1341 } 1342 1343 1344 void 1345 ir_swizzle::init_mask(const unsigned *comp, unsigned count) 1346 { 1347 assert((count >= 1) && (count <= 4)); 1348 1349 memset(&this->mask, 0, sizeof(this->mask)); 1350 this->mask.num_components = count; 1351 1352 unsigned dup_mask = 0; 1353 switch (count) { 1354 case 4: 1355 assert(comp[3] <= 3); 1356 dup_mask |= (1U << comp[3]) 1357 & ((1U << comp[0]) | (1U << comp[1]) | (1U << comp[2])); 1358 this->mask.w = comp[3]; 1359 1360 case 3: 1361 assert(comp[2] <= 3); 1362 dup_mask |= (1U << comp[2]) 1363 & ((1U << comp[0]) | (1U << comp[1])); 1364 this->mask.z = comp[2]; 1365 1366 case 2: 1367 assert(comp[1] <= 3); 1368 dup_mask |= (1U << comp[1]) 1369 & ((1U << comp[0])); 1370 this->mask.y = comp[1]; 1371 1372 case 1: 1373 assert(comp[0] <= 3); 1374 this->mask.x = comp[0]; 1375 } 1376 1377 this->mask.has_duplicates = dup_mask != 0; 1378 1379 /* Based on the number of elements in the swizzle and the base type 1380 * (i.e., float, int, unsigned, or bool) of the vector being swizzled, 1381 * generate the type of the resulting value. 1382 */ 1383 type = glsl_type::get_instance(val->type->base_type, mask.num_components, 1); 1384 } 1385 1386 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z, 1387 unsigned w, unsigned count) 1388 : ir_rvalue(ir_type_swizzle), val(val) 1389 { 1390 const unsigned components[4] = { x, y, z, w }; 1391 this->init_mask(components, count); 1392 } 1393 1394 ir_swizzle::ir_swizzle(ir_rvalue *val, const unsigned *comp, 1395 unsigned count) 1396 : ir_rvalue(ir_type_swizzle), val(val) 1397 { 1398 this->init_mask(comp, count); 1399 } 1400 1401 ir_swizzle::ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask) 1402 : ir_rvalue(ir_type_swizzle) 1403 { 1404 this->val = val; 1405 this->mask = mask; 1406 this->type = glsl_type::get_instance(val->type->base_type, 1407 mask.num_components, 1); 1408 } 1409 1410 #define X 1 1411 #define R 5 1412 #define S 9 1413 #define I 13 1414 1415 ir_swizzle * 1416 ir_swizzle::create(ir_rvalue *val, const char *str, unsigned vector_length) 1417 { 1418 void *ctx = ralloc_parent(val); 1419 1420 /* For each possible swizzle character, this table encodes the value in 1421 * \c idx_map that represents the 0th element of the vector. For invalid 1422 * swizzle characters (e.g., 'k'), a special value is used that will allow 1423 * detection of errors. 1424 */ 1425 static const unsigned char base_idx[26] = { 1426 /* a b c d e f g h i j k l m */ 1427 R, R, I, I, I, I, R, I, I, I, I, I, I, 1428 /* n o p q r s t u v w x y z */ 1429 I, I, S, S, R, S, S, I, I, X, X, X, X 1430 }; 1431 1432 /* Each valid swizzle character has an entry in the previous table. This 1433 * table encodes the base index encoded in the previous table plus the actual 1434 * index of the swizzle character. When processing swizzles, the first 1435 * character in the string is indexed in the previous table. Each character 1436 * in the string is indexed in this table, and the value found there has the 1437 * value form the first table subtracted. The result must be on the range 1438 * [0,3]. 1439 * 1440 * For example, the string "wzyx" will get X from the first table. Each of 1441 * the charcaters will get X+3, X+2, X+1, and X+0 from this table. After 1442 * subtraction, the swizzle values are { 3, 2, 1, 0 }. 1443 * 1444 * The string "wzrg" will get X from the first table. Each of the characters 1445 * will get X+3, X+2, R+0, and R+1 from this table. After subtraction, the 1446 * swizzle values are { 3, 2, 4, 5 }. Since 4 and 5 are outside the range 1447 * [0,3], the error is detected. 1448 */ 1449 static const unsigned char idx_map[26] = { 1450 /* a b c d e f g h i j k l m */ 1451 R+3, R+2, 0, 0, 0, 0, R+1, 0, 0, 0, 0, 0, 0, 1452 /* n o p q r s t u v w x y z */ 1453 0, 0, S+2, S+3, R+0, S+0, S+1, 0, 0, X+3, X+0, X+1, X+2 1454 }; 1455 1456 int swiz_idx[4] = { 0, 0, 0, 0 }; 1457 unsigned i; 1458 1459 1460 /* Validate the first character in the swizzle string and look up the base 1461 * index value as described above. 1462 */ 1463 if ((str[0] < 'a') || (str[0] > 'z')) 1464 return NULL; 1465 1466 const unsigned base = base_idx[str[0] - 'a']; 1467 1468 1469 for (i = 0; (i < 4) && (str[i] != '\0'); i++) { 1470 /* Validate the next character, and, as described above, convert it to a 1471 * swizzle index. 1472 */ 1473 if ((str[i] < 'a') || (str[i] > 'z')) 1474 return NULL; 1475 1476 swiz_idx[i] = idx_map[str[i] - 'a'] - base; 1477 if ((swiz_idx[i] < 0) || (swiz_idx[i] >= (int) vector_length)) 1478 return NULL; 1479 } 1480 1481 if (str[i] != '\0') 1482 return NULL; 1483 1484 return new(ctx) ir_swizzle(val, swiz_idx[0], swiz_idx[1], swiz_idx[2], 1485 swiz_idx[3], i); 1486 } 1487 1488 #undef X 1489 #undef R 1490 #undef S 1491 #undef I 1492 1493 ir_variable * 1494 ir_swizzle::variable_referenced() const 1495 { 1496 return this->val->variable_referenced(); 1497 } 1498 1499 1500 bool ir_variable::temporaries_allocate_names = false; 1501 1502 const char ir_variable::tmp_name[] = "compiler_temp"; 1503 1504 ir_variable::ir_variable(const struct glsl_type *type, const char *name, 1505 ir_variable_mode mode) 1506 : ir_instruction(ir_type_variable) 1507 { 1508 this->type = type; 1509 1510 if (mode == ir_var_temporary && !ir_variable::temporaries_allocate_names) 1511 name = NULL; 1512 1513 /* The ir_variable clone method may call this constructor with name set to 1514 * tmp_name. 1515 */ 1516 assert(name != NULL 1517 || mode == ir_var_temporary 1518 || mode == ir_var_function_in 1519 || mode == ir_var_function_out 1520 || mode == ir_var_function_inout); 1521 assert(name != ir_variable::tmp_name 1522 || mode == ir_var_temporary); 1523 if (mode == ir_var_temporary 1524 && (name == NULL || name == ir_variable::tmp_name)) { 1525 this->name = ir_variable::tmp_name; 1526 } else if (name == NULL || 1527 strlen(name) < ARRAY_SIZE(this->name_storage)) { 1528 strcpy(this->name_storage, name ? name : ""); 1529 this->name = this->name_storage; 1530 } else { 1531 this->name = ralloc_strdup(this, name); 1532 } 1533 1534 this->u.max_ifc_array_access = NULL; 1535 1536 this->data.explicit_location = false; 1537 this->data.has_initializer = false; 1538 this->data.location = -1; 1539 this->data.location_frac = 0; 1540 this->data.binding = 0; 1541 this->data.warn_extension_index = 0; 1542 this->constant_value = NULL; 1543 this->constant_initializer = NULL; 1544 this->data.origin_upper_left = false; 1545 this->data.pixel_center_integer = false; 1546 this->data.depth_layout = ir_depth_layout_none; 1547 this->data.used = false; 1548 this->data.always_active_io = false; 1549 this->data.read_only = false; 1550 this->data.centroid = false; 1551 this->data.sample = false; 1552 this->data.patch = false; 1553 this->data.invariant = false; 1554 this->data.how_declared = ir_var_declared_normally; 1555 this->data.mode = mode; 1556 this->data.interpolation = INTERP_MODE_NONE; 1557 this->data.max_array_access = -1; 1558 this->data.offset = 0; 1559 this->data.precision = GLSL_PRECISION_NONE; 1560 this->data.image_read_only = false; 1561 this->data.image_write_only = false; 1562 this->data.image_coherent = false; 1563 this->data.image_volatile = false; 1564 this->data.image_restrict = false; 1565 this->data.from_ssbo_unsized_array = false; 1566 this->data.fb_fetch_output = false; 1567 1568 if (type != NULL) { 1569 if (type->base_type == GLSL_TYPE_SAMPLER) 1570 this->data.read_only = true; 1571 1572 if (type->is_interface()) 1573 this->init_interface_type(type); 1574 else if (type->without_array()->is_interface()) 1575 this->init_interface_type(type->without_array()); 1576 } 1577 } 1578 1579 1580 const char * 1581 interpolation_string(unsigned interpolation) 1582 { 1583 switch (interpolation) { 1584 case INTERP_MODE_NONE: return "no"; 1585 case INTERP_MODE_SMOOTH: return "smooth"; 1586 case INTERP_MODE_FLAT: return "flat"; 1587 case INTERP_MODE_NOPERSPECTIVE: return "noperspective"; 1588 } 1589 1590 assert(!"Should not get here."); 1591 return ""; 1592 } 1593 1594 const char *const ir_variable::warn_extension_table[] = { 1595 "", 1596 "GL_ARB_shader_stencil_export", 1597 "GL_AMD_shader_stencil_export", 1598 }; 1599 1600 void 1601 ir_variable::enable_extension_warning(const char *extension) 1602 { 1603 for (unsigned i = 0; i < ARRAY_SIZE(warn_extension_table); i++) { 1604 if (strcmp(warn_extension_table[i], extension) == 0) { 1605 this->data.warn_extension_index = i; 1606 return; 1607 } 1608 } 1609 1610 assert(!"Should not get here."); 1611 this->data.warn_extension_index = 0; 1612 } 1613 1614 const char * 1615 ir_variable::get_extension_warning() const 1616 { 1617 return this->data.warn_extension_index == 0 1618 ? NULL : warn_extension_table[this->data.warn_extension_index]; 1619 } 1620 1621 ir_function_signature::ir_function_signature(const glsl_type *return_type, 1622 builtin_available_predicate b) 1623 : ir_instruction(ir_type_function_signature), 1624 return_type(return_type), is_defined(false), 1625 intrinsic_id(ir_intrinsic_invalid), builtin_avail(b), _function(NULL) 1626 { 1627 this->origin = NULL; 1628 } 1629 1630 1631 bool 1632 ir_function_signature::is_builtin() const 1633 { 1634 return builtin_avail != NULL; 1635 } 1636 1637 1638 bool 1639 ir_function_signature::is_builtin_available(const _mesa_glsl_parse_state *state) const 1640 { 1641 /* We can't call the predicate without a state pointer, so just say that 1642 * the signature is available. At compile time, we need the filtering, 1643 * but also receive a valid state pointer. At link time, we're resolving 1644 * imported built-in prototypes to their definitions, which will always 1645 * be an exact match. So we can skip the filtering. 1646 */ 1647 if (state == NULL) 1648 return true; 1649 1650 assert(builtin_avail != NULL); 1651 return builtin_avail(state); 1652 } 1653 1654 1655 static bool 1656 modes_match(unsigned a, unsigned b) 1657 { 1658 if (a == b) 1659 return true; 1660 1661 /* Accept "in" vs. "const in" */ 1662 if ((a == ir_var_const_in && b == ir_var_function_in) || 1663 (b == ir_var_const_in && a == ir_var_function_in)) 1664 return true; 1665 1666 return false; 1667 } 1668 1669 1670 const char * 1671 ir_function_signature::qualifiers_match(exec_list *params) 1672 { 1673 /* check that the qualifiers match. */ 1674 foreach_two_lists(a_node, &this->parameters, b_node, params) { 1675 ir_variable *a = (ir_variable *) a_node; 1676 ir_variable *b = (ir_variable *) b_node; 1677 1678 if (a->data.read_only != b->data.read_only || 1679 !modes_match(a->data.mode, b->data.mode) || 1680 a->data.interpolation != b->data.interpolation || 1681 a->data.centroid != b->data.centroid || 1682 a->data.sample != b->data.sample || 1683 a->data.patch != b->data.patch || 1684 a->data.image_read_only != b->data.image_read_only || 1685 a->data.image_write_only != b->data.image_write_only || 1686 a->data.image_coherent != b->data.image_coherent || 1687 a->data.image_volatile != b->data.image_volatile || 1688 a->data.image_restrict != b->data.image_restrict) { 1689 1690 /* parameter a's qualifiers don't match */ 1691 return a->name; 1692 } 1693 } 1694 return NULL; 1695 } 1696 1697 1698 void 1699 ir_function_signature::replace_parameters(exec_list *new_params) 1700 { 1701 /* Destroy all of the previous parameter information. If the previous 1702 * parameter information comes from the function prototype, it may either 1703 * specify incorrect parameter names or not have names at all. 1704 */ 1705 new_params->move_nodes_to(¶meters); 1706 } 1707 1708 1709 ir_function::ir_function(const char *name) 1710 : ir_instruction(ir_type_function) 1711 { 1712 this->subroutine_index = -1; 1713 this->name = ralloc_strdup(this, name); 1714 } 1715 1716 1717 bool 1718 ir_function::has_user_signature() 1719 { 1720 foreach_in_list(ir_function_signature, sig, &this->signatures) { 1721 if (!sig->is_builtin()) 1722 return true; 1723 } 1724 return false; 1725 } 1726 1727 1728 ir_rvalue * 1729 ir_rvalue::error_value(void *mem_ctx) 1730 { 1731 ir_rvalue *v = new(mem_ctx) ir_rvalue(ir_type_unset); 1732 1733 v->type = glsl_type::error_type; 1734 return v; 1735 } 1736 1737 1738 void 1739 visit_exec_list(exec_list *list, ir_visitor *visitor) 1740 { 1741 foreach_in_list_safe(ir_instruction, node, list) { 1742 node->accept(visitor); 1743 } 1744 } 1745 1746 1747 static void 1748 steal_memory(ir_instruction *ir, void *new_ctx) 1749 { 1750 ir_variable *var = ir->as_variable(); 1751 ir_function *fn = ir->as_function(); 1752 ir_constant *constant = ir->as_constant(); 1753 if (var != NULL && var->constant_value != NULL) 1754 steal_memory(var->constant_value, ir); 1755 1756 if (var != NULL && var->constant_initializer != NULL) 1757 steal_memory(var->constant_initializer, ir); 1758 1759 if (fn != NULL && fn->subroutine_types) 1760 ralloc_steal(new_ctx, fn->subroutine_types); 1761 1762 /* The components of aggregate constants are not visited by the normal 1763 * visitor, so steal their values by hand. 1764 */ 1765 if (constant != NULL) { 1766 if (constant->type->is_record()) { 1767 foreach_in_list(ir_constant, field, &constant->components) { 1768 steal_memory(field, ir); 1769 } 1770 } else if (constant->type->is_array()) { 1771 for (unsigned int i = 0; i < constant->type->length; i++) { 1772 steal_memory(constant->array_elements[i], ir); 1773 } 1774 } 1775 } 1776 1777 ralloc_steal(new_ctx, ir); 1778 } 1779 1780 1781 void 1782 reparent_ir(exec_list *list, void *mem_ctx) 1783 { 1784 foreach_in_list(ir_instruction, node, list) { 1785 visit_tree(node, steal_memory, mem_ctx); 1786 } 1787 } 1788 1789 1790 static ir_rvalue * 1791 try_min_one(ir_rvalue *ir) 1792 { 1793 ir_expression *expr = ir->as_expression(); 1794 1795 if (!expr || expr->operation != ir_binop_min) 1796 return NULL; 1797 1798 if (expr->operands[0]->is_one()) 1799 return expr->operands[1]; 1800 1801 if (expr->operands[1]->is_one()) 1802 return expr->operands[0]; 1803 1804 return NULL; 1805 } 1806 1807 static ir_rvalue * 1808 try_max_zero(ir_rvalue *ir) 1809 { 1810 ir_expression *expr = ir->as_expression(); 1811 1812 if (!expr || expr->operation != ir_binop_max) 1813 return NULL; 1814 1815 if (expr->operands[0]->is_zero()) 1816 return expr->operands[1]; 1817 1818 if (expr->operands[1]->is_zero()) 1819 return expr->operands[0]; 1820 1821 return NULL; 1822 } 1823 1824 ir_rvalue * 1825 ir_rvalue::as_rvalue_to_saturate() 1826 { 1827 ir_expression *expr = this->as_expression(); 1828 1829 if (!expr) 1830 return NULL; 1831 1832 ir_rvalue *max_zero = try_max_zero(expr); 1833 if (max_zero) { 1834 return try_min_one(max_zero); 1835 } else { 1836 ir_rvalue *min_one = try_min_one(expr); 1837 if (min_one) { 1838 return try_max_zero(min_one); 1839 } 1840 } 1841 1842 return NULL; 1843 } 1844 1845 1846 unsigned 1847 vertices_per_prim(GLenum prim) 1848 { 1849 switch (prim) { 1850 case GL_POINTS: 1851 return 1; 1852 case GL_LINES: 1853 return 2; 1854 case GL_TRIANGLES: 1855 return 3; 1856 case GL_LINES_ADJACENCY: 1857 return 4; 1858 case GL_TRIANGLES_ADJACENCY: 1859 return 6; 1860 default: 1861 assert(!"Bad primitive"); 1862 return 3; 1863 } 1864 } 1865 1866 /** 1867 * Generate a string describing the mode of a variable 1868 */ 1869 const char * 1870 mode_string(const ir_variable *var) 1871 { 1872 switch (var->data.mode) { 1873 case ir_var_auto: 1874 return (var->data.read_only) ? "global constant" : "global variable"; 1875 1876 case ir_var_uniform: 1877 return "uniform"; 1878 1879 case ir_var_shader_storage: 1880 return "buffer"; 1881 1882 case ir_var_shader_in: 1883 return "shader input"; 1884 1885 case ir_var_shader_out: 1886 return "shader output"; 1887 1888 case ir_var_function_in: 1889 case ir_var_const_in: 1890 return "function input"; 1891 1892 case ir_var_function_out: 1893 return "function output"; 1894 1895 case ir_var_function_inout: 1896 return "function inout"; 1897 1898 case ir_var_system_value: 1899 return "shader input"; 1900 1901 case ir_var_temporary: 1902 return "compiler temporary"; 1903 1904 case ir_var_mode_count: 1905 break; 1906 } 1907 1908 assert(!"Should not get here."); 1909 return "invalid variable"; 1910 } 1911