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