glsl_types.cpp revision 0c824653952a67722c242616bb34a4796b42f660
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2009 Intel Corporation 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 240bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick#include <cstdio> 25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <stdlib.h> 268bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h" 27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_types.h" 29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "builtin_types.h" 30548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick#include "hash_table.h" 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 33548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickhash_table *glsl_type::array_types = NULL; 34548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 368bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanickadd_types_to_symbol_table(glsl_symbol_table *symtab, 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *types, 380c824653952a67722c242616bb34a4796b42f660Ian Romanick unsigned num_types, bool warn) 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 400c824653952a67722c242616bb34a4796b42f660Ian Romanick (void) warn; 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 420c824653952a67722c242616bb34a4796b42f660Ian Romanick for (unsigned i = 0; i < num_types; i++) { 438bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick symtab->add_type(types[i].name, & types[i]); 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 498bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanickgenerate_110_types(glsl_symbol_table *symtab) 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick add_types_to_symbol_table(symtab, builtin_core_types, 520c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_core_types), 530c824653952a67722c242616bb34a4796b42f660Ian Romanick false); 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick add_types_to_symbol_table(symtab, builtin_structure_types, 550c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_structure_types), 560c824653952a67722c242616bb34a4796b42f660Ian Romanick false); 57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick add_types_to_symbol_table(symtab, builtin_110_deprecated_structure_types, 580c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_110_deprecated_structure_types), 590c824653952a67722c242616bb34a4796b42f660Ian Romanick false); 600c824653952a67722c242616bb34a4796b42f660Ian Romanick add_types_to_symbol_table(symtab, & void_type, 1, false); 61a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 62a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 63a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 64a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 658bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanickgenerate_120_types(glsl_symbol_table *symtab) 66a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 67a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick generate_110_types(symtab); 68a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 69a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick add_types_to_symbol_table(symtab, builtin_120_types, 700c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_120_types), false); 71a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 72a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 73a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 758bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanickgenerate_130_types(glsl_symbol_table *symtab) 76a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 77a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick generate_120_types(symtab); 78a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 79a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick add_types_to_symbol_table(symtab, builtin_130_types, 800c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_130_types), false); 810c824653952a67722c242616bb34a4796b42f660Ian Romanick} 820c824653952a67722c242616bb34a4796b42f660Ian Romanick 830c824653952a67722c242616bb34a4796b42f660Ian Romanick 840c824653952a67722c242616bb34a4796b42f660Ian Romanickstatic void 850c824653952a67722c242616bb34a4796b42f660Ian Romanickgenerate_ARB_texture_rectangle_types(glsl_symbol_table *symtab, bool warn) 860c824653952a67722c242616bb34a4796b42f660Ian Romanick{ 870c824653952a67722c242616bb34a4796b42f660Ian Romanick add_types_to_symbol_table(symtab, builtin_ARB_texture_rectangle_types, 880c824653952a67722c242616bb34a4796b42f660Ian Romanick Elements(builtin_ARB_texture_rectangle_types), 890c824653952a67722c242616bb34a4796b42f660Ian Romanick warn); 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 93a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 94a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state) 95a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 96a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick switch (state->language_version) { 97a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case 110: 98a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick generate_110_types(state->symbols); 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case 120: 101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick generate_120_types(state->symbols); 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case 130: 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick generate_130_types(state->symbols); 105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick default: 107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* error */ 108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 109a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1100c824653952a67722c242616bb34a4796b42f660Ian Romanick 1110c824653952a67722c242616bb34a4796b42f660Ian Romanick if (state->ARB_texture_rectangle_enable) { 1120c824653952a67722c242616bb34a4796b42f660Ian Romanick generate_ARB_texture_rectangle_types(state->symbols, 1130c824653952a67722c242616bb34a4796b42f660Ian Romanick state->ARB_texture_rectangle_warn); 1140c824653952a67722c242616bb34a4796b42f660Ian Romanick } 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 118bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanickconst glsl_type *glsl_type::get_base_type() const 119bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick{ 120bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick switch (base_type) { 121bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick case GLSL_TYPE_UINT: 1220471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return uint_type; 123bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick case GLSL_TYPE_INT: 1240471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return int_type; 125bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick case GLSL_TYPE_FLOAT: 1260471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return float_type; 127bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick case GLSL_TYPE_BOOL: 1280471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return bool_type; 129bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick default: 1300471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return error_type; 131bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick } 132bb7e00a1cd63f3012226253bb0121922419a5f23Ian Romanick} 1333209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 1343209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 1354ef183e51de2b625b51cdd6c925760429801595eIan Romanickir_function * 1364ef183e51de2b625b51cdd6c925760429801595eIan Romanickglsl_type::generate_constructor_prototype(glsl_symbol_table *symtab) const 1374ef183e51de2b625b51cdd6c925760429801595eIan Romanick{ 1384ef183e51de2b625b51cdd6c925760429801595eIan Romanick /* FINISHME: Add support for non-array types. */ 1394ef183e51de2b625b51cdd6c925760429801595eIan Romanick assert(base_type == GLSL_TYPE_ARRAY); 1404ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1414ef183e51de2b625b51cdd6c925760429801595eIan Romanick /* Generate the function name and add it to the symbol table. 1424ef183e51de2b625b51cdd6c925760429801595eIan Romanick */ 1434ef183e51de2b625b51cdd6c925760429801595eIan Romanick ir_function *const f = new ir_function(name); 1444ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1454ef183e51de2b625b51cdd6c925760429801595eIan Romanick bool added = symtab->add_function(name, f); 1464ef183e51de2b625b51cdd6c925760429801595eIan Romanick assert(added); 1474ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1484ef183e51de2b625b51cdd6c925760429801595eIan Romanick ir_function_signature *const sig = new ir_function_signature(this); 1496a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick f->add_signature(sig); 1504ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1514ef183e51de2b625b51cdd6c925760429801595eIan Romanick for (unsigned i = 0; i < length; i++) { 1524ef183e51de2b625b51cdd6c925760429801595eIan Romanick char *const param_name = (char *) malloc(10); 1534ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1544ef183e51de2b625b51cdd6c925760429801595eIan Romanick snprintf(param_name, 10, "p%08X", i); 1554ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1564ef183e51de2b625b51cdd6c925760429801595eIan Romanick ir_variable *var = new ir_variable(fields.array, param_name); 1574ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1584ef183e51de2b625b51cdd6c925760429801595eIan Romanick var->mode = ir_var_in; 1594ef183e51de2b625b51cdd6c925760429801595eIan Romanick sig->parameters.push_tail(var); 1604ef183e51de2b625b51cdd6c925760429801595eIan Romanick } 1614ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1624ef183e51de2b625b51cdd6c925760429801595eIan Romanick return f; 1634ef183e51de2b625b51cdd6c925760429801595eIan Romanick} 1644ef183e51de2b625b51cdd6c925760429801595eIan Romanick 1654ef183e51de2b625b51cdd6c925760429801595eIan Romanick 166720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 167720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the function intro for a constructor 168720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 169720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * \param type Data type to be constructed 170720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * \param count Number of parameters to this concrete constructor. Most 171720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * types have at least two constructors. One will take a 172720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * single scalar parameter and the other will take "N" 173720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * scalar parameters. 174720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * \param parameters Storage for the list of parameters. These are 175720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * typically stored in an \c ir_function_signature. 176720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * \param instructions Storage for the preamble and body of the function. 177720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * \param declarations Pointers to the variable declarations for the function 178720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * parameters. These are used later to avoid having to use 179720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * the symbol table. 180720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 1819f93d24050b2cccf539a944f674784c38cee857aIan Romanickstatic ir_label * 182720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_constructor_intro(const glsl_type *type, unsigned parameter_count, 183720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick exec_list *parameters, exec_list *instructions, 184720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable **declarations) 185720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 186720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Names of parameters used in vector and matrix constructors 187720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 188720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick static const char *const names[] = { 189720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick "a", "b", "c", "d", "e", "f", "g", "h", 190720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick "i", "j", "k", "l", "m", "n", "o", "p", 191720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick }; 192720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 193720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick assert(parameter_count <= Elements(names)); 194720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 195720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const parameter_type = type->get_base_type(); 196720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 197720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_label *const label = new ir_label(type->name); 198720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(label); 199720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 200720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 0; i < parameter_count; i++) { 201720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable *var = new ir_variable(parameter_type, names[i]); 202720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 203720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick var->mode = ir_var_in; 204720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick parameters->push_tail(var); 205720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 206720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick var = new ir_variable(parameter_type, names[i]); 207720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 208720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick var->mode = ir_var_in; 209720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(var); 210720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 211720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick declarations[i] = var; 212720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 213720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 214720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable *retval = new ir_variable(type, "__retval"); 215720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(retval); 216720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 217720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick declarations[16] = retval; 2189f93d24050b2cccf539a944f674784c38cee857aIan Romanick return label; 219720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 220720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 221720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 222720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 223720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the body of a vector constructor that takes a single scalar 224720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 225720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickstatic void 226720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_vec_body_from_scalar(exec_list *instructions, 227720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable **declarations) 228720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 229720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_instruction *inst; 230720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 231720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Generate a single assignment of the parameter to __retval.x and return 232720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval.xxxx for however many vector components there are. 233720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 234affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const lhs_ref = new ir_dereference(declarations[16]); 235720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const rhs = new ir_dereference(declarations[0]); 236720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 237affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1); 238720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 239720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(lhs, rhs, NULL); 240720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 241720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 242affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const retref = new ir_dereference(declarations[16]); 243720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 244affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *retval = new ir_swizzle(retref, 0, 0, 0, 0, 245affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke declarations[16]->type->vector_elements); 246720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 247fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke inst = new ir_return(retval); 248720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 249720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 250720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 251720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 252720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 253720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the body of a vector constructor that takes multiple scalars 254720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 255720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickstatic void 256720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_vec_body_from_N_scalars(exec_list *instructions, 257720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable **declarations) 258720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 259720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_instruction *inst; 260720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const vec_type = declarations[16]->type; 261720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 262720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 263720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Generate an assignment of each parameter to a single component of 264720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval.x and return __retval. 265720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 266720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 0; i < vec_type->vector_elements; i++) { 267affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const lhs_ref = new ir_dereference(declarations[16]); 268720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const rhs = new ir_dereference(declarations[i]); 269720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 270affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *lhs = new ir_swizzle(lhs_ref, 1, 0, 0, 0, 1); 271720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 272720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(lhs, rhs, NULL); 273720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 274720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 275720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 276720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *retval = new ir_dereference(declarations[16]); 277720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 278fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke inst = new ir_return(retval); 279720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 280720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 281720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 282720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 283720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 284720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the body of a matrix constructor that takes a single scalar 285720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 286720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickstatic void 287720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_mat_body_from_scalar(exec_list *instructions, 288720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable **declarations) 289720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 290720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_instruction *inst; 291720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 292720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Generate an assignment of the parameter to the X component of a 293720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * temporary vector. Set the remaining fields of the vector to 0. The 294720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * size of the vector is equal to the number of rows of the matrix. 295720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 296720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Set each column of the matrix to a successive "rotation" of the 297720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * temporary vector. This fills the matrix with 0s, but writes the single 298720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * scalar along the matrix's diagonal. 299720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 300720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * For a mat4x3, this is equivalent to: 301720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 302720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * vec3 tmp; 303720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * mat4x3 __retval; 304720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * tmp.x = a; 305720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * tmp.y = 0.0; 306720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * tmp.z = 0.0; 307720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval[0] = tmp.xyy; 308720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval[1] = tmp.yxy; 309720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval[2] = tmp.yyx; 310720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * __retval[3] = tmp.yyy; 311720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 312720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const column_type = declarations[16]->type->column_type(); 313720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const row_type = declarations[16]->type->row_type(); 314720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable *const column = new ir_variable(column_type, "v"); 315720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 316720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(column); 317720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 318affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const lhs_ref = new ir_dereference(column); 319720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const rhs = new ir_dereference(declarations[0]); 320720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 321affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *lhs = new ir_swizzle(lhs_ref, 0, 0, 0, 0, 1); 322720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 323720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(lhs, rhs, NULL); 324720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 325720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 326720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const float z = 0.0f; 3270471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick ir_constant *const zero = new ir_constant(glsl_type::float_type, &z); 328720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 329720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 1; i < column_type->vector_elements; i++) { 330affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const lhs_ref = new ir_dereference(column); 331720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 332affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *lhs = new ir_swizzle(lhs_ref, i, 0, 0, 0, 1); 333720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 334720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(lhs, zero, NULL); 335720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 336720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 337720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 338720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 339720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 0; i < row_type->vector_elements; i++) { 340720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick static const unsigned swiz[] = { 1, 1, 1, 0, 1, 1, 1 }; 341affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const rhs_ref = new ir_dereference(column); 342720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 343720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* This will be .xyyy when i=0, .yxyy when i=1, etc. 344720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 345affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *rhs = new ir_swizzle(rhs_ref, swiz[3 - i], swiz[4 - i], 346affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke swiz[5 - i], swiz[6 - i], 347affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke column_type->vector_elements); 348720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 3490471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick ir_constant *const idx = new ir_constant(glsl_type::int_type, &i); 350720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const lhs = new ir_dereference(declarations[16], idx); 351720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 352720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(lhs, rhs, NULL); 353720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 354720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 355720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 356720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const retval = new ir_dereference(declarations[16]); 357fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke inst = new ir_return(retval); 358720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 359720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 360720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 361720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 362720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 363720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the body of a vector constructor that takes multiple scalars 364720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 365720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickstatic void 366720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_mat_body_from_N_scalars(exec_list *instructions, 367720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable **declarations) 368720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 369720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_instruction *inst; 370720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const row_type = declarations[16]->type->row_type(); 371720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const glsl_type *const column_type = declarations[16]->type->column_type(); 372720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 373720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 374720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Generate an assignment of each parameter to a single component of 375720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * of a particular column of __retval and return __retval. 376720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 377720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 0; i < column_type->vector_elements; i++) { 378720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned j = 0; j < row_type->vector_elements; j++) { 3790471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick ir_constant *row_index = new ir_constant(glsl_type::int_type, &i); 380720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const row_access = 381720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick new ir_dereference(declarations[16], row_index); 382720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 383affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_dereference *const component_access_ref = 384720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick new ir_dereference(row_access); 385720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 386affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle *component_access = new ir_swizzle(component_access_ref, 387affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke j, 0, 0, 0, 1); 388720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 389720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick const unsigned param = (i * row_type->vector_elements) + j; 390720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *const rhs = new ir_dereference(declarations[param]); 391720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 392720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick inst = new ir_assignment(component_access, rhs, NULL); 393720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 394720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 395720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 396720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 397720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_dereference *retval = new ir_dereference(declarations[16]); 398720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 399fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke inst = new ir_return(retval); 400720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick instructions->push_tail(inst); 401720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 402720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 403720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 404720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick/** 405720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Generate the constructors for a set of GLSL types 406720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 407720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Constructor implementations are added to \c instructions, and the symbols 408720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * are added to \c symtab. 409720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 410720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickstatic void 411720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_constructor(glsl_symbol_table *symtab, const struct glsl_type *types, 412720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick unsigned num_types, exec_list *instructions) 413720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 414720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_variable *declarations[17]; 415720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 416720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick for (unsigned i = 0; i < num_types; i++) { 417720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Only numeric and boolean vectors and matrices get constructors here. 418720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Structures need to be handled elsewhere. It is expected that scalar 419720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * constructors are never actually called, so they are not generated. 420720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 421720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick if (!types[i].is_numeric() && !types[i].is_boolean()) 422720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick continue; 423720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 424720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick if (types[i].is_scalar()) 425720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick continue; 426720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 427720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Generate the function name and add it to the symbol table. 428720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 429720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_function *const f = new ir_function(types[i].name); 430720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 431720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick bool added = symtab->add_function(types[i].name, f); 432720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick assert(added); 433720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 434720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 435720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* Each type has several basic constructors. The total number of forms 436720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * depends on the derived type. 437720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 438720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Vectors: 1 scalar, N scalars 439720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Matrices: 1 scalar, NxM scalars 440720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 441720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Several possible types of constructors are not included in this list. 442720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 443720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Scalar constructors are not included. The expectation is that the 444720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * IR generator won't actually generate these as constructor calls. The 445720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * expectation is that it will just generate the necessary type 446720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * conversion. 447720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * 448720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * Matrix contructors from matrices are also not included. The 449720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * expectation is that the IR generator will generate a call to the 450720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick * appropriate from-scalars constructor. 451720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick */ 452720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_function_signature *const sig = new ir_function_signature(& types[i]); 4536a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick f->add_signature(sig); 454720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 4559f93d24050b2cccf539a944f674784c38cee857aIan Romanick sig->definition = 4569f93d24050b2cccf539a944f674784c38cee857aIan Romanick generate_constructor_intro(& types[i], 1, & sig->parameters, 4579f93d24050b2cccf539a944f674784c38cee857aIan Romanick instructions, declarations); 458720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 459720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick if (types[i].is_vector()) { 460720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_vec_body_from_scalar(instructions, declarations); 461720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 462720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_function_signature *const vec_sig = 463720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick new ir_function_signature(& types[i]); 4646a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick f->add_signature(vec_sig); 465720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 4669f93d24050b2cccf539a944f674784c38cee857aIan Romanick vec_sig->definition = 4679f93d24050b2cccf539a944f674784c38cee857aIan Romanick generate_constructor_intro(& types[i], types[i].vector_elements, 4689f93d24050b2cccf539a944f674784c38cee857aIan Romanick & vec_sig->parameters, instructions, 4699f93d24050b2cccf539a944f674784c38cee857aIan Romanick declarations); 470720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_vec_body_from_N_scalars(instructions, declarations); 471720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } else { 472720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick assert(types[i].is_matrix()); 473720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 474720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_mat_body_from_scalar(instructions, declarations); 475720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 476720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick ir_function_signature *const mat_sig = 477720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick new ir_function_signature(& types[i]); 4786a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick f->add_signature(mat_sig); 479720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 4809f93d24050b2cccf539a944f674784c38cee857aIan Romanick mat_sig->definition = 4819f93d24050b2cccf539a944f674784c38cee857aIan Romanick generate_constructor_intro(& types[i], 4829f93d24050b2cccf539a944f674784c38cee857aIan Romanick (types[i].vector_elements 4839f93d24050b2cccf539a944f674784c38cee857aIan Romanick * types[i].matrix_columns), 4849f93d24050b2cccf539a944f674784c38cee857aIan Romanick & mat_sig->parameters, instructions, 4859f93d24050b2cccf539a944f674784c38cee857aIan Romanick declarations); 486720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_mat_body_from_N_scalars(instructions, declarations); 487720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 488720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 489720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 490720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 491720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 492720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickvoid 493720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_110_constructors(glsl_symbol_table *symtab, exec_list *instructions) 494720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 495720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_constructor(symtab, builtin_core_types, 496720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick Elements(builtin_core_types), instructions); 497720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 498720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 499720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 500720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickvoid 501720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_120_constructors(glsl_symbol_table *symtab, exec_list *instructions) 502720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 503720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_110_constructors(symtab, instructions); 504720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 505720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_constructor(symtab, builtin_120_types, 506720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick Elements(builtin_120_types), instructions); 507720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 508720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 509720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 510720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickvoid 511720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickgenerate_130_constructors(glsl_symbol_table *symtab, exec_list *instructions) 512720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 513720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_120_constructors(symtab, instructions); 514720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 515720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_constructor(symtab, builtin_130_types, 516720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick Elements(builtin_130_types), instructions); 517720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 518720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 519720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 520720c88eab902923123b0625f133e9ef5912f0e3fIan Romanickvoid 521720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick_mesa_glsl_initialize_constructors(exec_list *instructions, 522720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick struct _mesa_glsl_parse_state *state) 523720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick{ 524720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick switch (state->language_version) { 525720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick case 110: 526720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_110_constructors(state->symbols, instructions); 527720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick break; 528720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick case 120: 529720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_120_constructors(state->symbols, instructions); 530720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick break; 531720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick case 130: 532720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick generate_130_constructors(state->symbols, instructions); 533720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick break; 534720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick default: 535720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick /* error */ 536720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick break; 537720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick } 538720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick} 539720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 540720c88eab902923123b0625f133e9ef5912f0e3fIan Romanick 5410bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanickglsl_type::glsl_type(const glsl_type *array, unsigned length) : 5420bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick base_type(GLSL_TYPE_ARRAY), 5430bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), 5440bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick sampler_type(0), 5450bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick vector_elements(0), matrix_columns(0), 5460bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick name(NULL), length(length) 5470bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick{ 5480bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick this->fields.array = array; 5490bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick 5500bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick /* Allow a maximum of 10 characters for the array size. This is enough 5510bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick * for 32-bits of ~0. The extra 3 are for the '[', ']', and terminating 5520bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick * NUL. 5530bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick */ 5540bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick const unsigned name_length = strlen(array->name) + 10 + 3; 5550bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick char *const n = (char *) malloc(name_length); 5560bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick 5570bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick if (length == 0) 5580bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick snprintf(n, name_length, "%s[]", array->name); 5590bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick else 5600bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick snprintf(n, name_length, "%s[%u]", array->name, length); 5610bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick 5620bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick this->name = n; 5630bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick} 5640bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick 5650bf381016524ac58f5961877ea0e8651c4922ca3Ian Romanick 5663209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanickconst glsl_type * 5673209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanickglsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns) 5683209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick{ 569ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt if (base_type == GLSL_TYPE_VOID) 570ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt return &void_type; 571ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt 5723209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick if ((rows < 1) || (rows > 4) || (columns < 1) || (columns > 4)) 5730471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return error_type; 5743209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 5753209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick /* Treat GLSL vectors as Nx1 matrices. 5763209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick */ 5773209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick if (columns == 1) { 5783209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick switch (base_type) { 5793209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case GLSL_TYPE_UINT: 5800471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return uint_type + (rows - 1); 5813209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case GLSL_TYPE_INT: 5820471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return int_type + (rows - 1); 5833209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case GLSL_TYPE_FLOAT: 5840471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return float_type + (rows - 1); 5853209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case GLSL_TYPE_BOOL: 5860471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return bool_type + (rows - 1); 5873209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick default: 5880471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return error_type; 5893209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick } 5903209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick } else { 5913209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick if ((base_type != GLSL_TYPE_FLOAT) || (rows == 1)) 5920471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return error_type; 5933209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 5943209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick /* GLSL matrix types are named mat{COLUMNS}x{ROWS}. Only the following 5953209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * combinations are valid: 5963209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 5973209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 1 2 3 4 5983209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 1 5993209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 2 x x x 6003209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 3 x x x 6013209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick * 4 x x x 6023209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick */ 6033209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick#define IDX(c,r) (((c-1)*3) + (r-1)) 6043209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 6053209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick switch (IDX(columns, rows)) { 6063209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(2,2): return mat2_type; 6073209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(2,3): return mat2x3_type; 6083209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(2,4): return mat2x4_type; 6093209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(3,2): return mat3x2_type; 6103209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(3,3): return mat3_type; 6113209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(3,4): return mat3x4_type; 6123209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(4,2): return mat4x2_type; 6133209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(4,3): return mat4x3_type; 6143209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick case IDX(4,4): return mat4_type; 6150471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick default: return error_type; 6163209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick } 6173209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick } 6183209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick 6193209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick assert(!"Should not get here."); 6200471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return error_type; 6213209c4e3692eaa9468aadcd21ce402e6b0d5b7ddIan Romanick} 622548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 623548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 624548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickint 625548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickglsl_type::array_key_compare(const void *a, const void *b) 626548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick{ 627299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const glsl_type *const key1 = (glsl_type *) a; 628299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const glsl_type *const key2 = (glsl_type *) b; 629548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 630299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick /* Return zero is the types match (there is zero difference) or non-zero 631299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick * otherwise. 632299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick */ 633299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick return ((key1->fields.array == key2->fields.array) 634299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick && (key1->length == key2->length)) ? 0 : 1; 635548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick} 636548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 637548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 638548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickunsigned 639548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickglsl_type::array_key_hash(const void *a) 640548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick{ 641299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const glsl_type *const key = (glsl_type *) a; 642299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick 643299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const struct { 644299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const glsl_type *t; 645299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick unsigned l; 646299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick char nul; 647299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick } hash_key = { 648299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick key->fields.array, 649299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick key->length, 650299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick '\0' 651299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick }; 652548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 653299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick return hash_table_string_hash(& hash_key); 654548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick} 655548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 656548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 657548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickconst glsl_type * 658548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanickglsl_type::get_array_instance(const glsl_type *base, unsigned array_size) 659548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick{ 660299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick const glsl_type key(base, array_size); 661548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 662548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick if (array_types == NULL) { 663548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick array_types = hash_table_ctor(64, array_key_hash, array_key_compare); 664548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick } 665548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 666548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key); 667548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick if (t == NULL) { 668548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick t = new glsl_type(base, array_size); 669548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 670299ed08a68d4f603bb72b7635bfa5c6f95776b22Ian Romanick hash_table_insert(array_types, (void *) t, t); 671548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick } 672548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 673548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick assert(t->base_type == GLSL_TYPE_ARRAY); 674548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick assert(t->length == array_size); 675548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick assert(t->fields.array == base); 676548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick 677548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick return t; 678548a1b5ab7304037a7cac8e6d647fb6b5ccbaf5dIan Romanick} 679