Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

glsl_types.cpp 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. /*
  2. * Copyright © 2009 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 <cstdio>
  24. #include <stdlib.h>
  25. #include "glsl_symbol_table.h"
  26. #include "glsl_parser_extras.h"
  27. #include "glsl_types.h"
  28. #include "builtin_types.h"
  29. #include "hash_table.h"
  30. hash_table *glsl_type::array_types = NULL;
  31. static void
  32. add_types_to_symbol_table(glsl_symbol_table *symtab,
  33. const struct glsl_type *types,
  34. unsigned num_types, bool warn)
  35. {
  36. (void) warn;
  37. for (unsigned i = 0; i < num_types; i++) {
  38. symtab->add_type(types[i].name, & types[i]);
  39. }
  40. }
  41. static void
  42. generate_110_types(glsl_symbol_table *symtab)
  43. {
  44. add_types_to_symbol_table(symtab, builtin_core_types,
  45. Elements(builtin_core_types),
  46. false);
  47. add_types_to_symbol_table(symtab, builtin_structure_types,
  48. Elements(builtin_structure_types),
  49. false);
  50. add_types_to_symbol_table(symtab, builtin_110_deprecated_structure_types,
  51. Elements(builtin_110_deprecated_structure_types),
  52. false);
  53. add_types_to_symbol_table(symtab, & void_type, 1, false);
  54. }
  55. static void
  56. generate_120_types(glsl_symbol_table *symtab)
  57. {
  58. generate_110_types(symtab);
  59. add_types_to_symbol_table(symtab, builtin_120_types,
  60. Elements(builtin_120_types), false);
  61. }
  62. static void
  63. generate_130_types(glsl_symbol_table *symtab)
  64. {
  65. generate_120_types(symtab);
  66. add_types_to_symbol_table(symtab, builtin_130_types,
  67. Elements(builtin_130_types), false);
  68. }
  69. static void
  70. generate_ARB_texture_rectangle_types(glsl_symbol_table *symtab, bool warn)
  71. {
  72. add_types_to_symbol_table(symtab, builtin_ARB_texture_rectangle_types,
  73. Elements(builtin_ARB_texture_rectangle_types),
  74. warn);
  75. }
  76. static void
  77. generate_EXT_texture_array_types(glsl_symbol_table *symtab, bool warn)
  78. {
  79. add_types_to_symbol_table(symtab, builtin_EXT_texture_array_types,
  80. Elements(builtin_EXT_texture_array_types),
  81. warn);
  82. }
  83. void
  84. _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
  85. {
  86. switch (state->language_version) {
  87. case 110:
  88. generate_110_types(state->symbols);
  89. break;
  90. case 120:
  91. generate_120_types(state->symbols);
  92. break;
  93. case 130:
  94. generate_130_types(state->symbols);
  95. break;
  96. default:
  97. /* error */
  98. break;
  99. }
  100. if (state->ARB_texture_rectangle_enable) {
  101. generate_ARB_texture_rectangle_types(state->symbols,
  102. state->ARB_texture_rectangle_warn);
  103. }
  104. if (state->EXT_texture_array_enable && state->language_version < 130) {
  105. // These are already included in 130; don't create twice.
  106. generate_EXT_texture_array_types(state->symbols,
  107. state->EXT_texture_array_warn);
  108. }
  109. }
  110. const glsl_type *glsl_type::get_base_type() const
  111. {
  112. switch (base_type) {
  113. case GLSL_TYPE_UINT:
  114. return uint_type;
  115. case GLSL_TYPE_INT:
  116. return int_type;
  117. case GLSL_TYPE_FLOAT:
  118. return float_type;
  119. case GLSL_TYPE_BOOL:
  120. return bool_type;
  121. default:
  122. return error_type;
  123. }
  124. }
  125. ir_function *
  126. glsl_type::generate_constructor(glsl_symbol_table *symtab) const
  127. {
  128. /* Generate the function name and add it to the symbol table.
  129. */
  130. ir_function *const f = new ir_function(name);
  131. bool added = symtab->add_function(name, f);
  132. assert(added);
  133. ir_function_signature *const sig = new ir_function_signature(this);
  134. f->add_signature(sig);
  135. ir_variable **declarations =
  136. (ir_variable **) malloc(sizeof(ir_variable *) * this->length);
  137. for (unsigned i = 0; i < length; i++) {
  138. char *const param_name = (char *) malloc(10);
  139. snprintf(param_name, 10, "p%08X", i);
  140. ir_variable *var = (this->base_type == GLSL_TYPE_ARRAY)
  141. ? new ir_variable(fields.array, param_name)
  142. : new ir_variable(fields.structure[i].type, param_name);
  143. var->mode = ir_var_in;
  144. declarations[i] = var;
  145. sig->parameters.push_tail(var);
  146. }
  147. /* Generate the body of the constructor. The body assigns each of the
  148. * parameters to a portion of a local variable called __retval that has
  149. * the same type as the constructor. After initializing __retval,
  150. * __retval is returned.
  151. */
  152. ir_variable *retval = new ir_variable(this, "__retval");
  153. sig->body.push_tail(retval);
  154. for (unsigned i = 0; i < length; i++) {
  155. ir_dereference *const lhs = (this->base_type == GLSL_TYPE_ARRAY)
  156. ? (ir_dereference *) new ir_dereference_array(retval, new ir_constant(i))
  157. : (ir_dereference *) new ir_dereference_record(retval, fields.structure[i].name);
  158. ir_dereference *const rhs = new ir_dereference_variable(declarations[i]);
  159. ir_instruction *const assign = new ir_assignment(lhs, rhs, NULL);
  160. sig->body.push_tail(assign);
  161. }
  162. free(declarations);
  163. ir_dereference *const retref = new ir_dereference_variable(retval);
  164. ir_instruction *const inst = new ir_return(retref);
  165. sig->body.push_tail(inst);
  166. return f;
  167. }
  168. /**
  169. * Generate the function intro for a constructor
  170. *
  171. * \param type Data type to be constructed
  172. * \param count Number of parameters to this concrete constructor. Most
  173. * types have at least two constructors. One will take a
  174. * single scalar parameter and the other will take "N"
  175. * scalar parameters.
  176. * \param parameters Storage for the list of parameters. These are
  177. * typically stored in an \c ir_function_signature.
  178. * \param declarations Pointers to the variable declarations for the function
  179. * parameters. These are used later to avoid having to use
  180. * the symbol table.
  181. */
  182. static ir_function_signature *
  183. generate_constructor_intro(const glsl_type *type, unsigned parameter_count,
  184. ir_variable **declarations)
  185. {
  186. /* Names of parameters used in vector and matrix constructors
  187. */
  188. static const char *const names[] = {
  189. "a", "b", "c", "d", "e", "f", "g", "h",
  190. "i", "j", "k", "l", "m", "n", "o", "p",
  191. };
  192. assert(parameter_count <= Elements(names));
  193. const glsl_type *const parameter_type = type->get_base_type();
  194. ir_function_signature *const signature = new ir_function_signature(type);
  195. for (unsigned i = 0; i < parameter_count; i++) {
  196. ir_variable *var = new ir_variable(parameter_type, names[i]);
  197. var->mode = ir_var_in;
  198. signature->parameters.push_tail(var);
  199. declarations[i] = var;
  200. }
  201. ir_variable *retval = new ir_variable(type, "__retval");
  202. signature->body.push_tail(retval);
  203. declarations[16] = retval;
  204. return signature;
  205. }
  206. /**
  207. * Generate the body of a vector constructor that takes a single scalar
  208. */
  209. static void
  210. generate_vec_body_from_scalar(exec_list *instructions,
  211. ir_variable **declarations)
  212. {
  213. ir_instruction *inst;
  214. /* Generate a single assignment of the parameter to __retval.x and return
  215. * __retval.xxxx for however many vector components there are.
  216. */
  217. ir_dereference *const lhs_ref =
  218. new ir_dereference_variable(declarations[16]);
  219. ir_dereference *const rhs = new ir_dereference_variable(declarations[0]);
  220. ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1);
  221. inst = new ir_assignment(lhs, rhs, NULL);
  222. instructions->push_tail(inst);
  223. ir_dereference *const retref = new ir_dereference_variable(declarations[16]);
  224. ir_swizzle *retval = new ir_swizzle(retref, 0, 0, 0, 0,
  225. declarations[16]->type->vector_elements);
  226. inst = new ir_return(retval);
  227. instructions->push_tail(inst);
  228. }
  229. /**
  230. * Generate the body of a vector constructor that takes multiple scalars
  231. */
  232. static void
  233. generate_vec_body_from_N_scalars(exec_list *instructions,
  234. ir_variable **declarations)
  235. {
  236. ir_instruction *inst;
  237. const glsl_type *const vec_type = declarations[16]->type;
  238. /* Generate an assignment of each parameter to a single component of
  239. * __retval.x and return __retval.
  240. */
  241. for (unsigned i = 0; i < vec_type->vector_elements; i++) {
  242. ir_dereference *const lhs_ref =
  243. new ir_dereference_variable(declarations[16]);
  244. ir_dereference *const rhs = new ir_dereference_variable(declarations[i]);
  245. ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1);
  246. inst = new ir_assignment(lhs, rhs, NULL);
  247. instructions->push_tail(inst);
  248. }
  249. ir_dereference *retval = new ir_dereference_variable(declarations[16]);
  250. inst = new ir_return(retval);
  251. instructions->push_tail(inst);
  252. }
  253. /**
  254. * Generate the body of a matrix constructor that takes a single scalar
  255. */
  256. static void
  257. generate_mat_body_from_scalar(exec_list *instructions,
  258. ir_variable **declarations)
  259. {
  260. ir_instruction *inst;
  261. /* Generate an assignment of the parameter to the X component of a
  262. * temporary vector. Set the remaining fields of the vector to 0. The
  263. * size of the vector is equal to the number of rows of the matrix.
  264. *
  265. * Set each column of the matrix to a successive "rotation" of the
  266. * temporary vector. This fills the matrix with 0s, but writes the single
  267. * scalar along the matrix's diagonal.
  268. *
  269. * For a mat4x3, this is equivalent to:
  270. *
  271. * vec3 tmp;
  272. * mat4x3 __retval;
  273. * tmp.x = a;
  274. * tmp.y = 0.0;
  275. * tmp.z = 0.0;
  276. * __retval[0] = tmp.xyy;
  277. * __retval[1] = tmp.yxy;
  278. * __retval[2] = tmp.yyx;
  279. * __retval[3] = tmp.yyy;
  280. */
  281. const glsl_type *const column_type = declarations[16]->type->column_type();
  282. const glsl_type *const row_type = declarations[16]->type->row_type();
  283. ir_variable *const column = new ir_variable(column_type, "v");
  284. instructions->push_tail(column);
  285. ir_dereference *const lhs_ref = new ir_dereference_variable(column);
  286. ir_dereference *const rhs = new ir_dereference_variable(declarations[0]);
  287. ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1);
  288. inst = new ir_assignment(lhs, rhs, NULL);
  289. instructions->push_tail(inst);
  290. ir_constant *const zero = new ir_constant(0.0f);
  291. for (unsigned i = 1; i < column_type->vector_elements; i++) {
  292. ir_dereference *const lhs_ref = new ir_dereference_variable(column);
  293. ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1);
  294. inst = new ir_assignment(lhs, zero, NULL);
  295. instructions->push_tail(inst);
  296. }
  297. for (unsigned i = 0; i < row_type->vector_elements; i++) {
  298. static const unsigned swiz[] = { 1, 1, 1, 0, 1, 1, 1 };
  299. ir_dereference *const rhs_ref = new ir_dereference_variable(column);
  300. /* This will be .xyyy when i=0, .yxyy when i=1, etc.
  301. */
  302. ir_swizzle *rhs = new ir_swizzle(rhs_ref, swiz[3 - i], swiz[4 - i],
  303. swiz[5 - i], swiz[6 - i],
  304. column_type->vector_elements);
  305. ir_constant *const idx = new ir_constant(int(i));
  306. ir_dereference *const lhs =
  307. new ir_dereference_array(declarations[16], idx);
  308. inst = new ir_assignment(lhs, rhs, NULL);
  309. instructions->push_tail(inst);
  310. }
  311. ir_dereference *const retval = new ir_dereference_variable(declarations[16]);
  312. inst = new ir_return(retval);
  313. instructions->push_tail(inst);
  314. }
  315. /**
  316. * Generate the body of a vector constructor that takes multiple scalars
  317. */
  318. static void
  319. generate_mat_body_from_N_scalars(exec_list *instructions,
  320. ir_variable **declarations)
  321. {
  322. ir_instruction *inst;
  323. const glsl_type *const row_type = declarations[16]->type->row_type();
  324. const glsl_type *const column_type = declarations[16]->type->column_type();
  325. /* Generate an assignment of each parameter to a single component of
  326. * of a particular column of __retval and return __retval.
  327. */
  328. for (unsigned i = 0; i < column_type->vector_elements; i++) {
  329. for (unsigned j = 0; j < row_type->vector_elements; j++) {
  330. ir_constant *row_index = new ir_constant(int(i));
  331. ir_dereference *const row_access =
  332. new ir_dereference_array(declarations[16], row_index);
  333. ir_swizzle *component_access = new ir_swizzle(row_access,
  334. j, 0, 0, 0, 1);
  335. const unsigned param = (i * row_type->vector_elements) + j;
  336. ir_dereference *const rhs =
  337. new ir_dereference_variable(declarations[param]);
  338. inst = new ir_assignment(component_access, rhs, NULL);
  339. instructions->push_tail(inst);
  340. }
  341. }
  342. ir_dereference *retval = new ir_dereference_variable(declarations[16]);
  343. inst = new ir_return(retval);
  344. instructions->push_tail(inst);
  345. }
  346. /**
  347. * Generate the constructors for a set of GLSL types
  348. *
  349. * Constructor implementations are added to \c instructions, and the symbols
  350. * are added to \c symtab.
  351. */
  352. static void
  353. generate_constructor(glsl_symbol_table *symtab, const struct glsl_type *types,
  354. unsigned num_types, exec_list *instructions)
  355. {
  356. ir_variable *declarations[17];
  357. for (unsigned i = 0; i < num_types; i++) {
  358. /* Only numeric and boolean vectors and matrices get constructors here.
  359. * Structures need to be handled elsewhere. It is expected that scalar
  360. * constructors are never actually called, so they are not generated.
  361. */
  362. if (!types[i].is_numeric() && !types[i].is_boolean())
  363. continue;
  364. if (types[i].is_scalar())
  365. continue;
  366. /* Generate the function block, add it to the symbol table, and emit it.
  367. */
  368. ir_function *const f = new ir_function(types[i].name);
  369. bool added = symtab->add_function(types[i].name, f);
  370. assert(added);
  371. instructions->push_tail(f);
  372. /* Each type has several basic constructors. The total number of forms
  373. * depends on the derived type.
  374. *
  375. * Vectors: 1 scalar, N scalars
  376. * Matrices: 1 scalar, NxM scalars
  377. *
  378. * Several possible types of constructors are not included in this list.
  379. *
  380. * Scalar constructors are not included. The expectation is that the
  381. * IR generator won't actually generate these as constructor calls. The
  382. * expectation is that it will just generate the necessary type
  383. * conversion.
  384. *
  385. * Matrix contructors from matrices are also not included. The
  386. * expectation is that the IR generator will generate a call to the
  387. * appropriate from-scalars constructor.
  388. */
  389. ir_function_signature *const sig =
  390. generate_constructor_intro(&types[i], 1, declarations);
  391. f->add_signature(sig);
  392. if (types[i].is_vector()) {
  393. generate_vec_body_from_scalar(&sig->body, declarations);
  394. ir_function_signature *const vec_sig =
  395. generate_constructor_intro(&types[i], types[i].vector_elements,
  396. declarations);
  397. f->add_signature(vec_sig);
  398. generate_vec_body_from_N_scalars(&vec_sig->body, declarations);
  399. } else {
  400. assert(types[i].is_matrix());
  401. generate_mat_body_from_scalar(&sig->body, declarations);
  402. ir_function_signature *const mat_sig =
  403. generate_constructor_intro(&types[i],
  404. (types[i].vector_elements
  405. * types[i].matrix_columns),
  406. declarations);
  407. f->add_signature(mat_sig);
  408. generate_mat_body_from_N_scalars(&mat_sig->body, declarations);
  409. }
  410. }
  411. }
  412. void
  413. generate_110_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  414. {
  415. generate_constructor(symtab, builtin_core_types,
  416. Elements(builtin_core_types), instructions);
  417. }
  418. void
  419. generate_120_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  420. {
  421. generate_110_constructors(symtab, instructions);
  422. generate_constructor(symtab, builtin_120_types,
  423. Elements(builtin_120_types), instructions);
  424. }
  425. void
  426. generate_130_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  427. {
  428. generate_120_constructors(symtab, instructions);
  429. generate_constructor(symtab, builtin_130_types,
  430. Elements(builtin_130_types), instructions);
  431. }
  432. void
  433. _mesa_glsl_initialize_constructors(exec_list *instructions,
  434. struct _mesa_glsl_parse_state *state)
  435. {
  436. switch (state->language_version) {
  437. case 110:
  438. generate_110_constructors(state->symbols, instructions);
  439. break;
  440. case 120:
  441. generate_120_constructors(state->symbols, instructions);
  442. break;
  443. case 130:
  444. generate_130_constructors(state->symbols, instructions);
  445. break;
  446. default:
  447. /* error */
  448. break;
  449. }
  450. }
  451. glsl_type::glsl_type(const glsl_type *array, unsigned length) :
  452. base_type(GLSL_TYPE_ARRAY),
  453. sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
  454. sampler_type(0),
  455. vector_elements(0), matrix_columns(0),
  456. name(NULL), length(length)
  457. {
  458. this->fields.array = array;
  459. /* Allow a maximum of 10 characters for the array size. This is enough
  460. * for 32-bits of ~0. The extra 3 are for the '[', ']', and terminating
  461. * NUL.
  462. */
  463. const unsigned name_length = strlen(array->name) + 10 + 3;
  464. char *const n = (char *) malloc(name_length);
  465. if (length == 0)
  466. snprintf(n, name_length, "%s[]", array->name);
  467. else
  468. snprintf(n, name_length, "%s[%u]", array->name, length);
  469. this->name = n;
  470. }
  471. const glsl_type *
  472. glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
  473. {
  474. if (base_type == GLSL_TYPE_VOID)
  475. return &void_type;
  476. if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
  477. return error_type;
  478. /* Treat GLSL vectors as Nx1 matrices.
  479. */
  480. if (columns == 1) {
  481. switch (base_type) {
  482. case GLSL_TYPE_UINT:
  483. return uint_type + (rows - 1);
  484. case GLSL_TYPE_INT:
  485. return int_type + (rows - 1);
  486. case GLSL_TYPE_FLOAT:
  487. return float_type + (rows - 1);
  488. case GLSL_TYPE_BOOL:
  489. return bool_type + (rows - 1);
  490. default:
  491. return error_type;
  492. }
  493. } else {
  494. if ((base_type != GLSL_TYPE_FLOAT) || (rows == 1))
  495. return error_type;
  496. /* GLSL matrix types are named mat{COLUMNS}x{ROWS}. Only the following
  497. * combinations are valid:
  498. *
  499. * 1 2 3 4
  500. * 1
  501. * 2 x x x
  502. * 3 x x x
  503. * 4 x x x
  504. */
  505. #define IDX(c,r) (((c-1)*3) + (r-1))
  506. switch (IDX(columns, rows)) {
  507. case IDX(2,2): return mat2_type;
  508. case IDX(2,3): return mat2x3_type;
  509. case IDX(2,4): return mat2x4_type;
  510. case IDX(3,2): return mat3x2_type;
  511. case IDX(3,3): return mat3_type;
  512. case IDX(3,4): return mat3x4_type;
  513. case IDX(4,2): return mat4x2_type;
  514. case IDX(4,3): return mat4x3_type;
  515. case IDX(4,4): return mat4_type;
  516. default: return error_type;
  517. }
  518. }
  519. assert(!"Should not get here.");
  520. return error_type;
  521. }
  522. int
  523. glsl_type::array_key_compare(const void *a, const void *b)
  524. {
  525. const glsl_type *const key1 = (glsl_type *) a;
  526. const glsl_type *const key2 = (glsl_type *) b;
  527. /* Return zero is the types match (there is zero difference) or non-zero
  528. * otherwise.
  529. */
  530. return ((key1->fields.array == key2->fields.array)
  531. && (key1->length == key2->length)) ? 0 : 1;
  532. }
  533. unsigned
  534. glsl_type::array_key_hash(const void *a)
  535. {
  536. const glsl_type *const key = (glsl_type *) a;
  537. const struct {
  538. const glsl_type *t;
  539. unsigned l;
  540. char nul;
  541. } hash_key = {
  542. key->fields.array,
  543. key->length,
  544. '\0'
  545. };
  546. return hash_table_string_hash(& hash_key);
  547. }
  548. const glsl_type *
  549. glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
  550. {
  551. const glsl_type key(base, array_size);
  552. if (array_types == NULL) {
  553. array_types = hash_table_ctor(64, array_key_hash, array_key_compare);
  554. }
  555. const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key);
  556. if (t == NULL) {
  557. t = new glsl_type(base, array_size);
  558. hash_table_insert(array_types, (void *) t, t);
  559. }
  560. assert(t->base_type == GLSL_TYPE_ARRAY);
  561. assert(t->length == array_size);
  562. assert(t->fields.array == base);
  563. return t;
  564. }
  565. const glsl_type *
  566. glsl_type::field_type(const char *name) const
  567. {
  568. if (this->base_type != GLSL_TYPE_STRUCT)
  569. return error_type;
  570. for (unsigned i = 0; i < this->length; i++) {
  571. if (strcmp(name, this->fields.structure[i].name) == 0)
  572. return this->fields.structure[i].type;
  573. }
  574. return error_type;
  575. }
  576. int
  577. glsl_type::field_index(const char *name) const
  578. {
  579. if (this->base_type != GLSL_TYPE_STRUCT)
  580. return -1;
  581. for (unsigned i = 0; i < this->length; i++) {
  582. if (strcmp(name, this->fields.structure[i].name) == 0)
  583. return i;
  584. }
  585. return -1;
  586. }