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 extern "C" { 26 #include "program/symbol_table.h" 27 } 28 29 void 30 ast_type_specifier::print(void) const 31 { 32 if (structure) { 33 structure->print(); 34 } else { 35 printf("%s ", type_name); 36 } 37 38 if (is_array) { 39 printf("[ "); 40 41 if (array_size) { 42 array_size->print(); 43 } 44 45 printf("] "); 46 } 47 } 48 49 bool 50 ast_fully_specified_type::has_qualifiers() const 51 { 52 return this->qualifier.flags.i != 0; 53 } 54 55 bool ast_type_qualifier::has_interpolation() const 56 { 57 return this->flags.q.smooth 58 || this->flags.q.flat 59 || this->flags.q.noperspective; 60 } 61 62 const char* 63 ast_type_qualifier::interpolation_string() const 64 { 65 if (this->flags.q.smooth) 66 return "smooth"; 67 else if (this->flags.q.flat) 68 return "flat"; 69 else if (this->flags.q.noperspective) 70 return "noperspective"; 71 else 72 return NULL; 73 } 74 75 bool 76 ast_type_qualifier::merge_qualifier(YYLTYPE *loc, 77 _mesa_glsl_parse_state *state, 78 ast_type_qualifier q) 79 { 80 ast_type_qualifier ubo_mat_mask; 81 ubo_mat_mask.flags.i = 0; 82 ubo_mat_mask.flags.q.row_major = 1; 83 ubo_mat_mask.flags.q.column_major = 1; 84 85 ast_type_qualifier ubo_layout_mask; 86 ubo_layout_mask.flags.i = 0; 87 ubo_layout_mask.flags.q.std140 = 1; 88 ubo_layout_mask.flags.q.packed = 1; 89 ubo_layout_mask.flags.q.shared = 1; 90 91 /* Uniform block layout qualifiers get to overwrite each 92 * other (rightmost having priority), while all other 93 * qualifiers currently don't allow duplicates. 94 */ 95 96 if ((this->flags.i & q.flags.i & ~(ubo_mat_mask.flags.i | 97 ubo_layout_mask.flags.i)) != 0) { 98 _mesa_glsl_error(loc, state, 99 "duplicate layout qualifiers used\n"); 100 return false; 101 } 102 103 if ((q.flags.i & ubo_mat_mask.flags.i) != 0) 104 this->flags.i &= ~ubo_mat_mask.flags.i; 105 if ((q.flags.i & ubo_layout_mask.flags.i) != 0) 106 this->flags.i &= ~ubo_layout_mask.flags.i; 107 108 this->flags.i |= q.flags.i; 109 110 if (q.flags.q.explicit_location) 111 this->location = q.location; 112 113 if (q.flags.q.explicit_index) 114 this->index = q.index; 115 116 return true; 117 } 118 119