1 /* 2 * Copyright 2014 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 DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * Authors: 24 * Connor Abbott (cwabbott0 (at) gmail.com) 25 * 26 */ 27 28 #include "nir_types.h" 29 #include "compiler/glsl/ir.h" 30 31 const char * 32 glsl_get_type_name(const glsl_type *type) 33 { 34 return type->name; 35 } 36 37 int 38 glsl_array_size(const struct glsl_type *type) 39 { 40 return type->array_size(); 41 } 42 43 const glsl_type * 44 glsl_get_array_element(const glsl_type* type) 45 { 46 if (type->is_matrix()) 47 return type->column_type(); 48 else if (type->is_vector()) 49 return type->get_scalar_type(); 50 return type->fields.array; 51 } 52 53 const glsl_type * 54 glsl_without_array(const glsl_type *type) 55 { 56 return type->without_array(); 57 } 58 59 const glsl_type * 60 glsl_without_array_or_matrix(const glsl_type *type) 61 { 62 type = type->without_array(); 63 if (type->is_matrix()) 64 type = type->column_type(); 65 return type; 66 } 67 68 const glsl_type * 69 glsl_get_bare_type(const glsl_type *type) 70 { 71 return type->get_bare_type(); 72 } 73 74 const glsl_type * 75 glsl_get_struct_field(const glsl_type *type, unsigned index) 76 { 77 return type->fields.structure[index].type; 78 } 79 80 int 81 glsl_get_struct_field_offset(const struct glsl_type *type, 82 unsigned index) 83 { 84 return type->fields.structure[index].offset; 85 } 86 87 const struct glsl_struct_field * 88 glsl_get_struct_field_data(const struct glsl_type *type, unsigned index) 89 { 90 assert(type->is_struct() || type->is_interface()); 91 assert(index < type->length); 92 return &type->fields.structure[index]; 93 } 94 95 unsigned 96 glsl_get_explicit_stride(const struct glsl_type *type) 97 { 98 return type->explicit_stride; 99 } 100 101 const glsl_type * 102 glsl_get_function_return_type(const glsl_type *type) 103 { 104 return type->fields.parameters[0].type; 105 } 106 107 const glsl_function_param * 108 glsl_get_function_param(const glsl_type *type, unsigned index) 109 { 110 return &type->fields.parameters[index + 1]; 111 } 112 113 const struct glsl_type * 114 glsl_get_column_type(const struct glsl_type *type) 115 { 116 return type->column_type(); 117 } 118 119 GLenum 120 glsl_get_gl_type(const struct glsl_type *type) 121 { 122 return type->gl_type; 123 } 124 125 enum glsl_base_type 126 glsl_get_base_type(const struct glsl_type *type) 127 { 128 return type->base_type; 129 } 130 131 unsigned 132 glsl_get_vector_elements(const struct glsl_type *type) 133 { 134 return type->vector_elements; 135 } 136 137 unsigned 138 glsl_get_components(const struct glsl_type *type) 139 { 140 return type->components(); 141 } 142 143 unsigned 144 glsl_get_matrix_columns(const struct glsl_type *type) 145 { 146 return type->matrix_columns; 147 } 148 149 unsigned 150 glsl_get_length(const struct glsl_type *type) 151 { 152 return type->is_matrix() ? type->matrix_columns : type->length; 153 } 154 155 unsigned 156 glsl_get_aoa_size(const struct glsl_type *type) 157 { 158 return type->arrays_of_arrays_size(); 159 } 160 161 unsigned 162 glsl_count_vec4_slots(const struct glsl_type *type, 163 bool is_gl_vertex_input, bool is_bindless) 164 { 165 return type->count_vec4_slots(is_gl_vertex_input, is_bindless); 166 } 167 168 unsigned 169 glsl_count_dword_slots(const struct glsl_type *type, bool is_bindless) 170 { 171 return type->count_dword_slots(is_bindless); 172 } 173 174 unsigned 175 glsl_count_attribute_slots(const struct glsl_type *type, 176 bool is_gl_vertex_input) 177 { 178 return type->count_attribute_slots(is_gl_vertex_input); 179 } 180 181 unsigned 182 glsl_get_component_slots(const struct glsl_type *type) 183 { 184 return type->component_slots(); 185 } 186 187 unsigned 188 glsl_varying_count(const struct glsl_type *type) 189 { 190 return type->varying_count(); 191 } 192 193 const char * 194 glsl_get_struct_elem_name(const struct glsl_type *type, unsigned index) 195 { 196 return type->fields.structure[index].name; 197 } 198 199 glsl_sampler_dim 200 glsl_get_sampler_dim(const struct glsl_type *type) 201 { 202 assert(glsl_type_is_sampler(type) || glsl_type_is_image(type)); 203 return (glsl_sampler_dim)type->sampler_dimensionality; 204 } 205 206 glsl_base_type 207 glsl_get_sampler_result_type(const struct glsl_type *type) 208 { 209 assert(glsl_type_is_sampler(type) || glsl_type_is_image(type)); 210 return (glsl_base_type)type->sampled_type; 211 } 212 213 unsigned 214 glsl_get_sampler_target(const struct glsl_type *type) 215 { 216 assert(glsl_type_is_sampler(type)); 217 return type->sampler_index(); 218 } 219 220 int 221 glsl_get_sampler_coordinate_components(const struct glsl_type *type) 222 { 223 assert(glsl_type_is_sampler(type) || glsl_type_is_image(type)); 224 return type->coordinate_components(); 225 } 226 227 unsigned 228 glsl_get_struct_location_offset(const struct glsl_type *type, 229 unsigned length) 230 { 231 return type->struct_location_offset(length); 232 } 233 234 bool 235 glsl_type_is_16bit(const glsl_type *type) 236 { 237 return type->is_16bit(); 238 } 239 240 bool 241 glsl_type_is_32bit(const glsl_type *type) 242 { 243 return type->is_32bit(); 244 } 245 246 bool 247 glsl_type_is_64bit(const glsl_type *type) 248 { 249 return type->is_64bit(); 250 } 251 252 bool 253 glsl_type_is_void(const glsl_type *type) 254 { 255 return type->is_void(); 256 } 257 258 bool 259 glsl_type_is_error(const glsl_type *type) 260 { 261 return type->is_error(); 262 } 263 264 bool 265 glsl_type_is_vector(const struct glsl_type *type) 266 { 267 return type->is_vector(); 268 } 269 270 bool 271 glsl_type_is_scalar(const struct glsl_type *type) 272 { 273 return type->is_scalar(); 274 } 275 276 bool 277 glsl_type_is_vector_or_scalar(const struct glsl_type *type) 278 { 279 return type->is_vector() || type->is_scalar(); 280 } 281 282 bool 283 glsl_type_is_matrix(const struct glsl_type *type) 284 { 285 return type->is_matrix(); 286 } 287 288 bool 289 glsl_matrix_type_is_row_major(const struct glsl_type *type) 290 { 291 assert(type->is_matrix() && type->explicit_stride); 292 return type->interface_row_major; 293 } 294 295 bool 296 glsl_type_is_array(const struct glsl_type *type) 297 { 298 return type->is_array(); 299 } 300 301 bool 302 glsl_type_is_unsized_array(const struct glsl_type *type) 303 { 304 return type->is_unsized_array(); 305 } 306 307 bool 308 glsl_type_is_array_of_arrays(const struct glsl_type *type) 309 { 310 return type->is_array_of_arrays(); 311 } 312 313 bool 314 glsl_type_is_array_or_matrix(const struct glsl_type *type) 315 { 316 return type->is_array() || type->is_matrix(); 317 } 318 319 bool 320 glsl_type_is_struct(const struct glsl_type *type) 321 { 322 return type->is_struct(); 323 } 324 325 bool 326 glsl_type_is_interface(const struct glsl_type *type) 327 { 328 return type->is_interface(); 329 } 330 331 bool 332 glsl_type_is_struct_or_ifc(const struct glsl_type *type) 333 { 334 return type->is_struct() || type->is_interface(); 335 } 336 337 bool 338 glsl_type_is_sampler(const struct glsl_type *type) 339 { 340 return type->is_sampler(); 341 } 342 343 bool 344 glsl_type_is_image(const struct glsl_type *type) 345 { 346 return type->is_image(); 347 } 348 349 bool 350 glsl_sampler_type_is_shadow(const struct glsl_type *type) 351 { 352 assert(glsl_type_is_sampler(type)); 353 return type->sampler_shadow; 354 } 355 356 bool 357 glsl_sampler_type_is_array(const struct glsl_type *type) 358 { 359 assert(glsl_type_is_sampler(type) || glsl_type_is_image(type)); 360 return type->sampler_array; 361 } 362 363 bool 364 glsl_struct_type_is_packed(const struct glsl_type *type) 365 { 366 assert(glsl_type_is_struct(type)); 367 return type->packed; 368 } 369 370 bool 371 glsl_type_is_dual_slot(const struct glsl_type *type) 372 { 373 return type->is_dual_slot(); 374 } 375 376 bool 377 glsl_type_is_numeric(const struct glsl_type *type) 378 { 379 return type->is_numeric(); 380 } 381 382 bool 383 glsl_type_is_boolean(const struct glsl_type *type) 384 { 385 return type->is_boolean(); 386 } 387 bool 388 glsl_type_is_integer(const struct glsl_type *type) 389 { 390 return type->is_integer(); 391 } 392 393 bool 394 glsl_type_contains_64bit(const struct glsl_type *type) 395 { 396 return type->contains_64bit(); 397 } 398 399 const glsl_type * 400 glsl_void_type(void) 401 { 402 return glsl_type::void_type; 403 } 404 405 const glsl_type * 406 glsl_float_type(void) 407 { 408 return glsl_type::float_type; 409 } 410 411 const glsl_type * 412 glsl_double_type(void) 413 { 414 return glsl_type::double_type; 415 } 416 417 const glsl_type * 418 glsl_float16_t_type(void) 419 { 420 return glsl_type::float16_t_type; 421 } 422 423 const glsl_type * 424 glsl_floatN_t_type(unsigned bit_size) 425 { 426 switch (bit_size) { 427 case 16: return glsl_type::float16_t_type; 428 case 32: return glsl_type::float_type; 429 case 64: return glsl_type::double_type; 430 default: 431 unreachable("Unsupported bit size"); 432 } 433 } 434 435 const glsl_type * 436 glsl_vec_type(unsigned n) 437 { 438 return glsl_type::vec(n); 439 } 440 441 const glsl_type * 442 glsl_dvec_type(unsigned n) 443 { 444 return glsl_type::dvec(n); 445 } 446 447 const glsl_type * 448 glsl_vec4_type(void) 449 { 450 return glsl_type::vec4_type; 451 } 452 453 const glsl_type * 454 glsl_uvec4_type(void) 455 { 456 return glsl_type::uvec4_type; 457 } 458 459 const glsl_type * 460 glsl_ivec4_type(void) 461 { 462 return glsl_type::ivec4_type; 463 } 464 465 const glsl_type * 466 glsl_int_type(void) 467 { 468 return glsl_type::int_type; 469 } 470 471 const glsl_type * 472 glsl_uint_type(void) 473 { 474 return glsl_type::uint_type; 475 } 476 477 const glsl_type * 478 glsl_int64_t_type(void) 479 { 480 return glsl_type::int64_t_type; 481 } 482 483 const glsl_type * 484 glsl_uint64_t_type(void) 485 { 486 return glsl_type::uint64_t_type; 487 } 488 489 const glsl_type * 490 glsl_int16_t_type(void) 491 { 492 return glsl_type::int16_t_type; 493 } 494 495 const glsl_type * 496 glsl_uint16_t_type(void) 497 { 498 return glsl_type::uint16_t_type; 499 } 500 501 const glsl_type * 502 glsl_int8_t_type(void) 503 { 504 return glsl_type::int8_t_type; 505 } 506 507 const glsl_type * 508 glsl_uint8_t_type(void) 509 { 510 return glsl_type::uint8_t_type; 511 } 512 513 const glsl_type * 514 glsl_intN_t_type(unsigned bit_size) 515 { 516 switch (bit_size) { 517 case 8: return glsl_type::int8_t_type; 518 case 16: return glsl_type::int16_t_type; 519 case 32: return glsl_type::int_type; 520 case 64: return glsl_type::int64_t_type; 521 default: 522 unreachable("Unsupported bit size"); 523 } 524 } 525 526 const glsl_type * 527 glsl_uintN_t_type(unsigned bit_size) 528 { 529 switch (bit_size) { 530 case 8: return glsl_type::uint8_t_type; 531 case 16: return glsl_type::uint16_t_type; 532 case 32: return glsl_type::uint_type; 533 case 64: return glsl_type::uint64_t_type; 534 default: 535 unreachable("Unsupported bit size"); 536 } 537 } 538 539 const glsl_type * 540 glsl_bool_type(void) 541 { 542 return glsl_type::bool_type; 543 } 544 545 const glsl_type * 546 glsl_scalar_type(enum glsl_base_type base_type) 547 { 548 return glsl_type::get_instance(base_type, 1, 1); 549 } 550 551 const glsl_type * 552 glsl_vector_type(enum glsl_base_type base_type, unsigned components) 553 { 554 const glsl_type *t = glsl_type::get_instance(base_type, components, 1); 555 assert(t != glsl_type::error_type); 556 return t; 557 } 558 559 const glsl_type * 560 glsl_matrix_type(enum glsl_base_type base_type, unsigned rows, unsigned columns) 561 { 562 const glsl_type *t = glsl_type::get_instance(base_type, rows, columns); 563 assert(t != glsl_type::error_type); 564 return t; 565 } 566 567 const glsl_type * 568 glsl_explicit_matrix_type(const glsl_type *mat, 569 unsigned stride, bool row_major) 570 { 571 assert(stride > 0); 572 const glsl_type *t = glsl_type::get_instance(mat->base_type, 573 mat->vector_elements, 574 mat->matrix_columns, 575 stride, row_major); 576 assert(t != glsl_type::error_type); 577 return t; 578 } 579 580 const glsl_type * 581 glsl_array_type(const glsl_type *base, unsigned elements, 582 unsigned explicit_stride) 583 { 584 return glsl_type::get_array_instance(base, elements, explicit_stride); 585 } 586 587 const glsl_type * 588 glsl_replace_vector_type(const glsl_type *t, unsigned components) 589 { 590 if (glsl_type_is_array(t)) { 591 return glsl_array_type( 592 glsl_replace_vector_type(t->fields.array, components), t->length, 593 t->explicit_stride); 594 } else if (glsl_type_is_vector_or_scalar(t)) { 595 return glsl_vector_type(t->base_type, components); 596 } else { 597 unreachable("Unhandled base type glsl_replace_vector_type()"); 598 } 599 } 600 601 const glsl_type * 602 glsl_struct_type(const glsl_struct_field *fields, 603 unsigned num_fields, const char *name, 604 bool packed) 605 { 606 return glsl_type::get_struct_instance(fields, num_fields, name, packed); 607 } 608 609 const glsl_type * 610 glsl_interface_type(const glsl_struct_field *fields, 611 unsigned num_fields, 612 enum glsl_interface_packing packing, 613 bool row_major, 614 const char *block_name) 615 { 616 return glsl_type::get_interface_instance(fields, num_fields, packing, 617 row_major, block_name); 618 } 619 620 const struct glsl_type * 621 glsl_sampler_type(enum glsl_sampler_dim dim, bool is_shadow, bool is_array, 622 enum glsl_base_type base_type) 623 { 624 return glsl_type::get_sampler_instance(dim, is_shadow, is_array, base_type); 625 } 626 627 const struct glsl_type * 628 glsl_bare_sampler_type() 629 { 630 return glsl_type::sampler_type; 631 } 632 633 const struct glsl_type * 634 glsl_bare_shadow_sampler_type() 635 { 636 return glsl_type::samplerShadow_type; 637 } 638 639 const struct glsl_type * 640 glsl_image_type(enum glsl_sampler_dim dim, bool is_array, 641 enum glsl_base_type base_type) 642 { 643 return glsl_type::get_image_instance(dim, is_array, base_type); 644 } 645 646 const glsl_type * 647 glsl_function_type(const glsl_type *return_type, 648 const glsl_function_param *params, unsigned num_params) 649 { 650 return glsl_type::get_function_instance(return_type, params, num_params); 651 } 652 653 const glsl_type * 654 glsl_transposed_type(const struct glsl_type *type) 655 { 656 assert(glsl_type_is_matrix(type)); 657 return glsl_type::get_instance(type->base_type, type->matrix_columns, 658 type->vector_elements); 659 } 660 661 const glsl_type * 662 glsl_channel_type(const glsl_type *t) 663 { 664 switch (t->base_type) { 665 case GLSL_TYPE_ARRAY: 666 return glsl_array_type(glsl_channel_type(t->fields.array), t->length, 667 t->explicit_stride); 668 case GLSL_TYPE_UINT: 669 case GLSL_TYPE_INT: 670 case GLSL_TYPE_FLOAT: 671 case GLSL_TYPE_FLOAT16: 672 case GLSL_TYPE_DOUBLE: 673 case GLSL_TYPE_UINT8: 674 case GLSL_TYPE_INT8: 675 case GLSL_TYPE_UINT16: 676 case GLSL_TYPE_INT16: 677 case GLSL_TYPE_UINT64: 678 case GLSL_TYPE_INT64: 679 case GLSL_TYPE_BOOL: 680 return glsl_type::get_instance(t->base_type, 1, 1); 681 default: 682 unreachable("Unhandled base type glsl_channel_type()"); 683 } 684 } 685 686 const glsl_type * 687 glsl_float16_type(const struct glsl_type *type) 688 { 689 return type->get_float16_type(); 690 } 691 692 const glsl_type * 693 glsl_int16_type(const struct glsl_type *type) 694 { 695 return type->get_int16_type(); 696 } 697 698 const glsl_type * 699 glsl_uint16_type(const struct glsl_type *type) 700 { 701 return type->get_uint16_type(); 702 } 703 704 static void 705 glsl_size_align_handle_array_and_structs(const struct glsl_type *type, 706 glsl_type_size_align_func size_align, 707 unsigned *size, unsigned *align) 708 { 709 if (type->base_type == GLSL_TYPE_ARRAY) { 710 unsigned elem_size = 0, elem_align = 0; 711 size_align(type->fields.array, &elem_size, &elem_align); 712 *align = elem_align; 713 *size = type->length * ALIGN_POT(elem_size, elem_align); 714 } else { 715 assert(type->base_type == GLSL_TYPE_STRUCT || 716 type->base_type == GLSL_TYPE_INTERFACE); 717 718 *size = 0; 719 *align = 0; 720 for (unsigned i = 0; i < type->length; i++) { 721 unsigned elem_size = 0, elem_align = 0; 722 size_align(type->fields.structure[i].type, &elem_size, &elem_align); 723 *align = MAX2(*align, elem_align); 724 *size = ALIGN_POT(*size, elem_align) + elem_size; 725 } 726 } 727 } 728 729 void 730 glsl_get_natural_size_align_bytes(const struct glsl_type *type, 731 unsigned *size, unsigned *align) 732 { 733 switch (type->base_type) { 734 case GLSL_TYPE_BOOL: 735 /* We special-case Booleans to 32 bits to not cause heartburn for 736 * drivers that suddenly get an 8-bit load. 737 */ 738 *size = 4 * type->components(); 739 *align = 4; 740 break; 741 742 case GLSL_TYPE_UINT8: 743 case GLSL_TYPE_INT8: 744 case GLSL_TYPE_UINT16: 745 case GLSL_TYPE_INT16: 746 case GLSL_TYPE_FLOAT16: 747 case GLSL_TYPE_UINT: 748 case GLSL_TYPE_INT: 749 case GLSL_TYPE_FLOAT: 750 case GLSL_TYPE_DOUBLE: 751 case GLSL_TYPE_UINT64: 752 case GLSL_TYPE_INT64: { 753 unsigned N = glsl_get_bit_size(type) / 8; 754 *size = N * type->components(); 755 *align = N; 756 break; 757 } 758 759 case GLSL_TYPE_ARRAY: 760 case GLSL_TYPE_INTERFACE: 761 case GLSL_TYPE_STRUCT: 762 glsl_size_align_handle_array_and_structs(type, 763 glsl_get_natural_size_align_bytes, 764 size, align); 765 break; 766 767 case GLSL_TYPE_SAMPLER: 768 case GLSL_TYPE_IMAGE: 769 /* Bindless samplers and images. */ 770 *size = 8; 771 *align = 8; 772 break; 773 774 case GLSL_TYPE_ATOMIC_UINT: 775 case GLSL_TYPE_SUBROUTINE: 776 case GLSL_TYPE_VOID: 777 case GLSL_TYPE_ERROR: 778 case GLSL_TYPE_FUNCTION: 779 unreachable("type does not have a natural size"); 780 } 781 } 782 783 /** 784 * Returns a byte size/alignment for a type where each array element or struct 785 * field is aligned to 16 bytes. 786 */ 787 void 788 glsl_get_vec4_size_align_bytes(const struct glsl_type *type, 789 unsigned *size, unsigned *align) 790 { 791 switch (type->base_type) { 792 case GLSL_TYPE_BOOL: 793 /* We special-case Booleans to 32 bits to not cause heartburn for 794 * drivers that suddenly get an 8-bit load. 795 */ 796 *size = 4 * type->components(); 797 *align = 16; 798 break; 799 800 case GLSL_TYPE_UINT8: 801 case GLSL_TYPE_INT8: 802 case GLSL_TYPE_UINT16: 803 case GLSL_TYPE_INT16: 804 case GLSL_TYPE_FLOAT16: 805 case GLSL_TYPE_UINT: 806 case GLSL_TYPE_INT: 807 case GLSL_TYPE_FLOAT: 808 case GLSL_TYPE_DOUBLE: 809 case GLSL_TYPE_UINT64: 810 case GLSL_TYPE_INT64: { 811 unsigned N = glsl_get_bit_size(type) / 8; 812 *size = 16 * (type->matrix_columns - 1) + N * type->vector_elements; 813 *align = 16; 814 break; 815 } 816 817 case GLSL_TYPE_ARRAY: 818 case GLSL_TYPE_INTERFACE: 819 case GLSL_TYPE_STRUCT: 820 glsl_size_align_handle_array_and_structs(type, 821 glsl_get_vec4_size_align_bytes, 822 size, align); 823 break; 824 825 case GLSL_TYPE_SAMPLER: 826 case GLSL_TYPE_IMAGE: 827 case GLSL_TYPE_ATOMIC_UINT: 828 case GLSL_TYPE_SUBROUTINE: 829 case GLSL_TYPE_VOID: 830 case GLSL_TYPE_ERROR: 831 case GLSL_TYPE_FUNCTION: 832 unreachable("type does not make sense for glsl_get_vec4_size_align_bytes()"); 833 } 834 } 835 836 const glsl_type * 837 glsl_atomic_uint_type(void) 838 { 839 return glsl_type::atomic_uint_type; 840 } 841 842 unsigned 843 glsl_atomic_size(const struct glsl_type *type) 844 { 845 return type->atomic_size(); 846 } 847 848 bool 849 glsl_contains_atomic(const struct glsl_type *type) 850 { 851 return type->contains_atomic(); 852 } 853 854 bool 855 glsl_contains_opaque(const struct glsl_type *type) 856 { 857 return type->contains_opaque(); 858 } 859 860 int 861 glsl_get_cl_size(const struct glsl_type *type) 862 { 863 return type->cl_size(); 864 } 865 866 int 867 glsl_get_cl_alignment(const struct glsl_type *type) 868 { 869 return type->cl_alignment(); 870 } 871 872 void 873 glsl_get_cl_type_size_align(const struct glsl_type *type, 874 unsigned *size, unsigned *align) 875 { 876 *size = glsl_get_cl_size(type); 877 *align = glsl_get_cl_alignment(type); 878 } 879 880 unsigned 881 glsl_type_get_sampler_count(const struct glsl_type *type) 882 { 883 if (glsl_type_is_array(type)) { 884 return (glsl_get_aoa_size(type) * 885 glsl_type_get_sampler_count(glsl_without_array(type))); 886 } 887 888 /* Ignore interface blocks - they can only contain bindless samplers, 889 * which we shouldn't count. 890 */ 891 if (glsl_type_is_struct(type)) { 892 unsigned count = 0; 893 for (unsigned i = 0; i < glsl_get_length(type); i++) 894 count += glsl_type_get_sampler_count(glsl_get_struct_field(type, i)); 895 return count; 896 } 897 898 if (glsl_type_is_sampler(type)) 899 return 1; 900 901 return 0; 902 } 903 904 unsigned 905 glsl_type_get_image_count(const struct glsl_type *type) 906 { 907 if (glsl_type_is_array(type)) { 908 return (glsl_get_aoa_size(type) * 909 glsl_type_get_image_count(glsl_without_array(type))); 910 } 911 912 /* Ignore interface blocks - they can only contain bindless images, 913 * which we shouldn't count. 914 */ 915 if (glsl_type_is_struct(type)) { 916 unsigned count = 0; 917 for (unsigned i = 0; i < glsl_get_length(type); i++) 918 count += glsl_type_get_image_count(glsl_get_struct_field(type, i)); 919 return count; 920 } 921 922 if (glsl_type_is_image(type)) 923 return 1; 924 925 return 0; 926 } 927 928 enum glsl_interface_packing 929 glsl_get_internal_ifc_packing(const struct glsl_type *type, 930 bool std430_supported) 931 { 932 return type->get_internal_ifc_packing(std430_supported); 933 } 934 935 enum glsl_interface_packing 936 glsl_get_ifc_packing(const struct glsl_type *type) 937 { 938 return type->get_interface_packing(); 939 } 940 941 unsigned 942 glsl_get_std140_base_alignment(const struct glsl_type *type, bool row_major) 943 { 944 return type->std140_base_alignment(row_major); 945 } 946 947 unsigned 948 glsl_get_std140_size(const struct glsl_type *type, bool row_major) 949 { 950 return type->std140_size(row_major); 951 } 952 953 unsigned 954 glsl_get_std430_base_alignment(const struct glsl_type *type, bool row_major) 955 { 956 return type->std430_base_alignment(row_major); 957 } 958 959 unsigned 960 glsl_get_std430_size(const struct glsl_type *type, bool row_major) 961 { 962 return type->std430_size(row_major); 963 } 964 965 unsigned 966 glsl_get_explicit_size(const struct glsl_type *type, bool align_to_stride) 967 { 968 return type->explicit_size(align_to_stride); 969 } 970 971 unsigned 972 glsl_get_explicit_alignment(const struct glsl_type *type) 973 { 974 return type->explicit_alignment; 975 } 976 977 bool 978 glsl_type_is_packed(const struct glsl_type *type) 979 { 980 return type->packed; 981 } 982 983 bool 984 glsl_type_is_leaf(const struct glsl_type *type) 985 { 986 if (glsl_type_is_struct_or_ifc(type) || 987 (glsl_type_is_array(type) && 988 (glsl_type_is_array(glsl_get_array_element(type)) || 989 glsl_type_is_struct_or_ifc(glsl_get_array_element(type))))) { 990 return false; 991 } else { 992 return true; 993 } 994 } 995 996 const struct glsl_type * 997 glsl_get_explicit_type_for_size_align(const struct glsl_type *type, 998 glsl_type_size_align_func type_info, 999 unsigned *size, unsigned *align) 1000 { 1001 return type->get_explicit_type_for_size_align(type_info, size, align); 1002 } 1003 1004 const struct glsl_type * 1005 glsl_type_replace_vec3_with_vec4(const struct glsl_type *type) 1006 { 1007 return type->replace_vec3_with_vec4(); 1008 } 1009