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 24 #include "ast.h" 25 26 void 27 ast_type_specifier::print(void) const 28 { 29 if (structure) { 30 structure->print(); 31 } else { 32 printf("%s ", type_name); 33 } 34 35 if (array_specifier) { 36 array_specifier->print(); 37 } 38 } 39 40 bool 41 ast_fully_specified_type::has_qualifiers(_mesa_glsl_parse_state *state) const 42 { 43 /* 'subroutine' isnt a real qualifier. */ 44 ast_type_qualifier subroutine_only; 45 subroutine_only.flags.i = 0; 46 subroutine_only.flags.q.subroutine = 1; 47 if (state->has_explicit_uniform_location()) { 48 subroutine_only.flags.q.explicit_index = 1; 49 } 50 return (this->qualifier.flags.i & ~subroutine_only.flags.i) != 0; 51 } 52 53 bool ast_type_qualifier::has_interpolation() const 54 { 55 return this->flags.q.smooth 56 || this->flags.q.flat 57 || this->flags.q.noperspective; 58 } 59 60 bool 61 ast_type_qualifier::has_layout() const 62 { 63 return this->flags.q.origin_upper_left 64 || this->flags.q.pixel_center_integer 65 || this->flags.q.depth_type 66 || this->flags.q.std140 67 || this->flags.q.std430 68 || this->flags.q.shared 69 || this->flags.q.column_major 70 || this->flags.q.row_major 71 || this->flags.q.packed 72 || this->flags.q.bindless_sampler 73 || this->flags.q.bindless_image 74 || this->flags.q.bound_sampler 75 || this->flags.q.bound_image 76 || this->flags.q.explicit_align 77 || this->flags.q.explicit_component 78 || this->flags.q.explicit_location 79 || this->flags.q.explicit_image_format 80 || this->flags.q.explicit_index 81 || this->flags.q.explicit_binding 82 || this->flags.q.explicit_offset 83 || this->flags.q.explicit_stream 84 || this->flags.q.explicit_xfb_buffer 85 || this->flags.q.explicit_xfb_offset 86 || this->flags.q.explicit_xfb_stride; 87 } 88 89 bool 90 ast_type_qualifier::has_storage() const 91 { 92 return this->flags.q.constant 93 || this->flags.q.attribute 94 || this->flags.q.varying 95 || this->flags.q.in 96 || this->flags.q.out 97 || this->flags.q.uniform 98 || this->flags.q.buffer 99 || this->flags.q.shared_storage; 100 } 101 102 bool 103 ast_type_qualifier::has_auxiliary_storage() const 104 { 105 return this->flags.q.centroid 106 || this->flags.q.sample 107 || this->flags.q.patch; 108 } 109 110 bool ast_type_qualifier::has_memory() const 111 { 112 return this->flags.q.coherent 113 || this->flags.q._volatile 114 || this->flags.q.restrict_flag 115 || this->flags.q.read_only 116 || this->flags.q.write_only; 117 } 118 119 bool ast_type_qualifier::is_subroutine_decl() const 120 { 121 return this->flags.q.subroutine && !this->subroutine_list; 122 } 123 124 static bool 125 validate_prim_type(YYLTYPE *loc, 126 _mesa_glsl_parse_state *state, 127 const ast_type_qualifier &qualifier, 128 const ast_type_qualifier &new_qualifier) 129 { 130 /* Input layout qualifiers can be specified multiple 131 * times in separate declarations, as long as they match. 132 */ 133 if (qualifier.flags.q.prim_type && new_qualifier.flags.q.prim_type 134 && qualifier.prim_type != new_qualifier.prim_type) { 135 _mesa_glsl_error(loc, state, 136 "conflicting input primitive %s specified", 137 state->stage == MESA_SHADER_GEOMETRY ? 138 "type" : "mode"); 139 return false; 140 } 141 142 return true; 143 } 144 145 static bool 146 validate_vertex_spacing(YYLTYPE *loc, 147 _mesa_glsl_parse_state *state, 148 const ast_type_qualifier &qualifier, 149 const ast_type_qualifier &new_qualifier) 150 { 151 if (qualifier.flags.q.vertex_spacing && new_qualifier.flags.q.vertex_spacing 152 && qualifier.vertex_spacing != new_qualifier.vertex_spacing) { 153 _mesa_glsl_error(loc, state, 154 "conflicting vertex spacing specified"); 155 return false; 156 } 157 158 return true; 159 } 160 161 static bool 162 validate_ordering(YYLTYPE *loc, 163 _mesa_glsl_parse_state *state, 164 const ast_type_qualifier &qualifier, 165 const ast_type_qualifier &new_qualifier) 166 { 167 if (qualifier.flags.q.ordering && new_qualifier.flags.q.ordering 168 && qualifier.ordering != new_qualifier.ordering) { 169 _mesa_glsl_error(loc, state, 170 "conflicting ordering specified"); 171 return false; 172 } 173 174 return true; 175 } 176 177 static bool 178 validate_point_mode(MAYBE_UNUSED const ast_type_qualifier &qualifier, 179 MAYBE_UNUSED const ast_type_qualifier &new_qualifier) 180 { 181 /* Point mode can only be true if the flag is set. */ 182 assert (!qualifier.flags.q.point_mode || !new_qualifier.flags.q.point_mode 183 || (qualifier.point_mode && new_qualifier.point_mode)); 184 185 return true; 186 } 187 188 static void 189 merge_bindless_qualifier(_mesa_glsl_parse_state *state) 190 { 191 if (state->default_uniform_qualifier->flags.q.bindless_sampler) { 192 state->bindless_sampler_specified = true; 193 state->default_uniform_qualifier->flags.q.bindless_sampler = false; 194 } 195 196 if (state->default_uniform_qualifier->flags.q.bindless_image) { 197 state->bindless_image_specified = true; 198 state->default_uniform_qualifier->flags.q.bindless_image = false; 199 } 200 201 if (state->default_uniform_qualifier->flags.q.bound_sampler) { 202 state->bound_sampler_specified = true; 203 state->default_uniform_qualifier->flags.q.bound_sampler = false; 204 } 205 206 if (state->default_uniform_qualifier->flags.q.bound_image) { 207 state->bound_image_specified = true; 208 state->default_uniform_qualifier->flags.q.bound_image = false; 209 } 210 } 211 212 /** 213 * This function merges duplicate layout identifiers. 214 * 215 * It deals with duplicates within a single layout qualifier, among multiple 216 * layout qualifiers on a single declaration and on several declarations for 217 * the same variable. 218 * 219 * The is_single_layout_merge and is_multiple_layouts_merge parameters are 220 * used to differentiate among them. 221 */ 222 bool 223 ast_type_qualifier::merge_qualifier(YYLTYPE *loc, 224 _mesa_glsl_parse_state *state, 225 const ast_type_qualifier &q, 226 bool is_single_layout_merge, 227 bool is_multiple_layouts_merge) 228 { 229 bool r = true; 230 ast_type_qualifier ubo_mat_mask; 231 ubo_mat_mask.flags.i = 0; 232 ubo_mat_mask.flags.q.row_major = 1; 233 ubo_mat_mask.flags.q.column_major = 1; 234 235 ast_type_qualifier ubo_layout_mask; 236 ubo_layout_mask.flags.i = 0; 237 ubo_layout_mask.flags.q.std140 = 1; 238 ubo_layout_mask.flags.q.packed = 1; 239 ubo_layout_mask.flags.q.shared = 1; 240 ubo_layout_mask.flags.q.std430 = 1; 241 242 ast_type_qualifier ubo_binding_mask; 243 ubo_binding_mask.flags.i = 0; 244 ubo_binding_mask.flags.q.explicit_binding = 1; 245 ubo_binding_mask.flags.q.explicit_offset = 1; 246 247 ast_type_qualifier stream_layout_mask; 248 stream_layout_mask.flags.i = 0; 249 stream_layout_mask.flags.q.stream = 1; 250 251 /* FIXME: We should probably do interface and function param validation 252 * separately. 253 */ 254 ast_type_qualifier input_layout_mask; 255 input_layout_mask.flags.i = 0; 256 input_layout_mask.flags.q.centroid = 1; 257 /* Function params can have constant */ 258 input_layout_mask.flags.q.constant = 1; 259 input_layout_mask.flags.q.explicit_component = 1; 260 input_layout_mask.flags.q.explicit_location = 1; 261 input_layout_mask.flags.q.flat = 1; 262 input_layout_mask.flags.q.in = 1; 263 input_layout_mask.flags.q.invariant = 1; 264 input_layout_mask.flags.q.noperspective = 1; 265 input_layout_mask.flags.q.origin_upper_left = 1; 266 /* Function params 'inout' will set this */ 267 input_layout_mask.flags.q.out = 1; 268 input_layout_mask.flags.q.patch = 1; 269 input_layout_mask.flags.q.pixel_center_integer = 1; 270 input_layout_mask.flags.q.precise = 1; 271 input_layout_mask.flags.q.sample = 1; 272 input_layout_mask.flags.q.smooth = 1; 273 274 if (state->has_bindless()) { 275 /* Allow to use image qualifiers with shader inputs/outputs. */ 276 input_layout_mask.flags.q.coherent = 1; 277 input_layout_mask.flags.q._volatile = 1; 278 input_layout_mask.flags.q.restrict_flag = 1; 279 input_layout_mask.flags.q.read_only = 1; 280 input_layout_mask.flags.q.write_only = 1; 281 input_layout_mask.flags.q.explicit_image_format = 1; 282 } 283 284 /* Uniform block layout qualifiers get to overwrite each 285 * other (rightmost having priority), while all other 286 * qualifiers currently don't allow duplicates. 287 */ 288 ast_type_qualifier allowed_duplicates_mask; 289 allowed_duplicates_mask.flags.i = 290 ubo_mat_mask.flags.i | 291 ubo_layout_mask.flags.i | 292 ubo_binding_mask.flags.i; 293 294 /* Geometry shaders can have several layout qualifiers 295 * assigning different stream values. 296 */ 297 if (state->stage == MESA_SHADER_GEOMETRY) { 298 allowed_duplicates_mask.flags.i |= 299 stream_layout_mask.flags.i; 300 } 301 302 if (is_single_layout_merge && !state->has_enhanced_layouts() && 303 (this->flags.i & q.flags.i & ~allowed_duplicates_mask.flags.i) != 0) { 304 _mesa_glsl_error(loc, state, "duplicate layout qualifiers used"); 305 return false; 306 } 307 308 if (is_multiple_layouts_merge && !state->has_420pack_or_es31()) { 309 _mesa_glsl_error(loc, state, 310 "duplicate layout(...) qualifiers"); 311 return false; 312 } 313 314 if (q.flags.q.prim_type) { 315 r &= validate_prim_type(loc, state, *this, q); 316 this->flags.q.prim_type = 1; 317 this->prim_type = q.prim_type; 318 } 319 320 if (q.flags.q.max_vertices) { 321 if (this->flags.q.max_vertices 322 && !is_single_layout_merge && !is_multiple_layouts_merge) { 323 this->max_vertices->merge_qualifier(q.max_vertices); 324 } else { 325 this->flags.q.max_vertices = 1; 326 this->max_vertices = q.max_vertices; 327 } 328 } 329 330 if (q.subroutine_list) { 331 if (this->subroutine_list) { 332 _mesa_glsl_error(loc, state, 333 "conflicting subroutine qualifiers used"); 334 } else { 335 this->subroutine_list = q.subroutine_list; 336 } 337 } 338 339 if (q.flags.q.invocations) { 340 if (this->flags.q.invocations 341 && !is_single_layout_merge && !is_multiple_layouts_merge) { 342 this->invocations->merge_qualifier(q.invocations); 343 } else { 344 this->flags.q.invocations = 1; 345 this->invocations = q.invocations; 346 } 347 } 348 349 if (state->stage == MESA_SHADER_GEOMETRY && 350 state->has_explicit_attrib_stream()) { 351 if (!this->flags.q.explicit_stream) { 352 if (q.flags.q.stream) { 353 this->flags.q.stream = 1; 354 this->stream = q.stream; 355 } else if (!this->flags.q.stream && this->flags.q.out && 356 !this->flags.q.in) { 357 /* Assign default global stream value */ 358 this->flags.q.stream = 1; 359 this->stream = state->out_qualifier->stream; 360 } 361 } 362 } 363 364 if (state->has_enhanced_layouts()) { 365 if (!this->flags.q.explicit_xfb_buffer) { 366 if (q.flags.q.xfb_buffer) { 367 this->flags.q.xfb_buffer = 1; 368 this->xfb_buffer = q.xfb_buffer; 369 } else if (!this->flags.q.xfb_buffer && this->flags.q.out && 370 !this->flags.q.in) { 371 /* Assign global xfb_buffer value */ 372 this->flags.q.xfb_buffer = 1; 373 this->xfb_buffer = state->out_qualifier->xfb_buffer; 374 } 375 } 376 377 if (q.flags.q.explicit_xfb_stride) { 378 this->flags.q.xfb_stride = 1; 379 this->flags.q.explicit_xfb_stride = 1; 380 this->xfb_stride = q.xfb_stride; 381 } 382 } 383 384 if (q.flags.q.vertices) { 385 if (this->flags.q.vertices 386 && !is_single_layout_merge && !is_multiple_layouts_merge) { 387 this->vertices->merge_qualifier(q.vertices); 388 } else { 389 this->flags.q.vertices = 1; 390 this->vertices = q.vertices; 391 } 392 } 393 394 if (q.flags.q.vertex_spacing) { 395 r &= validate_vertex_spacing(loc, state, *this, q); 396 this->flags.q.vertex_spacing = 1; 397 this->vertex_spacing = q.vertex_spacing; 398 } 399 400 if (q.flags.q.ordering) { 401 r &= validate_ordering(loc, state, *this, q); 402 this->flags.q.ordering = 1; 403 this->ordering = q.ordering; 404 } 405 406 if (q.flags.q.point_mode) { 407 r &= validate_point_mode(*this, q); 408 this->flags.q.point_mode = 1; 409 this->point_mode = q.point_mode; 410 } 411 412 if (q.flags.q.early_fragment_tests) 413 this->flags.q.early_fragment_tests = true; 414 415 if ((q.flags.i & ubo_mat_mask.flags.i) != 0) 416 this->flags.i &= ~ubo_mat_mask.flags.i; 417 if ((q.flags.i & ubo_layout_mask.flags.i) != 0) 418 this->flags.i &= ~ubo_layout_mask.flags.i; 419 420 for (int i = 0; i < 3; i++) { 421 if (q.flags.q.local_size & (1 << i)) { 422 if (this->local_size[i] 423 && !is_single_layout_merge && !is_multiple_layouts_merge) { 424 this->local_size[i]->merge_qualifier(q.local_size[i]); 425 } else { 426 this->local_size[i] = q.local_size[i]; 427 } 428 } 429 } 430 431 if (q.flags.q.local_size_variable) 432 this->flags.q.local_size_variable = true; 433 434 if (q.flags.q.bindless_sampler) 435 this->flags.q.bindless_sampler = true; 436 437 if (q.flags.q.bindless_image) 438 this->flags.q.bindless_image = true; 439 440 if (q.flags.q.bound_sampler) 441 this->flags.q.bound_sampler = true; 442 443 if (q.flags.q.bound_image) 444 this->flags.q.bound_image = true; 445 446 this->flags.i |= q.flags.i; 447 448 if (this->flags.q.in && 449 (this->flags.i & ~input_layout_mask.flags.i) != 0) { 450 _mesa_glsl_error(loc, state, "invalid input layout qualifier used"); 451 return false; 452 } 453 454 if (q.flags.q.explicit_align) 455 this->align = q.align; 456 457 if (q.flags.q.explicit_location) 458 this->location = q.location; 459 460 if (q.flags.q.explicit_index) 461 this->index = q.index; 462 463 if (q.flags.q.explicit_component) 464 this->component = q.component; 465 466 if (q.flags.q.explicit_binding) 467 this->binding = q.binding; 468 469 if (q.flags.q.explicit_offset || q.flags.q.explicit_xfb_offset) 470 this->offset = q.offset; 471 472 if (q.precision != ast_precision_none) 473 this->precision = q.precision; 474 475 if (q.flags.q.explicit_image_format) { 476 this->image_format = q.image_format; 477 this->image_base_type = q.image_base_type; 478 } 479 480 if (q.flags.q.bindless_sampler || 481 q.flags.q.bindless_image || 482 q.flags.q.bound_sampler || 483 q.flags.q.bound_image) 484 merge_bindless_qualifier(state); 485 486 return r; 487 } 488 489 bool 490 ast_type_qualifier::validate_out_qualifier(YYLTYPE *loc, 491 _mesa_glsl_parse_state *state) 492 { 493 bool r = true; 494 ast_type_qualifier valid_out_mask; 495 valid_out_mask.flags.i = 0; 496 497 switch (state->stage) { 498 case MESA_SHADER_GEOMETRY: 499 if (this->flags.q.prim_type) { 500 /* Make sure this is a valid output primitive type. */ 501 switch (this->prim_type) { 502 case GL_POINTS: 503 case GL_LINE_STRIP: 504 case GL_TRIANGLE_STRIP: 505 break; 506 default: 507 r = false; 508 _mesa_glsl_error(loc, state, "invalid geometry shader output " 509 "primitive type"); 510 break; 511 } 512 } 513 514 valid_out_mask.flags.q.stream = 1; 515 valid_out_mask.flags.q.explicit_stream = 1; 516 valid_out_mask.flags.q.explicit_xfb_buffer = 1; 517 valid_out_mask.flags.q.xfb_buffer = 1; 518 valid_out_mask.flags.q.explicit_xfb_stride = 1; 519 valid_out_mask.flags.q.xfb_stride = 1; 520 valid_out_mask.flags.q.max_vertices = 1; 521 valid_out_mask.flags.q.prim_type = 1; 522 break; 523 case MESA_SHADER_TESS_CTRL: 524 valid_out_mask.flags.q.vertices = 1; 525 valid_out_mask.flags.q.explicit_xfb_buffer = 1; 526 valid_out_mask.flags.q.xfb_buffer = 1; 527 valid_out_mask.flags.q.explicit_xfb_stride = 1; 528 valid_out_mask.flags.q.xfb_stride = 1; 529 break; 530 case MESA_SHADER_TESS_EVAL: 531 case MESA_SHADER_VERTEX: 532 valid_out_mask.flags.q.explicit_xfb_buffer = 1; 533 valid_out_mask.flags.q.xfb_buffer = 1; 534 valid_out_mask.flags.q.explicit_xfb_stride = 1; 535 valid_out_mask.flags.q.xfb_stride = 1; 536 break; 537 case MESA_SHADER_FRAGMENT: 538 valid_out_mask.flags.q.blend_support = 1; 539 break; 540 default: 541 r = false; 542 _mesa_glsl_error(loc, state, 543 "out layout qualifiers only valid in " 544 "geometry, tessellation, vertex and fragment shaders"); 545 } 546 547 /* Generate an error when invalid output layout qualifiers are used. */ 548 if ((this->flags.i & ~valid_out_mask.flags.i) != 0) { 549 r = false; 550 _mesa_glsl_error(loc, state, "invalid output layout qualifiers used"); 551 } 552 553 return r; 554 } 555 556 bool 557 ast_type_qualifier::merge_into_out_qualifier(YYLTYPE *loc, 558 _mesa_glsl_parse_state *state, 559 ast_node* &node) 560 { 561 const bool r = state->out_qualifier->merge_qualifier(loc, state, 562 *this, false); 563 564 switch (state->stage) { 565 case MESA_SHADER_GEOMETRY: 566 /* Allow future assignments of global out's stream id value */ 567 state->out_qualifier->flags.q.explicit_stream = 0; 568 break; 569 case MESA_SHADER_TESS_CTRL: 570 node = new(state->linalloc) ast_tcs_output_layout(*loc); 571 break; 572 default: 573 break; 574 } 575 576 /* Allow future assignments of global out's */ 577 state->out_qualifier->flags.q.explicit_xfb_buffer = 0; 578 state->out_qualifier->flags.q.explicit_xfb_stride = 0; 579 580 return r; 581 } 582 583 bool 584 ast_type_qualifier::validate_in_qualifier(YYLTYPE *loc, 585 _mesa_glsl_parse_state *state) 586 { 587 bool r = true; 588 ast_type_qualifier valid_in_mask; 589 valid_in_mask.flags.i = 0; 590 591 switch (state->stage) { 592 case MESA_SHADER_TESS_EVAL: 593 if (this->flags.q.prim_type) { 594 /* Make sure this is a valid input primitive type. */ 595 switch (this->prim_type) { 596 case GL_TRIANGLES: 597 case GL_QUADS: 598 case GL_ISOLINES: 599 break; 600 default: 601 r = false; 602 _mesa_glsl_error(loc, state, 603 "invalid tessellation evaluation " 604 "shader input primitive type"); 605 break; 606 } 607 } 608 609 valid_in_mask.flags.q.prim_type = 1; 610 valid_in_mask.flags.q.vertex_spacing = 1; 611 valid_in_mask.flags.q.ordering = 1; 612 valid_in_mask.flags.q.point_mode = 1; 613 break; 614 case MESA_SHADER_GEOMETRY: 615 if (this->flags.q.prim_type) { 616 /* Make sure this is a valid input primitive type. */ 617 switch (this->prim_type) { 618 case GL_POINTS: 619 case GL_LINES: 620 case GL_LINES_ADJACENCY: 621 case GL_TRIANGLES: 622 case GL_TRIANGLES_ADJACENCY: 623 break; 624 default: 625 r = false; 626 _mesa_glsl_error(loc, state, 627 "invalid geometry shader input primitive type"); 628 break; 629 } 630 } 631 632 valid_in_mask.flags.q.prim_type = 1; 633 valid_in_mask.flags.q.invocations = 1; 634 break; 635 case MESA_SHADER_FRAGMENT: 636 valid_in_mask.flags.q.early_fragment_tests = 1; 637 valid_in_mask.flags.q.inner_coverage = 1; 638 valid_in_mask.flags.q.post_depth_coverage = 1; 639 break; 640 case MESA_SHADER_COMPUTE: 641 valid_in_mask.flags.q.local_size = 7; 642 valid_in_mask.flags.q.local_size_variable = 1; 643 break; 644 default: 645 r = false; 646 _mesa_glsl_error(loc, state, 647 "input layout qualifiers only valid in " 648 "geometry, tessellation, fragment and compute shaders"); 649 break; 650 } 651 652 /* Generate an error when invalid input layout qualifiers are used. */ 653 if ((this->flags.i & ~valid_in_mask.flags.i) != 0) { 654 r = false; 655 _mesa_glsl_error(loc, state, "invalid input layout qualifiers used"); 656 } 657 658 /* The checks below are also performed when merging but we want to spit an 659 * error against the default global input qualifier as soon as we can, with 660 * the closest error location in the shader. 661 */ 662 r &= validate_prim_type(loc, state, *state->in_qualifier, *this); 663 r &= validate_vertex_spacing(loc, state, *state->in_qualifier, *this); 664 r &= validate_ordering(loc, state, *state->in_qualifier, *this); 665 r &= validate_point_mode(*state->in_qualifier, *this); 666 667 return r; 668 } 669 670 bool 671 ast_type_qualifier::merge_into_in_qualifier(YYLTYPE *loc, 672 _mesa_glsl_parse_state *state, 673 ast_node* &node) 674 { 675 bool r = true; 676 void *lin_ctx = state->linalloc; 677 678 /* We create the gs_input_layout node before merging so, in the future, no 679 * more repeated nodes will be created as we will have the flag set. 680 */ 681 if (state->stage == MESA_SHADER_GEOMETRY 682 && this->flags.q.prim_type && !state->in_qualifier->flags.q.prim_type) { 683 node = new(lin_ctx) ast_gs_input_layout(*loc, this->prim_type); 684 } 685 686 r = state->in_qualifier->merge_qualifier(loc, state, *this, false); 687 688 if (state->in_qualifier->flags.q.early_fragment_tests) { 689 state->fs_early_fragment_tests = true; 690 state->in_qualifier->flags.q.early_fragment_tests = false; 691 } 692 693 if (state->in_qualifier->flags.q.inner_coverage) { 694 state->fs_inner_coverage = true; 695 state->in_qualifier->flags.q.inner_coverage = false; 696 } 697 698 if (state->in_qualifier->flags.q.post_depth_coverage) { 699 state->fs_post_depth_coverage = true; 700 state->in_qualifier->flags.q.post_depth_coverage = false; 701 } 702 703 if (state->fs_inner_coverage && state->fs_post_depth_coverage) { 704 _mesa_glsl_error(loc, state, 705 "inner_coverage & post_depth_coverage layout qualifiers " 706 "are mutally exclusives"); 707 r = false; 708 } 709 710 /* We allow the creation of multiple cs_input_layout nodes. Coherence among 711 * all existing nodes is checked later, when the AST node is transformed 712 * into HIR. 713 */ 714 if (state->in_qualifier->flags.q.local_size) { 715 node = new(lin_ctx) ast_cs_input_layout(*loc, 716 state->in_qualifier->local_size); 717 state->in_qualifier->flags.q.local_size = 0; 718 for (int i = 0; i < 3; i++) 719 state->in_qualifier->local_size[i] = NULL; 720 } 721 722 if (state->in_qualifier->flags.q.local_size_variable) { 723 state->cs_input_local_size_variable_specified = true; 724 state->in_qualifier->flags.q.local_size_variable = false; 725 } 726 727 return r; 728 } 729 730 bool 731 ast_type_qualifier::push_to_global(YYLTYPE *loc, 732 _mesa_glsl_parse_state *state) 733 { 734 if (this->flags.q.xfb_stride) { 735 this->flags.q.xfb_stride = 0; 736 737 unsigned buff_idx; 738 if (process_qualifier_constant(state, loc, "xfb_buffer", 739 this->xfb_buffer, &buff_idx)) { 740 if (state->out_qualifier->out_xfb_stride[buff_idx]) { 741 state->out_qualifier->out_xfb_stride[buff_idx]->merge_qualifier( 742 new(state->linalloc) ast_layout_expression(*loc, 743 this->xfb_stride)); 744 } else { 745 state->out_qualifier->out_xfb_stride[buff_idx] = 746 new(state->linalloc) ast_layout_expression(*loc, 747 this->xfb_stride); 748 } 749 } 750 } 751 752 return true; 753 } 754 755 /** 756 * Check if the current type qualifier has any illegal flags. 757 * 758 * If so, print an error message, followed by a list of illegal flags. 759 * 760 * \param message The error message to print. 761 * \param allowed_flags A list of valid flags. 762 */ 763 bool 764 ast_type_qualifier::validate_flags(YYLTYPE *loc, 765 _mesa_glsl_parse_state *state, 766 const ast_type_qualifier &allowed_flags, 767 const char *message, const char *name) 768 { 769 ast_type_qualifier bad; 770 bad.flags.i = this->flags.i & ~allowed_flags.flags.i; 771 if (bad.flags.i == 0) 772 return true; 773 774 _mesa_glsl_error(loc, state, 775 "%s '%s':" 776 "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" 777 "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" 778 "%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", 779 message, name, 780 bad.flags.q.invariant ? " invariant" : "", 781 bad.flags.q.precise ? " precise" : "", 782 bad.flags.q.constant ? " constant" : "", 783 bad.flags.q.attribute ? " attribute" : "", 784 bad.flags.q.varying ? " varying" : "", 785 bad.flags.q.in ? " in" : "", 786 bad.flags.q.out ? " out" : "", 787 bad.flags.q.centroid ? " centroid" : "", 788 bad.flags.q.sample ? " sample" : "", 789 bad.flags.q.patch ? " patch" : "", 790 bad.flags.q.uniform ? " uniform" : "", 791 bad.flags.q.buffer ? " buffer" : "", 792 bad.flags.q.shared_storage ? " shared_storage" : "", 793 bad.flags.q.smooth ? " smooth" : "", 794 bad.flags.q.flat ? " flat" : "", 795 bad.flags.q.noperspective ? " noperspective" : "", 796 bad.flags.q.origin_upper_left ? " origin_upper_left" : "", 797 bad.flags.q.pixel_center_integer ? " pixel_center_integer" : "", 798 bad.flags.q.explicit_align ? " align" : "", 799 bad.flags.q.explicit_component ? " component" : "", 800 bad.flags.q.explicit_location ? " location" : "", 801 bad.flags.q.explicit_index ? " index" : "", 802 bad.flags.q.explicit_binding ? " binding" : "", 803 bad.flags.q.explicit_offset ? " offset" : "", 804 bad.flags.q.depth_type ? " depth_type" : "", 805 bad.flags.q.std140 ? " std140" : "", 806 bad.flags.q.std430 ? " std430" : "", 807 bad.flags.q.shared ? " shared" : "", 808 bad.flags.q.packed ? " packed" : "", 809 bad.flags.q.column_major ? " column_major" : "", 810 bad.flags.q.row_major ? " row_major" : "", 811 bad.flags.q.prim_type ? " prim_type" : "", 812 bad.flags.q.max_vertices ? " max_vertices" : "", 813 bad.flags.q.local_size ? " local_size" : "", 814 bad.flags.q.local_size_variable ? " local_size_variable" : "", 815 bad.flags.q.early_fragment_tests ? " early_fragment_tests" : "", 816 bad.flags.q.explicit_image_format ? " image_format" : "", 817 bad.flags.q.coherent ? " coherent" : "", 818 bad.flags.q._volatile ? " _volatile" : "", 819 bad.flags.q.restrict_flag ? " restrict_flag" : "", 820 bad.flags.q.read_only ? " read_only" : "", 821 bad.flags.q.write_only ? " write_only" : "", 822 bad.flags.q.invocations ? " invocations" : "", 823 bad.flags.q.stream ? " stream" : "", 824 bad.flags.q.explicit_stream ? " stream" : "", 825 bad.flags.q.explicit_xfb_offset ? " xfb_offset" : "", 826 bad.flags.q.xfb_buffer ? " xfb_buffer" : "", 827 bad.flags.q.explicit_xfb_buffer ? " xfb_buffer" : "", 828 bad.flags.q.xfb_stride ? " xfb_stride" : "", 829 bad.flags.q.explicit_xfb_stride ? " xfb_stride" : "", 830 bad.flags.q.vertex_spacing ? " vertex_spacing" : "", 831 bad.flags.q.ordering ? " ordering" : "", 832 bad.flags.q.point_mode ? " point_mode" : "", 833 bad.flags.q.vertices ? " vertices" : "", 834 bad.flags.q.subroutine ? " subroutine" : "", 835 bad.flags.q.blend_support ? " blend_support" : "", 836 bad.flags.q.inner_coverage ? " inner_coverage" : "", 837 bad.flags.q.bindless_sampler ? " bindless_sampler" : "", 838 bad.flags.q.bindless_image ? " bindless_image" : "", 839 bad.flags.q.bound_sampler ? " bound_sampler" : "", 840 bad.flags.q.bound_image ? " bound_image" : "", 841 bad.flags.q.post_depth_coverage ? " post_depth_coverage" : ""); 842 return false; 843 } 844 845 bool 846 ast_layout_expression::process_qualifier_constant(struct _mesa_glsl_parse_state *state, 847 const char *qual_indentifier, 848 unsigned *value, 849 bool can_be_zero) 850 { 851 int min_value = 0; 852 bool first_pass = true; 853 *value = 0; 854 855 if (!can_be_zero) 856 min_value = 1; 857 858 for (exec_node *node = layout_const_expressions.get_head_raw(); 859 !node->is_tail_sentinel(); node = node->next) { 860 861 exec_list dummy_instructions; 862 ast_node *const_expression = exec_node_data(ast_node, node, link); 863 864 ir_rvalue *const ir = const_expression->hir(&dummy_instructions, state); 865 866 ir_constant *const const_int = 867 ir->constant_expression_value(ralloc_parent(ir)); 868 869 if (const_int == NULL || !const_int->type->is_integer()) { 870 YYLTYPE loc = const_expression->get_location(); 871 _mesa_glsl_error(&loc, state, "%s must be an integral constant " 872 "expression", qual_indentifier); 873 return false; 874 } 875 876 if (const_int->value.i[0] < min_value) { 877 YYLTYPE loc = const_expression->get_location(); 878 _mesa_glsl_error(&loc, state, "%s layout qualifier is invalid " 879 "(%d < %d)", qual_indentifier, 880 const_int->value.i[0], min_value); 881 return false; 882 } 883 884 if (!first_pass && *value != const_int->value.u[0]) { 885 YYLTYPE loc = const_expression->get_location(); 886 _mesa_glsl_error(&loc, state, "%s layout qualifier does not " 887 "match previous declaration (%d vs %d)", 888 qual_indentifier, *value, const_int->value.i[0]); 889 return false; 890 } else { 891 first_pass = false; 892 *value = const_int->value.u[0]; 893 } 894 895 /* If the location is const (and we've verified that 896 * it is) then no instructions should have been emitted 897 * when we converted it to HIR. If they were emitted, 898 * then either the location isn't const after all, or 899 * we are emitting unnecessary instructions. 900 */ 901 assert(dummy_instructions.is_empty()); 902 } 903 904 return true; 905 } 906 907 bool 908 process_qualifier_constant(struct _mesa_glsl_parse_state *state, 909 YYLTYPE *loc, 910 const char *qual_indentifier, 911 ast_expression *const_expression, 912 unsigned *value) 913 { 914 exec_list dummy_instructions; 915 916 if (const_expression == NULL) { 917 *value = 0; 918 return true; 919 } 920 921 ir_rvalue *const ir = const_expression->hir(&dummy_instructions, state); 922 923 ir_constant *const const_int = 924 ir->constant_expression_value(ralloc_parent(ir)); 925 if (const_int == NULL || !const_int->type->is_integer()) { 926 _mesa_glsl_error(loc, state, "%s must be an integral constant " 927 "expression", qual_indentifier); 928 return false; 929 } 930 931 if (const_int->value.i[0] < 0) { 932 _mesa_glsl_error(loc, state, "%s layout qualifier is invalid (%d < 0)", 933 qual_indentifier, const_int->value.u[0]); 934 return false; 935 } 936 937 /* If the location is const (and we've verified that 938 * it is) then no instructions should have been emitted 939 * when we converted it to HIR. If they were emitted, 940 * then either the location isn't const after all, or 941 * we are emitting unnecessary instructions. 942 */ 943 assert(dummy_instructions.is_empty()); 944 945 *value = const_int->value.u[0]; 946 return true; 947 } 948