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 #include "compiler/glsl_types.h" 26 #include "ir.h" 27 28 void 29 ast_array_specifier::print(void) const 30 { 31 foreach_list_typed (ast_node, array_dimension, link, &this->array_dimensions) { 32 printf("[ "); 33 if (((ast_expression*)array_dimension)->oper != ast_unsized_array_dim) 34 array_dimension->print(); 35 printf("] "); 36 } 37 } 38 39 /** 40 * If \c ir is a reference to an array for which we are tracking the max array 41 * element accessed, track that the given element has been accessed. 42 * Otherwise do nothing. 43 * 44 * This function also checks whether the array is a built-in array whose 45 * maximum size is too small to accommodate the given index, and if so uses 46 * loc and state to report the error. 47 */ 48 static void 49 update_max_array_access(ir_rvalue *ir, int idx, YYLTYPE *loc, 50 struct _mesa_glsl_parse_state *state) 51 { 52 if (ir_dereference_variable *deref_var = ir->as_dereference_variable()) { 53 ir_variable *var = deref_var->var; 54 if (idx > (int)var->data.max_array_access) { 55 var->data.max_array_access = idx; 56 57 /* Check whether this access will, as a side effect, implicitly cause 58 * the size of a built-in array to be too large. 59 */ 60 check_builtin_array_max_size(var->name, idx+1, *loc, state); 61 } 62 } else if (ir_dereference_record *deref_record = 63 ir->as_dereference_record()) { 64 /* There are three possibilities we need to consider: 65 * 66 * - Accessing an element of an array that is a member of a named 67 * interface block (e.g. ifc.foo[i]) 68 * 69 * - Accessing an element of an array that is a member of a named 70 * interface block array (e.g. ifc[j].foo[i]). 71 * 72 * - Accessing an element of an array that is a member of a named 73 * interface block array of arrays (e.g. ifc[j][k].foo[i]). 74 */ 75 ir_dereference_variable *deref_var = 76 deref_record->record->as_dereference_variable(); 77 if (deref_var == NULL) { 78 ir_dereference_array *deref_array = 79 deref_record->record->as_dereference_array(); 80 ir_dereference_array *deref_array_prev = NULL; 81 while (deref_array != NULL) { 82 deref_array_prev = deref_array; 83 deref_array = deref_array->array->as_dereference_array(); 84 } 85 if (deref_array_prev != NULL) 86 deref_var = deref_array_prev->array->as_dereference_variable(); 87 } 88 89 if (deref_var != NULL) { 90 if (deref_var->var->is_interface_instance()) { 91 unsigned field_idx = deref_record->field_idx; 92 assert(field_idx < deref_var->var->get_interface_type()->length); 93 94 int *const max_ifc_array_access = 95 deref_var->var->get_max_ifc_array_access(); 96 97 assert(max_ifc_array_access != NULL); 98 99 if (idx > max_ifc_array_access[field_idx]) { 100 max_ifc_array_access[field_idx] = idx; 101 102 /* Check whether this access will, as a side effect, implicitly 103 * cause the size of a built-in array to be too large. 104 */ 105 const char *field_name = 106 deref_record->record->type->fields.structure[field_idx].name; 107 check_builtin_array_max_size(field_name, idx+1, *loc, state); 108 } 109 } 110 } 111 } 112 } 113 114 115 static int 116 get_implicit_array_size(struct _mesa_glsl_parse_state *state, 117 ir_rvalue *array) 118 { 119 ir_variable *var = array->variable_referenced(); 120 121 /* Inputs in control shader are implicitly sized 122 * to the maximum patch size. 123 */ 124 if (state->stage == MESA_SHADER_TESS_CTRL && 125 var->data.mode == ir_var_shader_in) { 126 return state->Const.MaxPatchVertices; 127 } 128 129 /* Non-patch inputs in evaluation shader are implicitly sized 130 * to the maximum patch size. 131 */ 132 if (state->stage == MESA_SHADER_TESS_EVAL && 133 var->data.mode == ir_var_shader_in && 134 !var->data.patch) { 135 return state->Const.MaxPatchVertices; 136 } 137 138 return 0; 139 } 140 141 142 ir_rvalue * 143 _mesa_ast_array_index_to_hir(void *mem_ctx, 144 struct _mesa_glsl_parse_state *state, 145 ir_rvalue *array, ir_rvalue *idx, 146 YYLTYPE &loc, YYLTYPE &idx_loc) 147 { 148 if (!array->type->is_error() 149 && !array->type->is_array() 150 && !array->type->is_matrix() 151 && !array->type->is_vector()) { 152 _mesa_glsl_error(& idx_loc, state, 153 "cannot dereference non-array / non-matrix / " 154 "non-vector"); 155 } 156 157 if (!idx->type->is_error()) { 158 if (!idx->type->is_integer()) { 159 _mesa_glsl_error(& idx_loc, state, "array index must be integer type"); 160 } else if (!idx->type->is_scalar()) { 161 _mesa_glsl_error(& idx_loc, state, "array index must be scalar"); 162 } 163 } 164 165 /* If the array index is a constant expression and the array has a 166 * declared size, ensure that the access is in-bounds. If the array 167 * index is not a constant expression, ensure that the array has a 168 * declared size. 169 */ 170 ir_constant *const const_index = idx->constant_expression_value(mem_ctx); 171 if (const_index != NULL && idx->type->is_integer()) { 172 const int idx = const_index->value.i[0]; 173 const char *type_name = "error"; 174 unsigned bound = 0; 175 176 /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec: 177 * 178 * "It is illegal to declare an array with a size, and then 179 * later (in the same shader) index the same array with an 180 * integral constant expression greater than or equal to the 181 * declared size. It is also illegal to index an array with a 182 * negative constant expression." 183 */ 184 if (array->type->is_matrix()) { 185 if (array->type->row_type()->vector_elements <= idx) { 186 type_name = "matrix"; 187 bound = array->type->row_type()->vector_elements; 188 } 189 } else if (array->type->is_vector()) { 190 if (array->type->vector_elements <= idx) { 191 type_name = "vector"; 192 bound = array->type->vector_elements; 193 } 194 } else { 195 /* glsl_type::array_size() returns -1 for non-array types. This means 196 * that we don't need to verify that the type is an array before 197 * doing the bounds checking. 198 */ 199 if ((array->type->array_size() > 0) 200 && (array->type->array_size() <= idx)) { 201 type_name = "array"; 202 bound = array->type->array_size(); 203 } 204 } 205 206 if (bound > 0) { 207 _mesa_glsl_error(& loc, state, "%s index must be < %u", 208 type_name, bound); 209 } else if (idx < 0) { 210 _mesa_glsl_error(& loc, state, "%s index must be >= 0", type_name); 211 } 212 213 if (array->type->is_array()) 214 update_max_array_access(array, idx, &loc, state); 215 } else if (const_index == NULL && array->type->is_array()) { 216 if (array->type->is_unsized_array()) { 217 int implicit_size = get_implicit_array_size(state, array); 218 if (implicit_size) { 219 ir_variable *v = array->whole_variable_referenced(); 220 if (v != NULL) 221 v->data.max_array_access = implicit_size - 1; 222 } 223 else if (state->stage == MESA_SHADER_TESS_CTRL && 224 array->variable_referenced()->data.mode == ir_var_shader_out && 225 !array->variable_referenced()->data.patch) { 226 /* Tessellation control shader output non-patch arrays are 227 * initially unsized. Despite that, they are allowed to be 228 * indexed with a non-constant expression (typically 229 * "gl_InvocationID"). The array size will be determined 230 * by the linker. 231 */ 232 } 233 else if (array->variable_referenced()->data.mode != 234 ir_var_shader_storage) { 235 _mesa_glsl_error(&loc, state, "unsized array index must be constant"); 236 } else { 237 /* Unsized array non-constant indexing on SSBO is allowed only for 238 * the last member of the SSBO definition. 239 */ 240 ir_variable *var = array->variable_referenced(); 241 const glsl_type *iface_type = var->get_interface_type(); 242 int field_index = iface_type->field_index(var->name); 243 /* Field index can be < 0 for instance arrays */ 244 if (field_index >= 0 && 245 field_index != (int) iface_type->length - 1) { 246 _mesa_glsl_error(&loc, state, "Indirect access on unsized " 247 "array is limited to the last member of " 248 "SSBO."); 249 } 250 } 251 } else if (array->type->without_array()->is_interface() 252 && ((array->variable_referenced()->data.mode == ir_var_uniform 253 && !state->is_version(400, 320) 254 && !state->ARB_gpu_shader5_enable 255 && !state->EXT_gpu_shader5_enable 256 && !state->OES_gpu_shader5_enable) || 257 (array->variable_referenced()->data.mode == ir_var_shader_storage 258 && !state->is_version(400, 0) 259 && !state->ARB_gpu_shader5_enable))) { 260 /* Page 50 in section 4.3.9 of the OpenGL ES 3.10 spec says: 261 * 262 * "All indices used to index a uniform or shader storage block 263 * array must be constant integral expressions." 264 * 265 * But OES_gpu_shader5 (and ESSL 3.20) relax this to allow indexing 266 * on uniform blocks but not shader storage blocks. 267 * 268 */ 269 _mesa_glsl_error(&loc, state, "%s block array index must be constant", 270 array->variable_referenced()->data.mode 271 == ir_var_uniform ? "uniform" : "shader storage"); 272 } else { 273 /* whole_variable_referenced can return NULL if the array is a 274 * member of a structure. In this case it is safe to not update 275 * the max_array_access field because it is never used for fields 276 * of structures. 277 */ 278 ir_variable *v = array->whole_variable_referenced(); 279 if (v != NULL) 280 v->data.max_array_access = array->type->array_size() - 1; 281 } 282 283 /* From page 23 (29 of the PDF) of the GLSL 1.30 spec: 284 * 285 * "Samplers aggregated into arrays within a shader (using square 286 * brackets [ ]) can only be indexed with integral constant 287 * expressions [...]." 288 * 289 * This restriction was added in GLSL 1.30. Shaders using earlier 290 * version of the language should not be rejected by the compiler 291 * front-end for using this construct. This allows useful things such 292 * as using a loop counter as the index to an array of samplers. If the 293 * loop in unrolled, the code should compile correctly. Instead, emit a 294 * warning. 295 * 296 * In GLSL 4.00 / ARB_gpu_shader5, this requirement is relaxed again to allow 297 * indexing with dynamically uniform expressions. Note that these are not 298 * required to be uniforms or expressions based on them, but merely that the 299 * values must not diverge between shader invocations run together. If the 300 * values *do* diverge, then the behavior of the operation requiring a 301 * dynamically uniform expression is undefined. 302 * 303 * From section 4.1.7 of the ARB_bindless_texture spec: 304 * 305 * "Samplers aggregated into arrays within a shader (using square 306 * brackets []) can be indexed with arbitrary integer expressions." 307 */ 308 if (array->type->without_array()->is_sampler()) { 309 if (!state->is_version(400, 320) && 310 !state->ARB_gpu_shader5_enable && 311 !state->EXT_gpu_shader5_enable && 312 !state->OES_gpu_shader5_enable && 313 !state->has_bindless()) { 314 if (state->is_version(130, 300)) 315 _mesa_glsl_error(&loc, state, 316 "sampler arrays indexed with non-constant " 317 "expressions are forbidden in GLSL %s " 318 "and later", 319 state->es_shader ? "ES 3.00" : "1.30"); 320 else if (state->es_shader) 321 _mesa_glsl_warning(&loc, state, 322 "sampler arrays indexed with non-constant " 323 "expressions will be forbidden in GLSL " 324 "3.00 and later"); 325 else 326 _mesa_glsl_warning(&loc, state, 327 "sampler arrays indexed with non-constant " 328 "expressions will be forbidden in GLSL " 329 "1.30 and later"); 330 } 331 } 332 333 /* From page 27 of the GLSL ES 3.1 specification: 334 * 335 * "When aggregated into arrays within a shader, images can only be 336 * indexed with a constant integral expression." 337 * 338 * On the other hand the desktop GL specification extension allows 339 * non-constant indexing of image arrays, but behavior is left undefined 340 * in cases where the indexing expression is not dynamically uniform. 341 */ 342 if (state->es_shader && array->type->without_array()->is_image()) { 343 _mesa_glsl_error(&loc, state, 344 "image arrays indexed with non-constant " 345 "expressions are forbidden in GLSL ES."); 346 } 347 } 348 349 /* After performing all of the error checking, generate the IR for the 350 * expression. 351 */ 352 if (array->type->is_array() 353 || array->type->is_matrix() 354 || array->type->is_vector()) { 355 return new(mem_ctx) ir_dereference_array(array, idx); 356 } else if (array->type->is_error()) { 357 return array; 358 } else { 359 ir_rvalue *result = new(mem_ctx) ir_dereference_array(array, idx); 360 result->type = glsl_type::error_type; 361 362 return result; 363 } 364 } 365