1548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick/* 2548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Copyright © 2010 Intel Corporation 3548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 4548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * copy of this software and associated documentation files (the "Software"), 6548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * to deal in the Software without restriction, including without limitation 7548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the 9548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Software is furnished to do so, subject to the following conditions: 10548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 11548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * The above copyright notice and this permission notice (including the next 12548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * paragraph) shall be included in all copies or substantial portions of the 13548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Software. 14548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 15548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * DEALINGS IN THE SOFTWARE. 22548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick */ 23548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick 248bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h" 25548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "ast.h" 26548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "glsl_types.h" 27548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick#include "ir.h" 28bfd7c9ac228c7ed8aec04c3b3aa33f40ee00b035Chia-I Wu#include "main/core.h" /* for MIN2 */ 2981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 3017a307d154489d718ab51a6272d2054868d782f6Kenneth Graunkestatic ir_rvalue * 3117a307d154489d718ab51a6272d2054868d782f6Kenneth Graunkeconvert_component(ir_rvalue *src, const glsl_type *desired_type); 3217a307d154489d718ab51a6272d2054868d782f6Kenneth Graunke 33f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunkebool 34f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunkeapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, 35f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunke struct _mesa_glsl_parse_state *state); 36f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunke 3768515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanickstatic unsigned 3868515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanickprocess_parameters(exec_list *instructions, exec_list *actual_parameters, 39304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick exec_list *parameters, 4068515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick struct _mesa_glsl_parse_state *state) 41f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick{ 4268515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick unsigned count = 0; 4368515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 44304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list (n, parameters) { 45304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *const ast = exec_node_data(ast_node, n, link); 461a872b1af37927d689ec7af0921af7f3a9dcb1fdIan Romanick ir_rvalue *result = ast->hir(instructions, state); 471a872b1af37927d689ec7af0921af7f3a9dcb1fdIan Romanick 481a872b1af37927d689ec7af0921af7f3a9dcb1fdIan Romanick ir_constant *const constant = result->constant_expression_value(); 491a872b1af37927d689ec7af0921af7f3a9dcb1fdIan Romanick if (constant != NULL) 501a872b1af37927d689ec7af0921af7f3a9dcb1fdIan Romanick result = constant; 51f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick 523521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick actual_parameters->push_tail(result); 533521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick count++; 54f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick } 55f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick 5668515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick return count; 5768515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick} 5868515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 5968515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 601e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick/** 611e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * Generate a source prototype for a function signature 621e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * 631e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * \param return_type Return type of the function. May be \c NULL. 641e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * \param name Name of the function. 651ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick * \param parameters List of \c ir_instruction nodes representing the 661ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick * parameter list for the function. This may be either a 671ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick * formal (\c ir_variable) or actual (\c ir_rvalue) 681ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick * parameter list. Only the type is used. 691e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * 701e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick * \return 71d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke * A ralloced string representing the prototype of the function. 721e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick */ 731e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanickchar * 741e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanickprototype_string(const glsl_type *return_type, const char *name, 751e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick exec_list *parameters) 761e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick{ 771e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick char *str = NULL; 781e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 791e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick if (return_type != NULL) 80cfd8d45ccde3252fd9a27fe0b2031a35f437a6a2Kenneth Graunke str = ralloc_asprintf(NULL, "%s ", return_type->name); 811e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 82d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke ralloc_asprintf_append(&str, "%s(", name); 831e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 841e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick const char *comma = ""; 851e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick foreach_list(node, parameters) { 86f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke const ir_variable *const param = (ir_variable *) node; 871e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 88d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke ralloc_asprintf_append(&str, "%s%s", comma, param->type->name); 891e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick comma = ", "; 901e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick } 911e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 92d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke ralloc_strcat(&str, ")"); 931e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick return str; 941e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick} 951e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 96208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick/** 97ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * Verify that 'out' and 'inout' actual parameters are lvalues. Also, verify 98ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * that 'const_in' formal parameters (an extension in our IR) correspond to 99ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * ir_constant actual parameters. 100208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick */ 101ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunkestatic bool 102ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunkeverify_parameter_modes(_mesa_glsl_parse_state *state, 103ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke ir_function_signature *sig, 104ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_list &actual_ir_parameters, 105ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_list &actual_ast_parameters) 106cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke{ 107ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_node *actual_ir_node = actual_ir_parameters.head; 108ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_node *actual_ast_node = actual_ast_parameters.head; 109cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 110ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke foreach_list(formal_node, &sig->parameters) { 111ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* The lists must be the same length. */ 112ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke assert(!actual_ir_node->is_tail_sentinel()); 113ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke assert(!actual_ast_node->is_tail_sentinel()); 114208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick 115ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke const ir_variable *const formal = (ir_variable *) formal_node; 116ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke const ir_rvalue *const actual = (ir_rvalue *) actual_ir_node; 117ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke const ast_expression *const actual_ast = 118ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_node_data(ast_expression, actual_ast_node, link); 119cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 120ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* FIXME: 'loc' is incorrect (as of 2011-01-21). It is always 121ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * FIXME: 0:0(0). 122ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke */ 123ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke YYLTYPE loc = actual_ast->get_location(); 124cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 125ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* Verify that 'const_in' parameters are ir_constants. */ 126ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke if (formal->mode == ir_var_const_in && 127ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke actual->ir_type != ir_type_constant) { 128ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke _mesa_glsl_error(&loc, state, 129ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke "parameter `in %s' must be a constant expression", 130cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke formal->name); 131ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke return false; 132cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 133cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 134ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* Verify that 'out' and 'inout' actual parameters are lvalues. */ 135ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke if (formal->mode == ir_var_out || formal->mode == ir_var_inout) { 136cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke const char *mode = NULL; 137cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke switch (formal->mode) { 138cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_out: mode = "out"; break; 139cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_inout: mode = "inout"; break; 140cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke default: assert(false); break; 141cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 142ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 143ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* This AST-based check catches errors like f(i++). The IR-based 144ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * is_lvalue() is insufficient because the actual parameter at the 145ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * IR-level is just a temporary value, which is an l-value. 146cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke */ 147ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke if (actual_ast->non_lvalue_description != NULL) { 148ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke _mesa_glsl_error(&loc, state, 149ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke "function parameter '%s %s' references a %s", 150ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke mode, formal->name, 151ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke actual_ast->non_lvalue_description); 152ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke return false; 153ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke } 154ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 155f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt ir_variable *var = actual->variable_referenced(); 1564595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt if (var) 157f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt var->assigned = true; 1584595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt 1594595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt if (var && var->read_only) { 1604595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt _mesa_glsl_error(&loc, state, 1614595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt "function parameter '%s %s' references the " 1624595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt "read-only variable '%s'", 1634595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt mode, formal->name, 1644595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt actual->variable_referenced()->name); 1654595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt return false; 1664595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt } else if (!actual->is_lvalue()) { 1674595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt _mesa_glsl_error(&loc, state, 1684595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt "function parameter '%s %s' is not an lvalue", 1694595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt mode, formal->name); 1704595288ba844def45cc858fab44fad3efa1ab4c8Eric Anholt return false; 171cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 172cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 173cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 174ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke actual_ir_node = actual_ir_node->next; 175ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke actual_ast_node = actual_ast_node->next; 176ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke } 177ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke return true; 178ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke} 179ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 180ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke/** 181ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * If a function call is generated, \c call_ir will point to it on exit. 182ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * Otherwise \c call_ir will be set to \c NULL. 183ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke */ 184ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunkestatic ir_rvalue * 185ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunkegenerate_call(exec_list *instructions, ir_function_signature *sig, 186ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke YYLTYPE *loc, exec_list *actual_parameters, 187ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke ir_call **call_ir, 188ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke struct _mesa_glsl_parse_state *state) 189ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke{ 190ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke void *ctx = state; 191ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_list post_call_conversions; 192ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 193ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke *call_ir = NULL; 194ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 195ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* Perform implicit conversion of arguments. For out parameters, we need 196ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * to place them in a temporary variable and do the conversion after the 197ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * call takes place. Since we haven't emitted the call yet, we'll place 198ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke * the post-call conversions in a temporary exec_list, and emit them later. 199ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke */ 200ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_list_iterator actual_iter = actual_parameters->iterator(); 201ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke exec_list_iterator formal_iter = sig->parameters.iterator(); 202ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 203ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke while (actual_iter.has_next()) { 204ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke ir_rvalue *actual = (ir_rvalue *) actual_iter.get(); 205ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke ir_variable *formal = (ir_variable *) formal_iter.get(); 206ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 207ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke assert(actual != NULL); 208ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke assert(formal != NULL); 209ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke 210cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke if (formal->type->is_numeric() || formal->type->is_boolean()) { 211cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke switch (formal->mode) { 212cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_const_in: 213cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_in: { 214cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_rvalue *converted 215cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke = convert_component(actual, formal->type); 216cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke actual->replace_with(converted); 217cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke break; 218cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 219cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_out: 220cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke if (actual->type != formal->type) { 221cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke /* To convert an out parameter, we need to create a 222cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * temporary variable to hold the value before conversion, 223cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * and then perform the conversion after the function call 224cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * returns. 225cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * 226cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * This has the effect of transforming code like this: 227cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * 228cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * void f(out int x); 229cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * float value; 230cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * f(value); 231cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * 232cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * Into IR that's equivalent to this: 233cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * 234cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * void f(out int x); 235cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * float value; 236cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * int out_parameter_conversion; 237cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * f(out_parameter_conversion); 238cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * value = float(out_parameter_conversion); 239cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke */ 240cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_variable *tmp = 241cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke new(ctx) ir_variable(formal->type, 242cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke "out_parameter_conversion", 243cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_var_temporary); 244cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke instructions->push_tail(tmp); 245cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_dereference_variable *deref_tmp_1 246cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke = new(ctx) ir_dereference_variable(tmp); 247cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_dereference_variable *deref_tmp_2 248cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke = new(ctx) ir_dereference_variable(tmp); 249cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_rvalue *converted_tmp 250cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke = convert_component(deref_tmp_1, actual->type); 251cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_assignment *assignment 252cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke = new(ctx) ir_assignment(actual, converted_tmp); 253cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke post_call_conversions.push_tail(assignment); 254cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke actual->replace_with(deref_tmp_2); 255cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 256cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke break; 257cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke case ir_var_inout: 258cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke /* Inout parameters should never require conversion, since that 259cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * would require an implicit conversion to exist both to and 260cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * from the formal parameter type, and there are no 261cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * bidirectional implicit conversions. 262cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke */ 263cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke assert (actual->type == formal->type); 264cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke break; 265cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke default: 266cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke assert (!"Illegal formal parameter mode"); 267cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke break; 268cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 269cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 270cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 271cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke actual_iter.next(); 272cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke formal_iter.next(); 273cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 274cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 275d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke /* If the function call is a constant expression, don't generate any 276d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * instructions; just generate an ir_constant. 277cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke * 278d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * Function calls were first allowed to be constant expressions in GLSL 1.20. 279cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke */ 280d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke if (state->language_version >= 120) { 2816e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *value = sig->constant_expression_value(actual_parameters, NULL); 282d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke if (value != NULL) { 283d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke return value; 284cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 285d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke } 286cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 287d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir_dereference_variable *deref = NULL; 288d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke if (!sig->return_type->is_void()) { 289d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke /* Create a new temporary to hold the return value. */ 290cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_variable *var; 291cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 292cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke var = new(ctx) ir_variable(sig->return_type, 293cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ralloc_asprintf(ctx, "%s_retval", 294cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke sig->function_name()), 295cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke ir_var_temporary); 296cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke instructions->push_tail(var); 297cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke 298cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke deref = new(ctx) ir_dereference_variable(var); 299cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke } 300d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir_call *call = new(ctx) ir_call(sig, deref, actual_parameters); 301d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke instructions->push_tail(call); 302d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke 303d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke /* Also emit any necessary out-parameter conversions. */ 304cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke instructions->append_list(&post_call_conversions); 305d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke 306d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke return deref ? deref->clone(ctx, NULL) : NULL; 307cdc94082664c329e6c55cf6053893360946275bfKenneth Graunke} 3081e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 309909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke/** 310909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke * Given a function name and parameter list, find the matching signature. 311909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke */ 312909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunkestatic ir_function_signature * 313909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunkematch_function_by_name(const char *name, 314909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke exec_list *actual_parameters, 315f5692f452f7ae77d1e710041ffebb468cc5ba87bKenneth Graunke struct _mesa_glsl_parse_state *state) 31668515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick{ 317953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 318f5692f452f7ae77d1e710041ffebb468cc5ba87bKenneth Graunke ir_function *f = state->symbols->get_function(name); 319f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke ir_function_signature *local_sig = NULL; 320f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke ir_function_signature *sig = NULL; 321f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 322f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* Is the function hidden by a record type constructor? */ 323f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (state->symbols->get_type(name)) 324f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke goto done; /* no match */ 325f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 326f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* Is the function hidden by a variable (impossible in 1.10)? */ 327f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (state->language_version != 110 && state->symbols->get_variable(name)) 328f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke goto done; /* no match */ 329f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 330f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (f != NULL) { 331f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* Look for a match in the local shader. If exact, we're done. */ 332f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke bool is_exact = false; 333f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke sig = local_sig = f->matching_signature(actual_parameters, &is_exact); 334f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (is_exact) 335f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke goto done; 336f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 337f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (!state->es_shader && f->has_user_signature()) { 338f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* In desktop GL, the presence of a user-defined signature hides any 339f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke * built-in signatures, so we must ignore them. In contrast, in ES2 340f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke * user-defined signatures add new overloads, so we must proceed. 341f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke */ 342f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke goto done; 343f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke } 344f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke } 3451660a2954797e056caba319c5d6c70b0d4be22feCarl Worth 346f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* Local shader has no exact candidates; check the built-ins. */ 347f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke _mesa_glsl_initialize_functions(state); 348f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke for (unsigned i = 0; i < state->num_builtins_to_link; i++) { 349f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke ir_function *builtin = 350f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke state->builtins_to_link[i]->symbols->get_function(name); 351f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (builtin == NULL) 352f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke continue; 353f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 354f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke bool is_exact = false; 355f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke ir_function_signature *builtin_sig = 356f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke builtin->matching_signature(actual_parameters, &is_exact); 357f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 358f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (builtin_sig == NULL) 359f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke continue; 360f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 361f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* If the built-in signature is exact, we can stop. */ 362f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (is_exact) { 363f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke sig = builtin_sig; 364f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke goto done; 365f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke } 366c17c7903871b031162e41d6495a1bef64844e19bKenneth Graunke 367f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (sig == NULL) { 368f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* We found an inexact match, which is better than nothing. However, 369f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke * we should keep searching for an exact match. 370f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke */ 371f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke sig = builtin_sig; 372f5692f452f7ae77d1e710041ffebb468cc5ba87bKenneth Graunke } 373f5692f452f7ae77d1e710041ffebb468cc5ba87bKenneth Graunke } 37468515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 375f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunkedone: 376f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick if (sig != NULL) { 377f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke /* If the match is from a linked built-in shader, import the prototype. */ 378f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (sig != local_sig) { 379f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke if (f == NULL) { 380f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke f = new(ctx) ir_function(name); 381f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke state->symbols->add_global_function(f); 382f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke emit_function(state, f); 383f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke } 384f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke f->add_signature(sig->clone_prototype(f, NULL)); 385f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke } 386909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke } 387909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke return sig; 388909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke} 389f1a677cefbe91a5c1a72dbeda94d2f13a9369e54Kenneth Graunke 390909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke/** 391909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke * Raise a "no matching function" error, listing all possible overloads the 392909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke * compiler considered so developers can figure out what went wrong. 393909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke */ 394909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunkestatic void 395909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunkeno_matching_function_error(const char *name, 396909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke YYLTYPE *loc, 397909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke exec_list *actual_parameters, 398909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke _mesa_glsl_parse_state *state) 399909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke{ 400909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke char *str = prototype_string(NULL, name, actual_parameters); 401909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke _mesa_glsl_error(loc, state, "no matching function for call to `%s'", str); 402909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ralloc_free(str); 4031e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 404909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke const char *prefix = "candidates are: "; 4051e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 406909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke for (int i = -1; i < (int) state->num_builtins_to_link; i++) { 407909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke glsl_symbol_table *syms = i >= 0 ? state->builtins_to_link[i]->symbols 408909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke : state->symbols; 409909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ir_function *f = syms->get_function(name); 410909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke if (f == NULL) 411909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke continue; 4121e0f0459e0ca8b9f0c67f8178e5189b8cfd6078cIan Romanick 413909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke foreach_list (node, &f->signatures) { 414909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ir_function_signature *sig = (ir_function_signature *) node; 41568515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 416909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke str = prototype_string(sig->return_type, f->name, &sig->parameters); 417909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke _mesa_glsl_error(loc, state, "%s%s", prefix, str); 418909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ralloc_free(str); 41968515ee6c2a41cf5c0476b3309fcb050ef37b0d2Ian Romanick 420909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke prefix = " "; 421f5692f452f7ae77d1e710041ffebb468cc5ba87bKenneth Graunke } 422f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick } 423f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick} 424f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick 4250b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick/** 4260b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick * Perform automatic type conversion of constructor parameters 4270048c7aef82b17c6bd160f49125a91a70cbf2b55Kenneth Graunke * 4280048c7aef82b17c6bd160f49125a91a70cbf2b55Kenneth Graunke * This implements the rules in the "Conversion and Scalar Constructors" 4290048c7aef82b17c6bd160f49125a91a70cbf2b55Kenneth Graunke * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules. 4300b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick */ 4310b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanickstatic ir_rvalue * 4320b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanickconvert_component(ir_rvalue *src, const glsl_type *desired_type) 4330b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick{ 434d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(src); 4350b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick const unsigned a = desired_type->base_type; 4360b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick const unsigned b = src->type->base_type; 43700eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick ir_expression *result = NULL; 4380b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 4390b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick if (src->type->is_error()) 4400b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick return src; 4410b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 4420b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick assert(a <= GLSL_TYPE_BOOL); 4430b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick assert(b <= GLSL_TYPE_BOOL); 4440b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 4456b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke if (a == b) 4460b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick return src; 4470b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 4480b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick switch (a) { 4490b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_UINT: 4506b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke switch (b) { 4516b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_INT: 4526b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_i2u, src); 4536b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4546b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_FLOAT: 4554d9c3cbce9e1ff45e5a90dda4de4934599b88037Paul Berry result = new(ctx) ir_expression(ir_unop_f2u, src); 4566b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4576b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_BOOL: 4586b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_i2u, 4596b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke new(ctx) ir_expression(ir_unop_b2i, src)); 4606b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4616b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke } 4626b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4630b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_INT: 4646b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke switch (b) { 4656b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_UINT: 4666b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_u2i, src); 4676b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4686b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_FLOAT: 4696b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_f2i, src); 4706b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4716b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke case GLSL_TYPE_BOOL: 4726b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_b2i, src); 4736b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 4740b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 475565185cd8f3ea636d3d2aaad9218d63323390464Ian Romanick break; 4760b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_FLOAT: 4770b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick switch (b) { 4780b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_UINT: 4791660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(ir_unop_u2f, desired_type, src, NULL); 48000eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick break; 4810b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_INT: 4821660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(ir_unop_i2f, desired_type, src, NULL); 48300eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick break; 4840b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick case GLSL_TYPE_BOOL: 4851660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL); 48600eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick break; 4870b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 4880b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick break; 48926b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick case GLSL_TYPE_BOOL: 490b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick switch (b) { 49126b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick case GLSL_TYPE_UINT: 4926b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke result = new(ctx) ir_expression(ir_unop_i2b, 4936b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke new(ctx) ir_expression(ir_unop_u2i, src)); 4946b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke break; 49526b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick case GLSL_TYPE_INT: 49626b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL); 49726b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick break; 49826b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick case GLSL_TYPE_FLOAT: 49926b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL); 50026b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick break; 501b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick } 50226b5d33dce37755a6a4a799a9edfcdff8c5ce3e5Ian Romanick break; 5030b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 5040b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 50500eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick assert(result != NULL); 5066b1ba7ccef18232e5586fcda2ff75ef5bd05b57bKenneth Graunke assert(result->type == desired_type); 50700eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick 5080048c7aef82b17c6bd160f49125a91a70cbf2b55Kenneth Graunke /* Try constant folding; it may fold in the conversion we just added. */ 50900eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick ir_constant *const constant = result->constant_expression_value(); 51000eb466e38733f386794b35ae5b0aab18b60b1d2Ian Romanick return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result; 5110b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick} 5120b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5130b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick/** 5140b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick * Dereference a specific component from a scalar, vector, or matrix 5150b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick */ 5160b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanickstatic ir_rvalue * 5170b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanickdereference_component(ir_rvalue *src, unsigned component) 5180b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick{ 519d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(src); 5200b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick assert(component < src->type->components()); 5210b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 522c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick /* If the source is a constant, just create a new constant instead of a 523c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick * dereference of the existing constant. 524c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick */ 525c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick ir_constant *constant = src->as_constant(); 526c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick if (constant) 5271660a2954797e056caba319c5d6c70b0d4be22feCarl Worth return new(ctx) ir_constant(constant, component); 528c9cb1032be454ff5fdb802a629565cfaeb2e5d5aIan Romanick 5290b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick if (src->type->is_scalar()) { 5300b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick return src; 5310b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } else if (src->type->is_vector()) { 5321660a2954797e056caba319c5d6c70b0d4be22feCarl Worth return new(ctx) ir_swizzle(src, component, 0, 0, 0, 1); 5330b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } else { 5340b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick assert(src->type->is_matrix()); 5350b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5360b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick /* Dereference a row of the matrix, then call this function again to get 5370b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick * a specific element from that row. 5380b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick */ 5390b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick const int c = component / src->type->column_type()->vector_elements; 5400b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick const int r = component % src->type->column_type()->vector_elements; 5411660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_constant *const col_index = new(ctx) ir_constant(c); 5421660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const col = new(ctx) ir_dereference_array(src, col_index); 5430b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5440b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick col->type = src->type->column_type(); 5450b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5460b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick return dereference_component(col, r); 5470b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 5480b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5490b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick assert(!"Should not get here."); 5500b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick return NULL; 5510b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick} 5520b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 5530b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 55400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanickstatic ir_rvalue * 55500aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanickprocess_array_constructor(exec_list *instructions, 55600aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick const glsl_type *constructor_type, 557304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick YYLTYPE *loc, exec_list *parameters, 55800aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick struct _mesa_glsl_parse_state *state) 55900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick{ 560953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 56100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick /* Array constructors come in two forms: sized and unsized. Sized array 56200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * constructors look like 'vec4[2](a, b)', where 'a' and 'b' are vec4 56300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * variables. In this case the number of parameters must exactly match the 56400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * specified size of the array. 56500aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * 56600aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * Unsized array constructors look like 'vec4[](a, b)', where 'a' and 'b' 56700aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * are vec4 variables. In this case the size of the array being constructed 56800aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * is determined by the number of parameters. 56900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * 57000aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * From page 52 (page 58 of the PDF) of the GLSL 1.50 spec: 57100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * 57200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * "There must be exactly the same number of arguments as the size of 57300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * the array being constructed. If no size is present in the 57400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * constructor, then the array is explicitly sized to the number of 57500aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * arguments provided. The arguments are assigned in order, starting at 57600aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * element 0, to the elements of the constructed array. Each argument 57700aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * must be the same type as the element type of the array, or be a type 57800aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * that can be converted to the element type of the array according to 57900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick * Section 4.1.10 "Implicit Conversions."" 58000aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick */ 58100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick exec_list actual_parameters; 58200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick const unsigned parameter_count = 58300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick process_parameters(instructions, &actual_parameters, parameters, state); 58400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 58500aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick if ((parameter_count == 0) 58600aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick || ((constructor_type->length != 0) 58700aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick && (constructor_type->length != parameter_count))) { 58800aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick const unsigned min_param = (constructor_type->length == 0) 58900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick ? 1 : constructor_type->length; 59000aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 59100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick _mesa_glsl_error(loc, state, "array constructor must have %s %u " 59200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick "parameter%s", 59300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick (constructor_type->length != 0) ? "at least" : "exactly", 59400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick min_param, (min_param <= 1) ? "" : "s"); 595807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 59600aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick } 59700aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 59800aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick if (constructor_type->length == 0) { 59900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick constructor_type = 600f38d15b80d4e4c8ecb7a76087cdc49835f0aa271Ian Romanick glsl_type::get_array_instance(constructor_type->element_type(), 60100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick parameter_count); 60200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick assert(constructor_type != NULL); 60300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick assert(constructor_type->length == parameter_count); 60400aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick } 60500aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 60613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke bool all_parameters_are_constant = true; 60700aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 60813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke /* Type cast each parameter and, if possible, fold constants. */ 60913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke foreach_list_safe(n, &actual_parameters) { 61013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_rvalue *ir = (ir_rvalue *) n; 61113a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_rvalue *result = ir; 61213a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 613a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace /* Apply implicit conversions (not the scalar constructor rules!). See 614a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace * the spec quote above. */ 61513a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke if (constructor_type->element_type()->is_float()) { 61613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke const glsl_type *desired_type = 61713a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke glsl_type::get_instance(GLSL_TYPE_FLOAT, 61813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir->type->vector_elements, 61913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir->type->matrix_columns); 620a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace if (result->type->can_implicitly_convert_to(desired_type)) { 621a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace /* Even though convert_component() implements the constructor 622a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace * conversion rules (not the implicit conversion rules), its safe 623a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace * to use it here because we already checked that the implicit 624a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace * conversion is legal. 625a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace */ 626a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace result = convert_component(ir, desired_type); 627a5ab9398e34287ed8cbb010d0758790e6692530cChad Versace } 62813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke } 62913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 63013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke if (result->type != constructor_type->element_type()) { 63113a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke _mesa_glsl_error(loc, state, "type error in array constructor: " 63213a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke "expected: %s, found %s", 63313a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke constructor_type->element_type()->name, 63413a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke result->type->name); 63513a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke } 63613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 63713a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke /* Attempt to convert the parameter to a constant valued expression. 63813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke * After doing so, track whether or not all the parameters to the 63913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke * constructor are trivially constant valued expressions. 64013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke */ 64113a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_rvalue *const constant = result->constant_expression_value(); 64213a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 64313a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke if (constant != NULL) 64413a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke result = constant; 64513a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke else 64613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke all_parameters_are_constant = false; 64713a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 64813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir->replace_with(result); 64913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke } 65013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 65174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke if (all_parameters_are_constant) 65274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke return new(ctx) ir_constant(constructor_type, &actual_parameters); 65300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 65413a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor", 65513a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_var_temporary); 65613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke instructions->push_tail(var); 65713a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 65813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke int i = 0; 65913a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke foreach_list(node, &actual_parameters) { 66013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_rvalue *rhs = (ir_rvalue *) node; 66113a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_rvalue *lhs = new(ctx) ir_dereference_array(var, 66213a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke new(ctx) ir_constant(i)); 66300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 66413a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs, NULL); 66513a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke instructions->push_tail(assignment); 66613a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke 66713a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke i++; 66813a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke } 66900aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 67013a19745d46d383fa7fc148ce129150ebde151b7Kenneth Graunke return new(ctx) ir_dereference_variable(var); 67100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick} 67200aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 67300aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick 674ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick/** 675ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick * Try to convert a record constructor to a constant expression 676ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick */ 677ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanickstatic ir_constant * 678ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanickconstant_record_constructor(const glsl_type *constructor_type, 67937200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick exec_list *parameters, void *mem_ctx) 680ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick{ 68137200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick foreach_list(node, parameters) { 68243a6200f3c3fb29d2e9654a293b2328cd6c0f64fKenneth Graunke ir_constant *constant = ((ir_instruction *) node)->as_constant(); 68343a6200f3c3fb29d2e9654a293b2328cd6c0f64fKenneth Graunke if (constant == NULL) 684ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick return NULL; 68543a6200f3c3fb29d2e9654a293b2328cd6c0f64fKenneth Graunke node->replace_with(constant); 686ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick } 687ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick 68837200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick return new(mem_ctx) ir_constant(constructor_type, parameters); 689ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick} 690ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick 691ab92d0e53eab9030742e5e6d938a5739e549f16cIan Romanick 692be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 693c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * Determine if a list consists of a single scalar r-value 694c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick */ 695c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanickbool 696c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanicksingle_scalar_parameter(exec_list *parameters) 697c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick{ 698c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick const ir_rvalue *const p = (ir_rvalue *) parameters->head; 699c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick assert(((ir_rvalue *)p)->as_rvalue() != NULL); 700c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 70162c4763b707e2227409f81b09dd5cf6e4410ea6aEric Anholt return (p->type->is_scalar() && p->next->is_tail_sentinel()); 702c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick} 703c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 704c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 705c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick/** 706c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * Generate inline code for a vector constructor 707c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * 708c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * The generated constructor code will consist of a temporary variable 709c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * declaration of the same type as the constructor. A sequence of assignments 710c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * from constructor parameters to the temporary will follow. 711c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * 712c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * \return 713c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * An \c ir_dereference_variable of the temprorary generated in the constructor 714c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * body. 715c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick */ 716c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanickir_rvalue * 717c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanickemit_inline_vector_constructor(const glsl_type *type, 718c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick exec_list *instructions, 719c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick exec_list *parameters, 720c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick void *ctx) 721c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick{ 722c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick assert(!parameters->is_empty()); 723c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 724900ab2f564018856133c19b68713a6dfd206c184Eric Anholt ir_variable *var = new(ctx) ir_variable(type, "vec_ctor", ir_var_temporary); 725c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick instructions->push_tail(var); 726c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 727c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick /* There are two kinds of vector constructors. 728c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * 729c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * - Construct a vector from a single scalar by replicating that scalar to 730c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * all components of the vector. 731c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * 732c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * - Construct a vector from an arbirary combination of vectors and 733c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * scalars. The components of the constructor parameters are assigned 734c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * to the vector in order until the vector is full. 735c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick */ 736c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick const unsigned lhs_components = type->components(); 737c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick if (single_scalar_parameter(parameters)) { 738c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick ir_rvalue *first_param = (ir_rvalue *)parameters->head; 739c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick ir_rvalue *rhs = new(ctx) ir_swizzle(first_param, 0, 0, 0, 0, 740c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick lhs_components); 741c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(var); 7423d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick const unsigned mask = (1U << lhs_components) - 1; 743c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 744c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick assert(rhs->type == lhs->type); 745c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 7463d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL, mask); 747c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick instructions->push_tail(inst); 748c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick } else { 749c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick unsigned base_component = 0; 750b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt unsigned base_lhs_component = 0; 751a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick ir_constant_data data; 752b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt unsigned constant_mask = 0, constant_components = 0; 753a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 754a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick memset(&data, 0, sizeof(data)); 755a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 756c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick foreach_list(node, parameters) { 7573d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_rvalue *param = (ir_rvalue *) node; 7583d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick unsigned rhs_components = param->type->components(); 759c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 760c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick /* Do not try to assign more components to the vector than it has! 761c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick */ 762b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt if ((rhs_components + base_lhs_component) > lhs_components) { 763b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt rhs_components = lhs_components - base_lhs_component; 764c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick } 765c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 766a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick const ir_constant *const c = param->as_constant(); 767a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick if (c != NULL) { 768a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick for (unsigned i = 0; i < rhs_components; i++) { 769a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick switch (c->type->base_type) { 770a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick case GLSL_TYPE_UINT: 771a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick data.u[i + base_component] = c->get_uint_component(i); 772a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick break; 773a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick case GLSL_TYPE_INT: 774a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick data.i[i + base_component] = c->get_int_component(i); 775a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick break; 776a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick case GLSL_TYPE_FLOAT: 777a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick data.f[i + base_component] = c->get_float_component(i); 778a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick break; 779a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick case GLSL_TYPE_BOOL: 780a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick data.b[i + base_component] = c->get_bool_component(i); 781a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick break; 782a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick default: 783a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick assert(!"Should not get here."); 784a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick break; 785a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 786a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 787a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 788a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick /* Mask of fields to be written in the assignment. 789a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick */ 790b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt constant_mask |= ((1U << rhs_components) - 1) << base_lhs_component; 791ba2382f50d7815947e17fe993b39feb573638d12Kenneth Graunke constant_components += rhs_components; 792c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 793b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt base_component += rhs_components; 794b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt } 795b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt /* Advance the component index by the number of components 796b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * that were just assigned. 7973d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick */ 798b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt base_lhs_component += rhs_components; 799a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 800c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 801a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick if (constant_mask != 0) { 8023d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_dereference *lhs = new(ctx) ir_dereference_variable(var); 803b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt const glsl_type *rhs_type = glsl_type::get_instance(var->type->base_type, 804b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt constant_components, 805b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt 1); 806b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt ir_rvalue *rhs = new(ctx) ir_constant(rhs_type, &data); 807c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 8083d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_instruction *inst = 809a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick new(ctx) ir_assignment(lhs, rhs, NULL, constant_mask); 810c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick instructions->push_tail(inst); 811a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 812a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 813a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick base_component = 0; 814a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick foreach_list(node, parameters) { 815a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick ir_rvalue *param = (ir_rvalue *) node; 816a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick unsigned rhs_components = param->type->components(); 817a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 818a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick /* Do not try to assign more components to the vector than it has! 819a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick */ 820a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick if ((rhs_components + base_component) > lhs_components) { 821a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick rhs_components = lhs_components - base_component; 822a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 823a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 824a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick const ir_constant *const c = param->as_constant(); 825a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick if (c == NULL) { 826a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick /* Mask of fields to be written in the assignment. 827a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick */ 828a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick const unsigned write_mask = ((1U << rhs_components) - 1) 829a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick << base_component; 830a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 831a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick ir_dereference *lhs = new(ctx) ir_dereference_variable(var); 8322d2d6a80c14612de683001d24cbbbb9a8f620dd5Ian Romanick 8332d2d6a80c14612de683001d24cbbbb9a8f620dd5Ian Romanick /* Generate a swizzle so that LHS and RHS sizes match. 8342d2d6a80c14612de683001d24cbbbb9a8f620dd5Ian Romanick */ 8352d2d6a80c14612de683001d24cbbbb9a8f620dd5Ian Romanick ir_rvalue *rhs = 8362d2d6a80c14612de683001d24cbbbb9a8f620dd5Ian Romanick new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components); 837a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick 838a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick ir_instruction *inst = 839a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick new(ctx) ir_assignment(lhs, rhs, NULL, write_mask); 840a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick instructions->push_tail(inst); 841a6c3cd5ca6822da2ec6e869c7bc2b8ac64c177f2Ian Romanick } 842c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 843c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick /* Advance the component index by the number of components that were 844c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick * just assigned. 845c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick */ 846c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick base_component += rhs_components; 847c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick } 848c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick } 849c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick return new(ctx) ir_dereference_variable(var); 850c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick} 851c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 852c31dcdf57ed9646580040ebfe44c2609885fe96bIan Romanick 85381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick/** 85481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * Generate assignment of a portion of a vector to a portion of a matrix column 85581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 85681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \param src_base First component of the source to be used in assignment 85781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \param column Column of destination to be assiged 85881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \param row_base First component of the destination column to be assigned 85981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \param count Number of components to be assigned 86081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 86181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \note 86281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \c src_base + \c count must be less than or equal to the number of components 86381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * in the source vector. 86481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 86581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanickir_instruction * 86681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanickassign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base, 86781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *src, unsigned src_base, unsigned count, 868ad98aa9d93646600cc95b3e45a40eec26f18988aKenneth Graunke void *mem_ctx) 86981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick{ 870ad98aa9d93646600cc95b3e45a40eec26f18988aKenneth Graunke ir_constant *col_idx = new(mem_ctx) ir_constant(column); 8713d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_dereference *column_ref = new(mem_ctx) ir_dereference_array(var, col_idx); 87281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 87381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick assert(column_ref->type->components() >= (row_base + count)); 87481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick assert(src->type->components() >= (src_base + count)); 87581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 876bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick /* Generate a swizzle that extracts the number of components from the source 877bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick * that are to be assigned to the column of the matrix. 8783d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick */ 879bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick if (count < src->type->vector_elements) { 880bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick src = new(mem_ctx) ir_swizzle(src, 881bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick src_base + 0, src_base + 1, 882bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick src_base + 2, src_base + 3, 883bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick count); 884bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick } 8853d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick 8863d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick /* Mask of fields to be written in the assignment. 8873d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick */ 8883d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick const unsigned write_mask = ((1U << count) - 1) << row_base; 8893d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick 890bb756bb0a6935b7e0d8fd2f9d61c0437fef7d770Ian Romanick return new(mem_ctx) ir_assignment(column_ref, src, NULL, write_mask); 89181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick} 89281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 89381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 89481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick/** 89581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * Generate inline code for a matrix constructor 89681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 89781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * The generated constructor code will consist of a temporary variable 89881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * declaration of the same type as the constructor. A sequence of assignments 89981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * from constructor parameters to the temporary will follow. 90081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 90181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * \return 90281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * An \c ir_dereference_variable of the temprorary generated in the constructor 90381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * body. 90481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 90581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanickir_rvalue * 90681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanickemit_inline_matrix_constructor(const glsl_type *type, 90781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick exec_list *instructions, 90881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick exec_list *parameters, 90981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick void *ctx) 91081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick{ 91181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick assert(!parameters->is_empty()); 91281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 913900ab2f564018856133c19b68713a6dfd206c184Eric Anholt ir_variable *var = new(ctx) ir_variable(type, "mat_ctor", ir_var_temporary); 91481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(var); 91581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 91681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* There are three kinds of matrix constructors. 91781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 91881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * - Construct a matrix from a single scalar by replicating that scalar to 91981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * along the diagonal of the matrix and setting all other components to 92081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * zero. 92181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 92281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * - Construct a matrix from an arbirary combination of vectors and 92381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * scalars. The components of the constructor parameters are assigned 92481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * to the matrix in colum-major order until the matrix is full. 92581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 92681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * - Construct a matrix from a single matrix. The source matrix is copied 92781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * to the upper left portion of the constructed matrix, and the remaining 92881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * elements take values from the identity matrix. 92981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 93081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const first_param = (ir_rvalue *) parameters->head; 93181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick if (single_scalar_parameter(parameters)) { 93281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* Assign the scalar to the X component of a vec4, and fill the remaining 93381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * components with zero. 93481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 9354b6feb0398458a69259e3b77d7a8573b926f2039Ian Romanick ir_variable *rhs_var = 936900ab2f564018856133c19b68713a6dfd206c184Eric Anholt new(ctx) ir_variable(glsl_type::vec4_type, "mat_ctor_vec", 9377e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 93881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(rhs_var); 93981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 94081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_constant_data zero; 94181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick zero.f[0] = 0.0; 94281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick zero.f[1] = 0.0; 94381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick zero.f[2] = 0.0; 94481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick zero.f[3] = 0.0; 94581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 94681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *inst = 94781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_assignment(new(ctx) ir_dereference_variable(rhs_var), 94881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_constant(rhs_var->type, &zero), 94981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick NULL); 95081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 95181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 9523d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_dereference *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); 95381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 9543d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick inst = new(ctx) ir_assignment(rhs_ref, first_param, NULL, 0x01); 95581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 95681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 95781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* Assign the temporary vector to each column of the destination matrix 95881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * with a swizzle that puts the X component on the diagonal of the 95981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * matrix. In some cases this may mean that the X component does not 96081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * get assigned into the column at all (i.e., when the matrix has more 96181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * columns than rows). 96281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 96381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick static const unsigned rhs_swiz[4][4] = { 96481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick { 0, 1, 1, 1 }, 96581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick { 1, 0, 1, 1 }, 96681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick { 1, 1, 0, 1 }, 96781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick { 1, 1, 1, 0 } 96881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick }; 96981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 9700dc39f481ab98d2114590103928b7403386c13cfIan Romanick const unsigned cols_to_init = MIN2(type->matrix_columns, 9710dc39f481ab98d2114590103928b7403386c13cfIan Romanick type->vector_elements); 97281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick for (unsigned i = 0; i < cols_to_init; i++) { 97381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_constant *const col_idx = new(ctx) ir_constant(i); 97481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx); 97581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 97681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); 97781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, rhs_swiz[i], 97881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick type->vector_elements); 97981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 98081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick inst = new(ctx) ir_assignment(col_ref, rhs, NULL); 98181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 98281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 98381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 98481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick for (unsigned i = cols_to_init; i < type->matrix_columns; i++) { 98581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_constant *const col_idx = new(ctx) ir_constant(i); 98681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, col_idx); 98781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 98881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); 98981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, 1, 1, 1, 1, 99081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick type->vector_elements); 99181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 99281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick inst = new(ctx) ir_assignment(col_ref, rhs, NULL); 99381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 99481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 99581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } else if (first_param->type->is_matrix()) { 99681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* From page 50 (56 of the PDF) of the GLSL 1.50 spec: 99781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 99881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * "If a matrix is constructed from a matrix, then each component 99981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * (column i, row j) in the result that has a corresponding 100081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * component (column i, row j) in the argument will be initialized 100181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * from there. All other components will be initialized to the 100281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * identity matrix. If a matrix argument is given to a matrix 100381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * constructor, it is an error to have any other arguments." 100481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 100562c4763b707e2227409f81b09dd5cf6e4410ea6aEric Anholt assert(first_param->next->is_tail_sentinel()); 100681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const src_matrix = first_param; 100781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 100881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* If the source matrix is smaller, pre-initialize the relavent parts of 100981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * the destination matrix to the identity matrix. 101081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 101181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick if ((src_matrix->type->matrix_columns < var->type->matrix_columns) 101281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick || (src_matrix->type->vector_elements < var->type->vector_elements)) { 101381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 101481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* If the source matrix has fewer rows, every column of the destination 101581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * must be initialized. Otherwise only the columns in the destination 101681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * that do not exist in the source must be initialized. 101781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 101881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick unsigned col = 101981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick (src_matrix->type->vector_elements < var->type->vector_elements) 102081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ? 0 : src_matrix->type->matrix_columns; 102181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 102281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick const glsl_type *const col_type = var->type->column_type(); 102381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick for (/* empty */; col < var->type->matrix_columns; col++) { 102481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_constant_data ident; 102581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 102681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ident.f[0] = 0.0; 102781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ident.f[1] = 0.0; 102881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ident.f[2] = 0.0; 102981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ident.f[3] = 0.0; 103081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 103181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ident.f[col] = 1.0; 103281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 103381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs = new(ctx) ir_constant(col_type, &ident); 103481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 103581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const lhs = 103681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_dereference_array(var, new(ctx) ir_constant(col)); 103781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 103881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, NULL); 103981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 104081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 104181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 104281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 104381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* Assign columns from the source matrix to the destination matrix. 104481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 104581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * Since the parameter will be used in the RHS of multiple assignments, 104681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * generate a temporary and copy the paramter there. 104781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 10484b6feb0398458a69259e3b77d7a8573b926f2039Ian Romanick ir_variable *const rhs_var = 1049900ab2f564018856133c19b68713a6dfd206c184Eric Anholt new(ctx) ir_variable(first_param->type, "mat_ctor_mat", 10507e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 105181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(rhs_var); 105281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 105381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_dereference *const rhs_var_ref = 105481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_dereference_variable(rhs_var); 105581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *const inst = 105681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_assignment(rhs_var_ref, first_param, NULL); 105781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 105881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 105939605587951aed546c14febcc26e5a479bf8d807Kenneth Graunke const unsigned last_row = MIN2(src_matrix->type->vector_elements, 106039605587951aed546c14febcc26e5a479bf8d807Kenneth Graunke var->type->vector_elements); 106139605587951aed546c14febcc26e5a479bf8d807Kenneth Graunke const unsigned last_col = MIN2(src_matrix->type->matrix_columns, 106239605587951aed546c14febcc26e5a479bf8d807Kenneth Graunke var->type->matrix_columns); 106381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 10643d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick unsigned swiz[4] = { 0, 0, 0, 0 }; 1065b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt for (unsigned i = 1; i < last_row; i++) 10663d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick swiz[i] = i; 10673d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick 106839605587951aed546c14febcc26e5a479bf8d807Kenneth Graunke const unsigned write_mask = (1U << last_row) - 1; 10693d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick 107081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick for (unsigned i = 0; i < last_col; i++) { 10713d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_dereference *const lhs = 107281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i)); 107381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs_col = 107481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_dereference_array(rhs_var, new(ctx) ir_constant(i)); 107581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 107681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* If one matrix has columns that are smaller than the columns of the 107781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * other matrix, wrap the column access of the larger with a swizzle 107881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * so that the LHS and RHS of the assignment have the same size (and 107981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * therefore have the same type). 108081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 108181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * It would be perfectly valid to unconditionally generate the 108281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * swizzles, this this will typically result in a more compact IR tree. 108381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 108481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *rhs; 10853d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick if (lhs->type->vector_elements != rhs_col->type->vector_elements) { 1086b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt rhs = new(ctx) ir_swizzle(rhs_col, swiz, last_row); 108781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } else { 108881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs = rhs_col; 108981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 109081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 10913d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick ir_instruction *inst = 10923d58be6135e71e6105ae65850f2dbeaf9ecff5c3Ian Romanick new(ctx) ir_assignment(lhs, rhs, NULL, write_mask); 109381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 109481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 109581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } else { 1096bdc0e5285a3d7d29b953970e43ca548cbc4e7e30Ian Romanick const unsigned cols = type->matrix_columns; 1097bdc0e5285a3d7d29b953970e43ca548cbc4e7e30Ian Romanick const unsigned rows = type->vector_elements; 109881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick unsigned col_idx = 0; 109981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick unsigned row_idx = 0; 110081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 110181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick foreach_list (node, parameters) { 110281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_rvalue *const rhs = (ir_rvalue *) node; 110381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick const unsigned components_remaining_this_column = rows - row_idx; 110481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick unsigned rhs_components = rhs->type->components(); 110581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick unsigned rhs_base = 0; 110681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 110781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* Since the parameter might be used in the RHS of two assignments, 110881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * generate a temporary and copy the paramter there. 110981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 11104b6feb0398458a69259e3b77d7a8573b926f2039Ian Romanick ir_variable *rhs_var = 1111900ab2f564018856133c19b68713a6dfd206c184Eric Anholt new(ctx) ir_variable(rhs->type, "mat_ctor_vec", ir_var_temporary); 111281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(rhs_var); 111381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 111481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_dereference *rhs_var_ref = 111581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick new(ctx) ir_dereference_variable(rhs_var); 111681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *inst = new(ctx) ir_assignment(rhs_var_ref, rhs, NULL); 111781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 111881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 111981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* Assign the current parameter to as many components of the matrix 112081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * as it will fill. 112181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * 112281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * NOTE: A single vector parameter can span two matrix columns. A 112381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * single vec4, for example, can completely fill a mat2. 112481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 112581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick if (rhs_components >= components_remaining_this_column) { 11260dc39f481ab98d2114590103928b7403386c13cfIan Romanick const unsigned count = MIN2(rhs_components, 11270dc39f481ab98d2114590103928b7403386c13cfIan Romanick components_remaining_this_column); 112881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 112981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var); 113081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 113181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *inst = assign_to_matrix_column(var, col_idx, 113281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick row_idx, 113381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_var_ref, 0, 113481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick count, ctx); 113581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 113681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 113781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_base = count; 113881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 113981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick col_idx++; 114081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick row_idx = 0; 114181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 114281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 114381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick /* If there is data left in the parameter and components left to be 114481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * set in the destination, emit another assignment. It is possible 114581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * that the assignment could be of a vec4 to the last element of the 114681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * matrix. In this case col_idx==cols, but there is still data 114781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * left in the source parameter. Obviously, don't emit an assignment 114881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick * to data outside the destination matrix. 114981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick */ 115081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick if ((col_idx < cols) && (rhs_base < rhs_components)) { 115181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick const unsigned count = rhs_components - rhs_base; 115281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 115381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var); 115481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 115581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick ir_instruction *inst = assign_to_matrix_column(var, col_idx, 115681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick row_idx, 115781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_var_ref, 115881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick rhs_base, 115981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick count, ctx); 116081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick instructions->push_tail(inst); 116181c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 116281c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick row_idx += count; 116381c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 116481c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 116581c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick } 116681c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 116781c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick return new(ctx) ir_dereference_variable(var); 116881c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick} 116981c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 117081c7e94466da19f9295b8eb5e4b5e587fea96284Ian Romanick 1171fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 117237200d83d3e61aa480e6dbb350e522bd0388644cIan Romanickemit_inline_record_constructor(const glsl_type *type, 117337200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick exec_list *instructions, 117437200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick exec_list *parameters, 117537200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick void *mem_ctx) 117637200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick{ 117737200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick ir_variable *const var = 117837200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick new(mem_ctx) ir_variable(type, "record_ctor", ir_var_temporary); 117937200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick ir_dereference_variable *const d = new(mem_ctx) ir_dereference_variable(var); 118037200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 118137200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick instructions->push_tail(var); 118237200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 118337200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick exec_node *node = parameters->head; 118437200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick for (unsigned i = 0; i < type->length; i++) { 118537200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick assert(!node->is_tail_sentinel()); 118637200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 118737200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick ir_dereference *const lhs = 118837200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick new(mem_ctx) ir_dereference_record(d->clone(mem_ctx, NULL), 118937200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick type->fields.structure[i].name); 119037200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 119137200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick ir_rvalue *const rhs = ((ir_instruction *) node)->as_rvalue(); 119237200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick assert(rhs != NULL); 119337200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 119437200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick ir_instruction *const assign = new(mem_ctx) ir_assignment(lhs, rhs, NULL); 119537200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 119637200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick instructions->push_tail(assign); 119737200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick node = node->next; 119837200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick } 119937200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 120037200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick return d; 120137200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick} 120237200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 120337200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 120437200d83d3e61aa480e6dbb350e522bd0388644cIan Romanickir_rvalue * 1205548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanickast_function_expression::hir(exec_list *instructions, 1206548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick struct _mesa_glsl_parse_state *state) 1207548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick{ 1208953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 1209548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick /* There are three sorts of function calls. 1210548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 1211f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * 1. constructors - The first subexpression is an ast_type_specifier. 1212548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 2. methods - Only the .length() method of array types. 1213548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 3. functions - Calls to regular old functions. 1214548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * 1215548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * Method calls are actually detected when the ast_field_selection 1216548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick * expression is handled. 1217548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick */ 1218548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick if (is_constructor()) { 1219abef9557642f77d406452f3c32e5e49ced212571Ian Romanick const ast_type_specifier *type = (ast_type_specifier *) subexpressions[0]; 1220abef9557642f77d406452f3c32e5e49ced212571Ian Romanick YYLTYPE loc = type->get_location(); 12213e0ef5f81b08a1496d952d3673b614497be9c75aIan Romanick const char *name; 1222abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 12233e0ef5f81b08a1496d952d3673b614497be9c75aIan Romanick const glsl_type *const constructor_type = type->glsl_type(& name, state); 1224abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 1225884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick /* constructor_type can be NULL if a variable with the same name as the 1226884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick * structure has come into scope. 1227884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick */ 1228884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick if (constructor_type == NULL) { 1229884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name " 1230884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "may be shadowed by a variable with the same name)", 1231884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick type->type_name); 1232807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1233884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1234884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1235abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 1236abef9557642f77d406452f3c32e5e49ced212571Ian Romanick /* Constructors for samplers are illegal. 1237abef9557642f77d406452f3c32e5e49ced212571Ian Romanick */ 1238abef9557642f77d406452f3c32e5e49ced212571Ian Romanick if (constructor_type->is_sampler()) { 1239abef9557642f77d406452f3c32e5e49ced212571Ian Romanick _mesa_glsl_error(& loc, state, "cannot construct sampler type `%s'", 1240abef9557642f77d406452f3c32e5e49ced212571Ian Romanick constructor_type->name); 1241807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1242abef9557642f77d406452f3c32e5e49ced212571Ian Romanick } 1243abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 1244b6326abb859550963446affe9123085fd57f9525Ian Romanick if (constructor_type->is_array()) { 1245b6326abb859550963446affe9123085fd57f9525Ian Romanick if (state->language_version <= 110) { 1246b6326abb859550963446affe9123085fd57f9525Ian Romanick _mesa_glsl_error(& loc, state, 1247b6326abb859550963446affe9123085fd57f9525Ian Romanick "array constructors forbidden in GLSL 1.10"); 1248807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1249b6326abb859550963446affe9123085fd57f9525Ian Romanick } 1250b6326abb859550963446affe9123085fd57f9525Ian Romanick 125100aa173c9cbc1d6c50bcb5caf569558759ce26d8Ian Romanick return process_array_constructor(instructions, constructor_type, 12523521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick & loc, &this->expressions, state); 1253b6326abb859550963446affe9123085fd57f9525Ian Romanick } 1254abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 125537200d83d3e61aa480e6dbb350e522bd0388644cIan Romanick 1256abef9557642f77d406452f3c32e5e49ced212571Ian Romanick /* There are two kinds of constructor call. Constructors for built-in 1257abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * language types, such as mat4 and vec2, are free form. The only 1258abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * requirement is that the parameters must provide enough values of the 1259abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * correct scalar type. Constructors for arrays and structures must 1260abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * have the exact number of parameters with matching types in the 1261abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * correct order. These constructors follow essentially the same type 1262abef9557642f77d406452f3c32e5e49ced212571Ian Romanick * matching rules as functions. 1263abef9557642f77d406452f3c32e5e49ced212571Ian Romanick */ 1264884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick if (constructor_type->is_record()) { 1265884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick exec_list actual_parameters; 1266884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1267884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick process_parameters(instructions, &actual_parameters, 1268884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick &this->expressions, state); 1269884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1270884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick exec_node *node = actual_parameters.head; 1271884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick for (unsigned i = 0; i < constructor_type->length; i++) { 1272884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick ir_rvalue *ir = (ir_rvalue *) node; 1273884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1274884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick if (node->is_tail_sentinel()) { 1275884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick _mesa_glsl_error(&loc, state, 1276884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "insufficient parameters to constructor " 1277884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "for `%s'", 1278884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick constructor_type->name); 1279807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1280884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1281884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1282884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick if (apply_implicit_conversion(constructor_type->fields.structure[i].type, 1283884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick ir, state)) { 1284884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick node->replace_with(ir); 1285884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } else { 1286884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick _mesa_glsl_error(&loc, state, 1287884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "parameter type mismatch in constructor " 1288884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "for `%s.%s' (%s vs %s)", 1289884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick constructor_type->name, 1290884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick constructor_type->fields.structure[i].name, 1291884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick ir->type->name, 1292884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick constructor_type->fields.structure[i].type->name); 1293807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx);; 1294884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1295884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1296884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick node = node->next; 1297884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1298884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1299884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick if (!node->is_tail_sentinel()) { 1300884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick _mesa_glsl_error(&loc, state, "too many parameters in constructor " 1301884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick "for `%s'", constructor_type->name); 1302807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1303884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1304884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1305884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick ir_rvalue *const constant = 1306884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick constant_record_constructor(constructor_type, &actual_parameters, 1307884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick state); 1308884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1309884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick return (constant != NULL) 1310884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick ? constant 1311884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick : emit_inline_record_constructor(constructor_type, instructions, 1312884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick &actual_parameters, state); 1313884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick } 1314884215894493bdbc55abd567c121c9df06ae3bc7Ian Romanick 1315f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if (!constructor_type->is_numeric() && !constructor_type->is_boolean()) 1316807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 13170b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 1318f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* Total number of components of the type being constructed. */ 1319f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke const unsigned type_components = constructor_type->components(); 13203521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick 1321f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* Number of components from parameters that have actually been 1322f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * consumed. This is used to perform several kinds of error checking. 1323f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1324f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke unsigned components_used = 0; 13253521f0bdd52d226031a3b60e2cd89b4629147690Ian Romanick 1326f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke unsigned matrix_parameters = 0; 1327f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke unsigned nonmatrix_parameters = 0; 1328f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke exec_list actual_parameters; 13290b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 1330f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke foreach_list (n, &this->expressions) { 1331f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke ast_node *ast = exec_node_data(ast_node, n, link); 1332f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke ir_rvalue *result = ast->hir(instructions, state)->as_rvalue(); 13330b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 13340b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: 13350b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick * 1336f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * "It is an error to provide extra arguments beyond this 1337f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * last used argument." 13380b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick */ 1339f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if (components_used >= type_components) { 1340f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke _mesa_glsl_error(& loc, state, "too many parameters to `%s' " 1341f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke "constructor", 13420b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick constructor_type->name); 1343807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 13440b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 13450b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 1346f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if (!result->type->is_numeric() && !result->type->is_boolean()) { 1347f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " 1348f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke "non-numeric data type", 13490b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick constructor_type->name); 1350807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 13510b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 13520b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 1353f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* Count the number of matrix and nonmatrix parameters. This 1354f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * is used below to enforce some of the constructor rules. 1355f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1356f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if (result->type->is_matrix()) 1357f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke matrix_parameters++; 1358f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke else 1359f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke nonmatrix_parameters++; 13600b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick 1361f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke actual_parameters.push_tail(result); 1362f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke components_used += result->type->components(); 13630b7dcc80eb3163b46d40c5175a27a2ea4264fcd3Ian Romanick } 1364abef9557642f77d406452f3c32e5e49ced212571Ian Romanick 1365f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: 1366f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * 1367f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * "It is an error to construct matrices from other matrices. This 1368f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * is reserved for future use." 1369f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1370b4ec3f268c4a81c4b9047813423bdf49f0cb1cb5Kenneth Graunke if (state->language_version == 110 && matrix_parameters > 0 1371f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke && constructor_type->is_matrix()) { 1372f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " 1373f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke "matrix in GLSL 1.10", 1374f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke constructor_type->name); 1375807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1376f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } 1377f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke 1378f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: 1379f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * 1380f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * "If a matrix argument is given to a matrix constructor, it is 1381f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * an error to have any other arguments." 1382f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1383f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if ((matrix_parameters > 0) 1384f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke && ((matrix_parameters + nonmatrix_parameters) > 1) 1385f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke && constructor_type->is_matrix()) { 1386f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, " 1387f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke "matrix must be only parameter", 1388f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke constructor_type->name); 1389807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1390f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } 1391f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke 1392f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: 1393f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * 1394f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * "In these cases, there must be enough components provided in the 1395f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * arguments to provide an initializer for every component in the 1396f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * constructed value." 1397f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1398550237eedd772487151565f64384d35c1bf695a6Kenneth Graunke if (components_used < type_components && components_used != 1 1399550237eedd772487151565f64384d35c1bf695a6Kenneth Graunke && matrix_parameters == 0) { 1400f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke _mesa_glsl_error(& loc, state, "too few components to construct " 1401f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke "`%s'", 1402f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke constructor_type->name); 1403807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1404f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } 1405f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke 1406284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke /* Later, we cast each parameter to the same base type as the 1407284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke * constructor. Since there are no non-floating point matrices, we 1408284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke * need to break them up into a series of column vectors. 1409284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke */ 1410284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke if (constructor_type->base_type != GLSL_TYPE_FLOAT) { 1411284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke foreach_list_safe(n, &actual_parameters) { 1412284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir_rvalue *matrix = (ir_rvalue *) n; 1413284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1414284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke if (!matrix->type->is_matrix()) 1415284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke continue; 1416284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1417284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke /* Create a temporary containing the matrix. */ 14187e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp", 14197e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 1420284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke instructions->push_tail(var); 1421284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke instructions->push_tail(new(ctx) ir_assignment(new(ctx) 1422284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir_dereference_variable(var), matrix, NULL)); 1423284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke var->constant_value = matrix->constant_expression_value(); 1424284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1425284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke /* Replace the matrix with dereferences of its columns. */ 1426284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke for (int i = 0; i < matrix->type->matrix_columns; i++) { 1427284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke matrix->insert_before(new (ctx) ir_dereference_array(var, 1428284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke new(ctx) ir_constant(i))); 1429284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke } 1430284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke matrix->remove(); 1431284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke } 1432284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke } 1433284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1434284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke bool all_parameters_are_constant = true; 1435284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1436284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke /* Type cast each parameter and, if possible, fold constants.*/ 1437284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke foreach_list_safe(n, &actual_parameters) { 1438284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir_rvalue *ir = (ir_rvalue *) n; 1439284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1440284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke const glsl_type *desired_type = 1441284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke glsl_type::get_instance(constructor_type->base_type, 1442284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir->type->vector_elements, 1443284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir->type->matrix_columns); 1444284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir_rvalue *result = convert_component(ir, desired_type); 1445284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1446284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke /* Attempt to convert the parameter to a constant valued expression. 1447284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke * After doing so, track whether or not all the parameters to the 1448284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke * constructor are trivially constant valued expressions. 1449284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke */ 1450284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke ir_rvalue *const constant = result->constant_expression_value(); 1451284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1452284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke if (constant != NULL) 1453284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke result = constant; 1454284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke else 1455284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke all_parameters_are_constant = false; 1456284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke 1457284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke if (result != ir) { 1458c7a18da69022d3f9b05c21ff2473e8ea390f77f1Kenneth Graunke ir->replace_with(result); 1459284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke } 1460284d821206d74fddb346cd0d892d2dcec463e2a5Kenneth Graunke } 1461f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke 1462f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke /* If all of the parameters are trivially constant, create a 1463f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke * constant representing the complete collection of parameters. 1464f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke */ 1465f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke if (all_parameters_are_constant) { 14661f7c7df40f830e164f96df4468a2b4fa365c4b84Kenneth Graunke return new(ctx) ir_constant(constructor_type, &actual_parameters); 1467f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } else if (constructor_type->is_scalar()) { 1468f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke return dereference_component((ir_rvalue *) actual_parameters.head, 1469f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke 0); 1470f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } else if (constructor_type->is_vector()) { 1471f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke return emit_inline_vector_constructor(constructor_type, 1472f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke instructions, 1473f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke &actual_parameters, 1474f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke ctx); 1475f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } else { 1476f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke assert(constructor_type->is_matrix()); 1477f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke return emit_inline_matrix_constructor(constructor_type, 1478f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke instructions, 1479f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke &actual_parameters, 1480f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke ctx); 1481f58bbd134e921b14f50ecd1e76b2943753ba194cKenneth Graunke } 1482548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick } else { 1483548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick const ast_expression *id = subexpressions[0]; 1484909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke const char *func_name = id->primary_expression.identifier; 1485f4749610ed800c2a93f0a21f94c0f8b4212c38deIan Romanick YYLTYPE loc = id->get_location(); 1486c077131c0f4692b46afb06ab236288a24f2cfa14Ian Romanick exec_list actual_parameters; 1487c077131c0f4692b46afb06ab236288a24f2cfa14Ian Romanick 1488c077131c0f4692b46afb06ab236288a24f2cfa14Ian Romanick process_parameters(instructions, &actual_parameters, &this->expressions, 1489c077131c0f4692b46afb06ab236288a24f2cfa14Ian Romanick state); 1490548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick 1491909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ir_function_signature *sig = 1492909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke match_function_by_name(func_name, &actual_parameters, state); 1493909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke 1494208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick ir_call *call = NULL; 1495909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke ir_rvalue *value = NULL; 1496909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke if (sig == NULL) { 1497909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke no_matching_function_error(func_name, &loc, &actual_parameters, state); 1498807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke value = ir_rvalue::error_value(ctx); 1499ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke } else if (!verify_parameter_modes(state, sig, actual_parameters, this->expressions)) { 1500ac0f8bae8d39ca9f5e873ba8411472e2962890cdKenneth Graunke /* an error has already been emitted */ 1501807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke value = ir_rvalue::error_value(ctx); 1502909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke } else { 1503909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke value = generate_call(instructions, sig, &loc, &actual_parameters, 1504909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke &call, state); 1505909e8899671a45bcc865fe303a8cb697a25634aaKenneth Graunke } 1506208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick 1507208b5b113faab324854d457c3ad4abf05cafedd1Ian Romanick return value; 1508548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick } 1509548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick 1510807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return ir_rvalue::error_value(ctx); 1511548fa293a37db8f01bd35d2dc878720e75886aa4Ian Romanick} 1512