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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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. const float z = 0.0f;
  291. ir_constant *const zero = new ir_constant(glsl_type::float_type, &z);
  292. for (unsigned i = 1; i < column_type->vector_elements; i++) {
  293. ir_dereference *const lhs_ref = new ir_dereference_variable(column);
  294. ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1);
  295. inst = new ir_assignment(lhs, zero, NULL);
  296. instructions->push_tail(inst);
  297. }
  298. for (unsigned i = 0; i < row_type->vector_elements; i++) {
  299. static const unsigned swiz[] = { 1, 1, 1, 0, 1, 1, 1 };
  300. ir_dereference *const rhs_ref = new ir_dereference_variable(column);
  301. /* This will be .xyyy when i=0, .yxyy when i=1, etc.
  302. */
  303. ir_swizzle *rhs = new ir_swizzle(rhs_ref, swiz[3 - i], swiz[4 - i],
  304. swiz[5 - i], swiz[6 - i],
  305. column_type->vector_elements);
  306. ir_constant *const idx = new ir_constant(glsl_type::int_type, &i);
  307. ir_dereference *const lhs =
  308. new ir_dereference_array(declarations[16], idx);
  309. inst = new ir_assignment(lhs, rhs, NULL);
  310. instructions->push_tail(inst);
  311. }
  312. ir_dereference *const retval = new ir_dereference_variable(declarations[16]);
  313. inst = new ir_return(retval);
  314. instructions->push_tail(inst);
  315. }
  316. /**
  317. * Generate the body of a vector constructor that takes multiple scalars
  318. */
  319. static void
  320. generate_mat_body_from_N_scalars(exec_list *instructions,
  321. ir_variable **declarations)
  322. {
  323. ir_instruction *inst;
  324. const glsl_type *const row_type = declarations[16]->type->row_type();
  325. const glsl_type *const column_type = declarations[16]->type->column_type();
  326. /* Generate an assignment of each parameter to a single component of
  327. * of a particular column of __retval and return __retval.
  328. */
  329. for (unsigned i = 0; i < column_type->vector_elements; i++) {
  330. for (unsigned j = 0; j < row_type->vector_elements; j++) {
  331. ir_constant *row_index = new ir_constant(glsl_type::int_type, &i);
  332. ir_dereference *const row_access =
  333. new ir_dereference_array(declarations[16], row_index);
  334. ir_swizzle *component_access = new ir_swizzle(row_access,
  335. j, 0, 0, 0, 1);
  336. const unsigned param = (i * row_type->vector_elements) + j;
  337. ir_dereference *const rhs =
  338. new ir_dereference_variable(declarations[param]);
  339. inst = new ir_assignment(component_access, rhs, NULL);
  340. instructions->push_tail(inst);
  341. }
  342. }
  343. ir_dereference *retval = new ir_dereference_variable(declarations[16]);
  344. inst = new ir_return(retval);
  345. instructions->push_tail(inst);
  346. }
  347. /**
  348. * Generate the constructors for a set of GLSL types
  349. *
  350. * Constructor implementations are added to \c instructions, and the symbols
  351. * are added to \c symtab.
  352. */
  353. static void
  354. generate_constructor(glsl_symbol_table *symtab, const struct glsl_type *types,
  355. unsigned num_types, exec_list *instructions)
  356. {
  357. ir_variable *declarations[17];
  358. for (unsigned i = 0; i < num_types; i++) {
  359. /* Only numeric and boolean vectors and matrices get constructors here.
  360. * Structures need to be handled elsewhere. It is expected that scalar
  361. * constructors are never actually called, so they are not generated.
  362. */
  363. if (!types[i].is_numeric() && !types[i].is_boolean())
  364. continue;
  365. if (types[i].is_scalar())
  366. continue;
  367. /* Generate the function block, add it to the symbol table, and emit it.
  368. */
  369. ir_function *const f = new ir_function(types[i].name);
  370. bool added = symtab->add_function(types[i].name, f);
  371. assert(added);
  372. instructions->push_tail(f);
  373. /* Each type has several basic constructors. The total number of forms
  374. * depends on the derived type.
  375. *
  376. * Vectors: 1 scalar, N scalars
  377. * Matrices: 1 scalar, NxM scalars
  378. *
  379. * Several possible types of constructors are not included in this list.
  380. *
  381. * Scalar constructors are not included. The expectation is that the
  382. * IR generator won't actually generate these as constructor calls. The
  383. * expectation is that it will just generate the necessary type
  384. * conversion.
  385. *
  386. * Matrix contructors from matrices are also not included. The
  387. * expectation is that the IR generator will generate a call to the
  388. * appropriate from-scalars constructor.
  389. */
  390. ir_function_signature *const sig =
  391. generate_constructor_intro(&types[i], 1, declarations);
  392. f->add_signature(sig);
  393. if (types[i].is_vector()) {
  394. generate_vec_body_from_scalar(&sig->body, declarations);
  395. ir_function_signature *const vec_sig =
  396. generate_constructor_intro(&types[i], types[i].vector_elements,
  397. declarations);
  398. f->add_signature(vec_sig);
  399. generate_vec_body_from_N_scalars(&vec_sig->body, declarations);
  400. } else {
  401. assert(types[i].is_matrix());
  402. generate_mat_body_from_scalar(&sig->body, declarations);
  403. ir_function_signature *const mat_sig =
  404. generate_constructor_intro(&types[i],
  405. (types[i].vector_elements
  406. * types[i].matrix_columns),
  407. declarations);
  408. f->add_signature(mat_sig);
  409. generate_mat_body_from_N_scalars(&mat_sig->body, declarations);
  410. }
  411. }
  412. }
  413. void
  414. generate_110_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  415. {
  416. generate_constructor(symtab, builtin_core_types,
  417. Elements(builtin_core_types), instructions);
  418. }
  419. void
  420. generate_120_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  421. {
  422. generate_110_constructors(symtab, instructions);
  423. generate_constructor(symtab, builtin_120_types,
  424. Elements(builtin_120_types), instructions);
  425. }
  426. void
  427. generate_130_constructors(glsl_symbol_table *symtab, exec_list *instructions)
  428. {
  429. generate_120_constructors(symtab, instructions);
  430. generate_constructor(symtab, builtin_130_types,
  431. Elements(builtin_130_types), instructions);
  432. }
  433. void
  434. _mesa_glsl_initialize_constructors(exec_list *instructions,
  435. struct _mesa_glsl_parse_state *state)
  436. {
  437. switch (state->language_version) {
  438. case 110:
  439. generate_110_constructors(state->symbols, instructions);
  440. break;
  441. case 120:
  442. generate_120_constructors(state->symbols, instructions);
  443. break;
  444. case 130:
  445. generate_130_constructors(state->symbols, instructions);
  446. break;
  447. default:
  448. /* error */
  449. break;
  450. }
  451. }
  452. glsl_type::glsl_type(const glsl_type *array, unsigned length) :
  453. base_type(GLSL_TYPE_ARRAY),
  454. sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
  455. sampler_type(0),
  456. vector_elements(0), matrix_columns(0),
  457. name(NULL), length(length)
  458. {
  459. this->fields.array = array;
  460. /* Allow a maximum of 10 characters for the array size. This is enough
  461. * for 32-bits of ~0. The extra 3 are for the '[', ']', and terminating
  462. * NUL.
  463. */
  464. const unsigned name_length = strlen(array->name) + 10 + 3;
  465. char *const n = (char *) malloc(name_length);
  466. if (length == 0)
  467. snprintf(n, name_length, "%s[]", array->name);
  468. else
  469. snprintf(n, name_length, "%s[%u]", array->name, length);
  470. this->name = n;
  471. }
  472. const glsl_type *
  473. glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
  474. {
  475. if (base_type == GLSL_TYPE_VOID)
  476. return &void_type;
  477. if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4))
  478. return error_type;
  479. /* Treat GLSL vectors as Nx1 matrices.
  480. */
  481. if (columns == 1) {
  482. switch (base_type) {
  483. case GLSL_TYPE_UINT:
  484. return uint_type + (rows - 1);
  485. case GLSL_TYPE_INT:
  486. return int_type + (rows - 1);
  487. case GLSL_TYPE_FLOAT:
  488. return float_type + (rows - 1);
  489. case GLSL_TYPE_BOOL:
  490. return bool_type + (rows - 1);
  491. default:
  492. return error_type;
  493. }
  494. } else {
  495. if ((base_type != GLSL_TYPE_FLOAT) || (rows == 1))
  496. return error_type;
  497. /* GLSL matrix types are named mat{COLUMNS}x{ROWS}. Only the following
  498. * combinations are valid:
  499. *
  500. * 1 2 3 4
  501. * 1
  502. * 2 x x x
  503. * 3 x x x
  504. * 4 x x x
  505. */
  506. #define IDX(c,r) (((c-1)*3) + (r-1))
  507. switch (IDX(columns, rows)) {
  508. case IDX(2,2): return mat2_type;
  509. case IDX(2,3): return mat2x3_type;
  510. case IDX(2,4): return mat2x4_type;
  511. case IDX(3,2): return mat3x2_type;
  512. case IDX(3,3): return mat3_type;
  513. case IDX(3,4): return mat3x4_type;
  514. case IDX(4,2): return mat4x2_type;
  515. case IDX(4,3): return mat4x3_type;
  516. case IDX(4,4): return mat4_type;
  517. default: return error_type;
  518. }
  519. }
  520. assert(!"Should not get here.");
  521. return error_type;
  522. }
  523. int
  524. glsl_type::array_key_compare(const void *a, const void *b)
  525. {
  526. const glsl_type *const key1 = (glsl_type *) a;
  527. const glsl_type *const key2 = (glsl_type *) b;
  528. /* Return zero is the types match (there is zero difference) or non-zero
  529. * otherwise.
  530. */
  531. return ((key1->fields.array == key2->fields.array)
  532. && (key1->length == key2->length)) ? 0 : 1;
  533. }
  534. unsigned
  535. glsl_type::array_key_hash(const void *a)
  536. {
  537. const glsl_type *const key = (glsl_type *) a;
  538. const struct {
  539. const glsl_type *t;
  540. unsigned l;
  541. char nul;
  542. } hash_key = {
  543. key->fields.array,
  544. key->length,
  545. '\0'
  546. };
  547. return hash_table_string_hash(& hash_key);
  548. }
  549. const glsl_type *
  550. glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
  551. {
  552. const glsl_type key(base, array_size);
  553. if (array_types == NULL) {
  554. array_types = hash_table_ctor(64, array_key_hash, array_key_compare);
  555. }
  556. const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key);
  557. if (t == NULL) {
  558. t = new glsl_type(base, array_size);
  559. hash_table_insert(array_types, (void *) t, t);
  560. }
  561. assert(t->base_type == GLSL_TYPE_ARRAY);
  562. assert(t->length == array_size);
  563. assert(t->fields.array == base);
  564. return t;
  565. }
  566. const glsl_type *
  567. glsl_type::field_type(const char *name) const
  568. {
  569. if (this->base_type != GLSL_TYPE_STRUCT)
  570. return error_type;
  571. for (unsigned i = 0; i < this->length; i++) {
  572. if (strcmp(name, this->fields.structure[i].name) == 0)
  573. return this->fields.structure[i].type;
  574. }
  575. return error_type;
  576. }
  577. int
  578. glsl_type::field_index(const char *name) const
  579. {
  580. if (this->base_type != GLSL_TYPE_STRUCT)
  581. return -1;
  582. for (unsigned i = 0; i < this->length; i++) {
  583. if (strcmp(name, this->fields.structure[i].name) == 0)
  584. return i;
  585. }
  586. return -1;
  587. }