ast_to_hir.cpp revision b078aad8ab22d840456688480a8c27d4664297ce
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \file ast_to_hir.c 26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Convert abstract syntax to to high-level intermediate reprensentation (HIR). 27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * During the conversion to HIR, the majority of the symantic checking is 29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * preformed on the program. This includes: 30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * Symbol table management 32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * Type checking 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * Function binding 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The majority of this work could be done during parsing, and the parser could 36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * probably generate HIR directly. However, this results in frequent changes 37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to the parser code. Since we do not assume that every system this complier 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is built on will have Flex and Bison installed, we have to store the code 39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * generated by these tools in our version control system. In other parts of 40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the system we've seen problems where a parser was changed but the generated 41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * code was not committed, merge conflicts where created because two developers 42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * had slightly different versions of Bison installed, etc. 43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * I have also noticed that running Bison generated parsers in GDB is very 45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * irritating. When you get a segfault on '$$ = $1->foo', you can't very 46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * well 'print $1' in GDB. 47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * As a result, my preference is to put as little C code as possible in the 49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parser (and lexer) sources. 50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 51ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt 52bfd7c9ac228c7ed8aec04c3b3aa33f40ee00b035Chia-I Wu#include "main/core.h" /* for struct gl_extensions */ 538bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h" 54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h" 56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_types.h" 57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ir.h" 58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 59d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickvoid 60d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) 61d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick{ 62adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick _mesa_glsl_initialize_variables(instructions, state); 6381168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke _mesa_glsl_initialize_functions(state); 64adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 65814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke state->symbols->language_version = state->language_version; 66814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke 6741ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = NULL; 6841ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick 69a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke /* Section 4.2 of the GLSL 1.20 specification states: 70a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * "The built-in functions are scoped in a scope outside the global scope 71a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * users declare global variables in. That is, a shader's global scope, 72a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * available for user-defined functions and global variables, is nested 73a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * inside the scope containing the built-in functions." 74a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * 75a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * Since built-in functions like ftransform() access built-in variables, 76a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * it follows that those must be in the outer scope as well. 77a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * 78a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * We push scope here to create this nesting effect...but don't pop. 79a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * This way, a shader's globals are still in the symbol table for use 80a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke * by the linker. 81a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke */ 82a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke state->symbols->push_scope(); 83a044285e25615f2d97636fe3ba47d580c3537bc4Kenneth Graunke 842b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_node, ast, link, & state->translation_unit) 85304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->hir(instructions, state); 86d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick} 87d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 88d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 890104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick/** 900104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is available, convert one operand to a different type 910104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 920104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * The \c from \c ir_rvalue is converted "in place". 930104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 940104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param to Type that the operand it to be converted to 950104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param from Operand that is being converted 960104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param state GLSL compiler state 970104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 980104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \return 990104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is possible (or unnecessary), \c true is returned. 1000104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * Otherwise \c false is returned. 1010104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 102f32d3df8ab2b7c6c746f46870edc4b284cea50caKenneth Graunkebool 103bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, 1040104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick struct _mesa_glsl_parse_state *state) 1050104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick{ 106953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 107bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if (to->base_type == from->type->base_type) 1080104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return true; 1090104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1100104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* This conversion was added in GLSL 1.20. If the compilation mode is 1110104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * GLSL 1.10, the conversion is skipped. 1120104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 1130104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick if (state->language_version < 120) 1140104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return false; 1150104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1160104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec: 1170104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 1180104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * "There are no implicit array or structure conversions. For 1190104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * example, an array of int cannot be implicitly converted to an 1200104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * array of float. There are no implicit conversions between 1210104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * signed and unsigned integers." 1220104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 1230104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* FINISHME: The above comment is partially a lie. There is int/uint 1240104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * FINISHME: conversion for immediate constants. 1250104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 126bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if (!to->is_float() || !from->type->is_numeric()) 1270104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return false; 1280104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 129506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke /* Convert to a floating point type with the same number of components 130506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke * as the original type - i.e. int to float, not int to vec4. 131506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke */ 132506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke to = glsl_type::get_instance(GLSL_TYPE_FLOAT, from->type->vector_elements, 133506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke from->type->matrix_columns); 134506199b852390e14a1d78392285bee8f06b6ede7Kenneth Graunke 135bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick switch (from->type->base_type) { 1360104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_INT: 1371660a2954797e056caba319c5d6c70b0d4be22feCarl Worth from = new(ctx) ir_expression(ir_unop_i2f, to, from, NULL); 1380104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick break; 1390104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_UINT: 1401660a2954797e056caba319c5d6c70b0d4be22feCarl Worth from = new(ctx) ir_expression(ir_unop_u2f, to, from, NULL); 1410104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick break; 1420104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_BOOL: 1431660a2954797e056caba319c5d6c70b0d4be22feCarl Worth from = new(ctx) ir_expression(ir_unop_b2f, to, from, NULL); 144dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt break; 1450104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick default: 1460104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick assert(0); 1470104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick } 1480104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1490104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return true; 1500104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick} 1510104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1520104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 154bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickarithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, 155a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool multiply, 156a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 157a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 158336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt const glsl_type *type_a = value_a->type; 159336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt const glsl_type *type_b = value_b->type; 1600104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The arithmetic binary operators add (+), subtract (-), 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * multiply (*), and divide (/) operate on integer and 165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * floating-point scalars, vectors, and matrices." 166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 16760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick if (!type_a->is_numeric() || !type_b->is_numeric()) { 168a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, 169a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt "Operands to arithmetic operators must be numeric"); 1700471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "If one operand is floating-point based and the other is 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not, then the conversions from Section 4.1.10 "Implicit 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Conversions" are applied to the non-floating-point-based operand." 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1780104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick if (!apply_implicit_conversion(type_a, value_b, state) 1790104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick && !apply_implicit_conversion(type_b, value_a, state)) { 180a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, 181a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt "Could not implicitly convert operands to " 182a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt "arithmetic operator"); 1830104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return glsl_type::error_type; 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 185336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt type_a = value_a->type; 186336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt type_b = value_b->type; 187336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "If the operands are integer types, they must both be signed or 189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * both be unsigned." 190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * From this rule and the preceeding conversion it can be inferred that 192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT. 19360b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * The is_numeric check above already filtered out the case where either 19460b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * type is not one of these, so now the base types need only be tested for 19560b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * equality. 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type_a->base_type != type_b->base_type) { 198a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, 199a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt "base type mismatch for arithmetic operator"); 2000471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "All arithmetic binary operators result in the same fundamental type 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * (signed integer, unsigned integer, or floating-point) as the 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operands they operate on, after operand type conversion. After 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * conversion, the following cases are valid 207a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 208a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * The two operands are scalars. In this case the operation is 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * applied, resulting in a scalar." 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 211cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (type_a->is_scalar() && type_b->is_scalar()) 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* One operand is a scalar, and the other is a vector or matrix. 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * In this case, the scalar operation is applied independently to each 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * component of the vector or matrix, resulting in the same size 217a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * vector or matrix." 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 219cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (type_a->is_scalar()) { 220cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (!type_b->is_scalar()) 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_b; 222cb36f8aaeeb09660843316270a781948f773d90bIan Romanick } else if (type_b->is_scalar()) { 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* All of the combinations of <scalar, scalar>, <vector, scalar>, 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * handled. 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 23060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(!type_a->is_scalar()); 23160b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(!type_b->is_scalar()); 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* The two operands are vectors of the same size. In this case, the 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operation is done component-wise resulting in the same size 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * vector." 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 237a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (type_a->is_vector() && type_b->is_vector()) { 238a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt if (type_a == type_b) { 239a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt return type_a; 240a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt } else { 241a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, 242a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt "vector size mismatch for arithmetic operator"); 243a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt return glsl_type::error_type; 244a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt } 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* All of the combinations of <scalar, scalar>, <vector, scalar>, 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <vector, vector> have been handled. At least one of the operands must 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * be matrix. Further, since there are no integer matrix types, the base 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * type of both operands must be float. 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 25360b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(type_a->is_matrix() || type_b->is_matrix()); 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick assert(type_a->base_type == GLSL_TYPE_FLOAT); 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick assert(type_b->base_type == GLSL_TYPE_FLOAT); 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* The operator is add (+), subtract (-), or divide (/), and the 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operands are matrices with the same number of rows and the same 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * number of columns. In this case, the operation is done component- 260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * wise resulting in the same size matrix." 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * The operator is multiply (*), where both operands are matrices or 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * one operand is a vector and the other a matrix. A right vector 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand is treated as a column vector and a left vector operand as a 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * row vector. In all these cases, it is required that the number of 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * columns of the left operand is equal to the number of rows of the 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * right operand. Then, the multiply (*) operation does a linear 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * algebraic multiply, yielding an object that has the same number of 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * rows as the left operand and the same number of columns as the right 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand. Section 5.10 "Vector and Matrix Operations" explains in 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * more detail how vectors and matrices are operated on." 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (! multiply) { 273a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt if (type_a == type_b) 274a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt return type_a; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 276fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick if (type_a->is_matrix() && type_b->is_matrix()) { 277c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* Matrix multiply. The columns of A must match the rows of B. Given 278c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the other previously tested constraints, this means the vector type 279c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * of a row from A must be the same as the vector type of a column from 280c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * B. 281c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick */ 282c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick if (type_a->row_type() == type_b->column_type()) { 283c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* The resulting matrix has the number of columns of matrix B and 284c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the number of rows of matrix A. We get the row count of A by 285c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * looking at the size of a vector that makes up a column. The 286c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * transpose (size of a row) is done for B. 287c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick */ 288a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt const glsl_type *const type = 289c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick glsl_type::get_instance(type_a->base_type, 290c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick type_a->column_type()->vector_elements, 291c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick type_b->row_type()->vector_elements); 292a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt assert(type != glsl_type::error_type); 293a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt 294a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt return type; 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 296fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick } else if (type_a->is_matrix()) { 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* A is a matrix and B is a column vector. Columns of A must match 298c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * rows of B. Given the other previously tested constraints, this 299c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * means the vector type of a row from A must be the same as the 300c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * vector the type of B. 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 30247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth if (type_a->row_type() == type_b) { 30347c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth /* The resulting vector has a number of elements equal to 30447c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth * the number of rows of matrix A. */ 30547c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth const glsl_type *const type = 30647c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth glsl_type::get_instance(type_a->base_type, 30747c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth type_a->column_type()->vector_elements, 30847c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth 1); 30947c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth assert(type != glsl_type::error_type); 31047c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth 31147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth return type; 31247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth } 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 314fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick assert(type_b->is_matrix()); 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 316c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* A is a row vector and B is a matrix. Columns of A must match rows 317c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * of B. Given the other previously tested constraints, this means 318c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the type of A must be the same as the vector type of a column from 319c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * B. 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 32147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth if (type_a == type_b->column_type()) { 32247c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth /* The resulting vector has a number of elements equal to 32347c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth * the number of columns of matrix B. */ 32447c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth const glsl_type *const type = 32547c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth glsl_type::get_instance(type_a->base_type, 32647c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth type_b->row_type()->vector_elements, 32747c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth 1); 32847c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth assert(type != glsl_type::error_type); 32947c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth 33047c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth return type; 33147c90b144729e3edf3b5cbf5b260c1c46e429879Carl Worth } 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 333a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt 334a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication"); 335a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt return glsl_type::error_type; 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "All other cases are illegal." 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 341a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt _mesa_glsl_error(loc, state, "type mismatch"); 3420471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 34765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholtunary_arithmetic_result_type(const struct glsl_type *type, 34865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 57: 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The arithmetic unary operators negate (-), post- and pre-increment 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and decrement (-- and ++) operate on integer or floating-point 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * values (including vectors and matrices). All unary operators work 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * component-wise on their operands. These result with the same type 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * they operated on." 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 35865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt if (!type->is_numeric()) { 35965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, 36065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt "Operands to arithmetic operators must be numeric"); 3610471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 36265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt } 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type; 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 367cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace/** 368cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \brief Return the result type of a bit-logic operation. 369cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * 370cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * If the given types to the bit-logic operator are invalid, return 371cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * glsl_type::error_type. 372cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * 373cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \param type_a Type of LHS of bit-logic op 374cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * \param type_b Type of RHS of bit-logic op 375cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace */ 376cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versacestatic const struct glsl_type * 377cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versacebit_logic_result_type(const struct glsl_type *type_a, 378cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace const struct glsl_type *type_b, 379cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace ast_operators op, 380cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 381cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace{ 382cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (state->language_version < 130) { 383cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30"); 384cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return glsl_type::error_type; 385cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace } 386cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace 387cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace /* From page 50 (page 56 of PDF) of GLSL 1.30 spec: 388cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * 389cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * "The bitwise operators and (&), exclusive-or (^), and inclusive-or 390cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * (|). The operands must be of type signed or unsigned integers or 391cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * integer vectors." 392cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace */ 393cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (!type_a->is_integer()) { 394cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer", 395cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace ast_expression::operator_string(op)); 396cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return glsl_type::error_type; 397cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace } 398cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (!type_b->is_integer()) { 399cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer", 400cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace ast_expression::operator_string(op)); 401cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return glsl_type::error_type; 402cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace } 403cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace 404cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace /* "The fundamental types of the operands (signed or unsigned) must 405cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * match," 406cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace */ 407cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (type_a->base_type != type_b->base_type) { 408cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace _mesa_glsl_error(loc, state, "operands of `%s' must have the same " 409cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace "base type", ast_expression::operator_string(op)); 410cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return glsl_type::error_type; 411cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace } 412cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace 413cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace /* "The operands cannot be vectors of differing size." */ 414cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (type_a->is_vector() && 415cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace type_b->is_vector() && 416cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace type_a->vector_elements != type_b->vector_elements) { 417cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of " 418cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace "different sizes", ast_expression::operator_string(op)); 419cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return glsl_type::error_type; 420cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace } 421cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace 422cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace /* "If one operand is a scalar and the other a vector, the scalar is 423cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * applied component-wise to the vector, resulting in the same type as 424cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * the vector. The fundamental types of the operands [...] will be the 425cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace * resulting fundamental type." 426cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace */ 427cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace if (type_a->is_scalar()) 428cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return type_b; 429cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace else 430cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace return type_a; 431cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace} 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickmodulus_result_type(const struct glsl_type *type_a, 43565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt const struct glsl_type *type_b, 43665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 43882f994f3860ca05ff5550f32844b0f523d40b9efChad Versace if (state->language_version < 130) { 43982f994f3860ca05ff5550f32844b0f523d40b9efChad Versace _mesa_glsl_error(loc, state, 44082f994f3860ca05ff5550f32844b0f523d40b9efChad Versace "operator '%%' is reserved in %s", 44182f994f3860ca05ff5550f32844b0f523d40b9efChad Versace state->version_string); 44282f994f3860ca05ff5550f32844b0f523d40b9efChad Versace return glsl_type::error_type; 44382f994f3860ca05ff5550f32844b0f523d40b9efChad Versace } 44482f994f3860ca05ff5550f32844b0f523d40b9efChad Versace 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The operator modulus (%) operates on signed or unsigned integers or 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * integer vectors. The operand types must both be signed or both be 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * unsigned." 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 45040176e249f72b6090204611873b19aed3da67c71Ian Romanick if (!type_a->is_integer() || !type_b->is_integer() 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (type_a->base_type != type_b->base_type)) { 45265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, "type mismatch"); 4530471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The operands cannot be vectors of differing size. If one operand is 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * a scalar and the other vector, then the scalar is applied component- 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * wise to the vector, resulting in the same type as the vector. If both 459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * are vectors of the same size, the result is computed component-wise." 460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 461a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (type_a->is_vector()) { 462a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (!type_b->is_vector() 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (type_a->vector_elements == type_b->vector_elements)) 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_b; 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The operator modulus (%) is not defined for any other data types 469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * (non-integer types)." 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 47165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, "type mismatch"); 4720471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 477bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickrelational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, 47865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 480336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt const glsl_type *type_a = value_a->type; 481336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt const glsl_type *type_b = value_b->type; 4820150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The relational operators greater than (>), less than (<), greater 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * than or equal (>=), and less than or equal (<=) operate only on 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalar integer and scalar floating-point expressions." 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 488a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick if (!type_a->is_numeric() 489a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick || !type_b->is_numeric() 490cb36f8aaeeb09660843316270a781948f773d90bIan Romanick || !type_a->is_scalar() 49165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt || !type_b->is_scalar()) { 49265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, 49365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt "Operands to relational operators must be scalar and " 49465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt "numeric"); 4950471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 49665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt } 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "Either the operands' types must match, or the conversions from 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Section 4.1.10 "Implicit Conversions" will be applied to the integer 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand, after which the types must match." 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 5020150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick if (!apply_implicit_conversion(type_a, value_b, state) 5030150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick && !apply_implicit_conversion(type_b, value_a, state)) { 50465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, 50565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt "Could not implicitly convert operands to " 50665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt "relational operator"); 5070150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick return glsl_type::error_type; 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 509336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt type_a = value_a->type; 510336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt type_b = value_b->type; 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 51265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt if (type_a->base_type != type_b->base_type) { 51365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt _mesa_glsl_error(loc, state, "base type mismatch"); 5140471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 51565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt } 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The result is scalar Boolean." 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 5190471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::bool_type; 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 522c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace/** 523c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \brief Return the result type of a bit-shift operation. 524c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * 525c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * If the given types to the bit-shift operator are invalid, return 526c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * glsl_type::error_type. 527c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * 528c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \param type_a Type of LHS of bit-shift op 529c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * \param type_b Type of RHS of bit-shift op 530c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */ 531c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versacestatic const struct glsl_type * 532c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versaceshift_result_type(const struct glsl_type *type_a, 533c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace const struct glsl_type *type_b, 534c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace ast_operators op, 535c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace struct _mesa_glsl_parse_state *state, YYLTYPE *loc) 536c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace{ 537c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace if (state->language_version < 130) { 538c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30"); 539c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return glsl_type::error_type; 540c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace } 541c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace 542c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec: 543c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * 544c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * "The shift operators (<<) and (>>). For both operators, the operands 545c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * must be signed or unsigned integers or integer vectors. One operand 546c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * can be signed while the other is unsigned." 547c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */ 548c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace if (!type_a->is_integer()) { 549c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or " 550c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace "integer vector", ast_expression::operator_string(op)); 551c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return glsl_type::error_type; 552c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace 553c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace } 554c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace if (!type_b->is_integer()) { 555c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or " 556c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace "integer vector", ast_expression::operator_string(op)); 557c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return glsl_type::error_type; 558c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace } 559c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace 560c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace /* "If the first operand is a scalar, the second operand has to be 561c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * a scalar as well." 562c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */ 563c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace if (type_a->is_scalar() && !type_b->is_scalar()) { 564c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace _mesa_glsl_error(loc, state, "If the first operand of %s is scalar, the " 565c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace "second must be scalar as well", 566c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace ast_expression::operator_string(op)); 567c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return glsl_type::error_type; 568c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace } 569c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace 570c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace /* If both operands are vectors, check that they have same number of 571c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * elements. 572c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */ 573c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace if (type_a->is_vector() && 574c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace type_b->is_vector() && 575c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace type_a->vector_elements != type_b->vector_elements) { 576c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace _mesa_glsl_error(loc, state, "Vector operands to operator %s must " 577c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace "have same number of elements", 578c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace ast_expression::operator_string(op)); 579c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return glsl_type::error_type; 580c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace } 581c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace 582c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace /* "In all cases, the resulting type will be the same type as the left 583c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace * operand." 584c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace */ 585c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace return type_a; 586c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace} 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5880bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick/** 5890bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that a value can be assigned to a location with a specified type 5900bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 5910bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that \c rhs can be assigned to some location. If the types are 5920bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * not an exact match but an automatic conversion is possible, \c rhs will be 5930bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * converted. 5940bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 5950bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \return 5960bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type. 5970bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Otherwise the actual RHS to be assigned will be returned. This may be 5980bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c rhs, or it may be \c rhs after some type conversion. 5990bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 6000bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \note 6010bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * In addition to being used for assignments, this function is used to 6020bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * type-check return values. 6030bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 604fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 605336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholtvalidate_assignment(struct _mesa_glsl_parse_state *state, 60685caea29c18fad89050ac366c558afef568dcb3fIan Romanick const glsl_type *lhs_type, ir_rvalue *rhs, 60785caea29c18fad89050ac366c558afef568dcb3fIan Romanick bool is_initializer) 6080bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick{ 6090bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* If there is already some error in the RHS, just return it. Anything 6100bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * else will lead to an avalanche of error message back to the user. 6110bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 612ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick if (rhs->type->is_error()) 6130bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return rhs; 6140bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 6150bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* If the types are identical, the assignment can trivially proceed. 6160bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 617ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick if (rhs->type == lhs_type) 6180bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return rhs; 6190bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 6200157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick /* If the array element types are the same and the size of the LHS is zero, 62185caea29c18fad89050ac366c558afef568dcb3fIan Romanick * the assignment is okay for initializers embedded in variable 62285caea29c18fad89050ac366c558afef568dcb3fIan Romanick * declarations. 6230157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * 6240157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * Note: Whole-array assignments are not permitted in GLSL 1.10, but this 6250157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * is handled by ir_dereference::is_lvalue. 6260157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick */ 62785caea29c18fad89050ac366c558afef568dcb3fIan Romanick if (is_initializer && lhs_type->is_array() && rhs->type->is_array() 6280157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick && (lhs_type->element_type() == rhs->type->element_type()) 6290157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick && (lhs_type->array_size() == 0)) { 6300157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick return rhs; 6310157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick } 6320157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 633336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt /* Check for implicit conversion in GLSL 1.20 */ 634336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt if (apply_implicit_conversion(lhs_type, rhs, state)) { 635ec53010c4d02e11171d3c782a41b70cad76788e8Ian Romanick if (rhs->type == lhs_type) 636336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt return rhs; 637336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt } 638336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt 6390bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return NULL; 6400bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick} 6410bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 64210a685218610e737e23d2d8a243ed6ff6613becdEric Anholtir_rvalue * 64310a685218610e737e23d2d8a243ed6ff6613becdEric Anholtdo_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, 64485caea29c18fad89050ac366c558afef568dcb3fIan Romanick ir_rvalue *lhs, ir_rvalue *rhs, bool is_initializer, 64510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt YYLTYPE lhs_loc) 64610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt{ 647953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 64810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt bool error_emitted = (lhs->type->is_error() || rhs->type->is_error()); 64910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 65010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt if (!error_emitted) { 651b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace if (lhs->variable_referenced() != NULL 652b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace && lhs->variable_referenced()->read_only) { 653b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace _mesa_glsl_error(&lhs_loc, state, 654b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace "assignment to read-only variable '%s'", 655b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace lhs->variable_referenced()->name); 656b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace error_emitted = true; 657b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace 658b66be7518ad57368b31b5d70a2bb4c0fe66aa988Chad Versace } else if (!lhs->is_lvalue()) { 65910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); 66010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = true; 66110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 66210eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke 66310eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke if (state->es_shader && lhs->type->is_array()) { 66410eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not " 66510eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke "allowed in GLSL ES 1.00."); 66610eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke error_emitted = true; 66710eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke } 66810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 66910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 67085caea29c18fad89050ac366c558afef568dcb3fIan Romanick ir_rvalue *new_rhs = 67185caea29c18fad89050ac366c558afef568dcb3fIan Romanick validate_assignment(state, lhs->type, rhs, is_initializer); 67210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt if (new_rhs == NULL) { 67310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt _mesa_glsl_error(& lhs_loc, state, "type mismatch"); 67410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } else { 67510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt rhs = new_rhs; 6760157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 6770157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick /* If the LHS array was not declared with a size, it takes it size from 6780157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * the RHS. If the LHS is an l-value and a whole array, it must be a 6790157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * dereference of a variable. Any other case would require that the LHS 6800157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick * is either not an l-value or not a whole array. 6810157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick */ 6820157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick if (lhs->type->array_size() == 0) { 6830157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick ir_dereference *const d = lhs->as_dereference(); 6840157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 6850157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick assert(d != NULL); 6860157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 68736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *const var = d->variable_referenced(); 6880157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 6890157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick assert(var != NULL); 6900157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick 69163f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick if (var->max_array_access >= unsigned(rhs->type->array_size())) { 69263f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick /* FINISHME: This should actually log the location of the RHS. */ 69363f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to " 69463f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick "previous access", 69563f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick var->max_array_access); 69663f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick } 69763f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick 698f38d15b80d4e4c8ecb7a76087cdc49835f0aa271Ian Romanick var->type = glsl_type::get_array_instance(lhs->type->element_type(), 6990157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick rhs->type->array_size()); 7009703ed05e684f4269cd8af27c94e9b6bf8781d85Eric Anholt d->type = var->type; 7010157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick } 70210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 70310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 7042731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt /* Most callers of do_assignment (assign, add_assign, pre_inc/dec, 7052731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * but not post_inc) need the converted assigned value as an rvalue 7062731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * to handle things like: 7072731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * 7082731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * i = j += 1; 7092731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * 7102731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * So we always just store the computed value being assigned to a 7112731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * temporary and return a deref of that temporary. If the rvalue 7122731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt * ends up not being used, the temp will get copy-propagated out. 7132731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt */ 7147e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp", 7157e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 716e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var); 717ae805922b7e3cdaf3aee26c3b799fe3608669bbaEric Anholt instructions->push_tail(var); 718e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt instructions->push_tail(new(ctx) ir_assignment(deref_var, 7191660a2954797e056caba319c5d6c70b0d4be22feCarl Worth rhs, 7201660a2954797e056caba319c5d6c70b0d4be22feCarl Worth NULL)); 721e33c10328caec29616a5433b1d1df9088f3a84dfEric Anholt deref_var = new(ctx) ir_dereference_variable(var); 7222731a739d047e4aadc1cab4bcf8c01c1cf8e86dbEric Anholt 7238e9ce2eb56a087c2544112700ae1abe3f96648ddIan Romanick if (!error_emitted) 7248e9ce2eb56a087c2544112700ae1abe3f96648ddIan Romanick instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var, NULL)); 72510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 7261660a2954797e056caba319c5d6c70b0d4be22feCarl Worth return new(ctx) ir_dereference_variable(var); 72710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt} 7280bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 729de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtstatic ir_rvalue * 730959a9ecdd8fbc3375e4149f2b44d253622ff12eeEric Anholtget_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue) 731de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt{ 732d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(lvalue); 733de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_variable *var; 734de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 7357e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp", 7367e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 73743b5b03d67ce890e867c81d4a5cfc4871d711d43Eric Anholt instructions->push_tail(var); 738de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var->mode = ir_var_auto; 739de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 7401660a2954797e056caba319c5d6c70b0d4be22feCarl Worth instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var), 7411660a2954797e056caba319c5d6c70b0d4be22feCarl Worth lvalue, NULL)); 742de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 743de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt /* Once we've created this temporary, mark it read only so it's no 744de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt * longer considered an lvalue. 745de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt */ 746de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var->read_only = true; 747de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 7481660a2954797e056caba319c5d6c70b0d4be22feCarl Worth return new(ctx) ir_dereference_variable(var); 749de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt} 750de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 751de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 752fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 7530044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_node::hir(exec_list *instructions, 75418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 75518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick{ 75618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (void) instructions; 75718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (void) state; 75818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 75918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick return NULL; 76018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick} 76118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 762b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholtstatic void 763b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholtmark_whole_array_access(ir_rvalue *access) 764b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt{ 765b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt ir_dereference_variable *deref = access->as_dereference_variable(); 766b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt 767b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt if (deref) { 768b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt deref->var->max_array_access = deref->type->length - 1; 769b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt } 770b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt} 771b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt 772ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholtstatic ir_rvalue * 773ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholtdo_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1) 774ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt{ 775ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt int join_op; 7766d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick ir_rvalue *cmp = NULL; 777ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 778ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt if (operation == ir_binop_all_equal) 779ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt join_op = ir_binop_logic_and; 780ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt else 781ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt join_op = ir_binop_logic_or; 782ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 783ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt switch (op0->type->base_type) { 784ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_FLOAT: 785ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_UINT: 786ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_INT: 787ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_BOOL: 788ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt return new(mem_ctx) ir_expression(operation, op0, op1); 789ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 790ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_ARRAY: { 791ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt for (unsigned int i = 0; i < op0->type->length; i++) { 792ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt ir_rvalue *e0, *e1, *result; 793ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 794ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL), 795ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt new(mem_ctx) ir_constant(i)); 796ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL), 797ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt new(mem_ctx) ir_constant(i)); 798ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt result = do_comparison(mem_ctx, operation, e0, e1); 799ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 8006d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick if (cmp) { 8016d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick cmp = new(mem_ctx) ir_expression(join_op, cmp, result); 802ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } else { 8036d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick cmp = result; 804ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 805ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 806b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt 807b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt mark_whole_array_access(op0); 808b4f585665c31b1f80d909e38b3b2a9fab0c03076Eric Anholt mark_whole_array_access(op1); 8096d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick break; 810ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 811ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 812ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_STRUCT: { 813ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt for (unsigned int i = 0; i < op0->type->length; i++) { 814ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt ir_rvalue *e0, *e1, *result; 815ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt const char *field_name = op0->type->fields.structure[i].name; 816ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 817ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL), 818ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt field_name); 819ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL), 820ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt field_name); 821ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt result = do_comparison(mem_ctx, operation, e0, e1); 822ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 8236d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick if (cmp) { 8246d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick cmp = new(mem_ctx) ir_expression(join_op, cmp, result); 825ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } else { 8266d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick cmp = result; 827ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 828ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 8296d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick break; 830ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 831ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt 832ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_ERROR: 833ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_VOID: 834ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt case GLSL_TYPE_SAMPLER: 835ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt /* I assume a comparison of a struct containing a sampler just 836ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt * ignores the sampler present in the type. 837ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt */ 8386d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick break; 8396d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick 8406d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick default: 8416d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick assert(!"Should not get here."); 8426d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick break; 843ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt } 844d56c97413ee65e40e3544b89ffca450df9ba1c06Eric Anholt 8456d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick if (cmp == NULL) 8466d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick cmp = new(mem_ctx) ir_constant(true); 8476d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick 8486d36be508ff0765beb6cf6bb95a323ff01e458ddIan Romanick return cmp; 849ff79633d9f930e396933a0ad9564824ec73ea4dcEric Anholt} 85018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 85101822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt/* For logical operations, we want to ensure that the operands are 85201822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt * scalar booleans. If it isn't, emit an error and return a constant 85301822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt * boolean to avoid triggering cascading error messages. 85401822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt */ 85501822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholtir_rvalue * 85601822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholtget_scalar_boolean_operand(exec_list *instructions, 85701822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt struct _mesa_glsl_parse_state *state, 85801822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt ast_expression *parent_expr, 85901822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt int operand, 86001822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt const char *operand_name, 86101822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt bool *error_emitted) 86201822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt{ 86301822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt ast_expression *expr = parent_expr->subexpressions[operand]; 86401822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt void *ctx = state; 86501822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt ir_rvalue *val = expr->hir(instructions, state); 86601822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt 86701822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt if (val->type->is_boolean() && val->type->is_scalar()) 86801822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt return val; 86901822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt 87001822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt if (!*error_emitted) { 87101822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt YYLTYPE loc = expr->get_location(); 87201822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt _mesa_glsl_error(&loc, state, "%s of `%s' must be scalar boolean", 87301822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt operand_name, 87401822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt parent_expr->operator_string(parent_expr->oper)); 87501822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt *error_emitted = true; 87601822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt } 87701822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt 87801822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt return new(ctx) ir_constant(true); 87901822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt} 88001822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt 881fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 8820044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression::hir(exec_list *instructions, 88318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 885953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick static const int operations[AST_NUM_OPERATORS] = { 887a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_assign doesn't convert to ir_expression. */ 888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_plus doesn't convert to ir_expression. */ 889a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 890a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 893a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 894a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 895a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 9014dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_all_equal, 9024dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_any_nequal, 903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 904a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 906a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 907a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 908a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 910a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 911a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 912a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Note: The following block of expression types actually convert 913a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to multiple IR instructions. 914a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, /* ast_mul_assign */ 916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, /* ast_div_assign */ 917a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, /* ast_mod_assign */ 918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, /* ast_add_assign */ 919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, /* ast_sub_assign */ 920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, /* ast_ls_assign */ 921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, /* ast_rs_assign */ 922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, /* ast_and_assign */ 923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, /* ast_xor_assign */ 924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, /* ast_or_assign */ 925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_conditional doesn't convert to ir_expression. */ 927de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_add, /* ast_pre_inc. */ 928de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_sub, /* ast_pre_dec. */ 929de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_add, /* ast_post_inc. */ 930de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_sub, /* ast_post_dec. */ 931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_field_selection doesn't conv to ir_expression. */ 932a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_array_index doesn't convert to ir_expression. */ 933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_function_call doesn't conv to ir_expression. */ 934a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_identifier doesn't convert to ir_expression. */ 935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_int_constant doesn't convert to ir_expression. */ 936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_uint_constant doesn't conv to ir_expression. */ 937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_float_constant doesn't conv to ir_expression. */ 938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_bool_constant doesn't conv to ir_expression. */ 939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_sequence doesn't convert to ir_expression. */ 940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick }; 941fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *result = NULL; 9421c325af4d6b907e0a47ab7f868a2a78f054f153fAras Pranckevicius ir_rvalue *op[3]; 94308ba9778dbf3326bdfc8ca8035b51412032748eaKenneth Graunke const struct glsl_type *type; /* a temporary variable for switch cases */ 944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool error_emitted = false; 945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick YYLTYPE loc; 946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 94718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick loc = this->get_location(); 948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 94918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick switch (this->oper) { 9506652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick case ast_assign: { 95118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 95218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 95485caea29c18fad89050ac366c558afef568dcb3fIan Romanick result = do_assignment(instructions, state, op[0], op[1], false, 95510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt this->subexpressions[0]->get_location()); 95610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = result->type->is_error(); 957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 9586652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick } 959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_plus: 96118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 963c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth type = unary_arithmetic_result_type(op[0]->type, state, & loc); 964c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth 965c24bcad9f88379ffba9e2f0ff92f22cdf60c2927Carl Worth error_emitted = type->is_error(); 966a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 967a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick result = op[0]; 968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_neg: 97118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 97365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt type = unary_arithmetic_result_type(op[0]->type, state, & loc); 974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 97565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt error_emitted = type->is_error(); 976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 9771660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], type, 9781660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], NULL); 979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_add: 982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sub: 983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mul: 984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_div: 98518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 98618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 988bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], 98918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (this->oper == ast_mul), 990a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt state, & loc); 991a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt error_emitted = type->is_error(); 992a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 9931660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], type, 9941660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 995a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mod: 99818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 99918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 100165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); 1002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 100318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick assert(operations[this->oper] == ir_binop_mod); 1004a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10051660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], type, 10061660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 100765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt error_emitted = type->is_error(); 1008a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1009a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_lshift: 1011a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_rshift: 10125c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace if (state->language_version < 130) { 10135c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace _mesa_glsl_error(&loc, state, "operator %s requires GLSL 1.30", 10145c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace operator_string(this->oper)); 10155c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace error_emitted = true; 10165c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace } 10175c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace 10185c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace op[0] = this->subexpressions[0]->hir(instructions, state); 10195c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace op[1] = this->subexpressions[1]->hir(instructions, state); 1020c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, 1021c0197ab0af94ed0f3b2d453fb1ee6589f15d8e9cChad Versace &loc); 10225c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace result = new(ctx) ir_expression(operations[this->oper], type, 10235c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace op[0], op[1]); 10245c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 10255c4c36f7f3842e287b303b1eca8d260c37e3580bChad Versace break; 1026a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1027a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_less: 1028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_greater: 1029a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_lequal: 1030a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_gequal: 103118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 103218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 1033a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 103465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt type = relational_result_type(op[0], op[1], state, & loc); 1035a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1036a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* The relational operators must either generate an error or result 1037a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * in a scalar boolean. See page 57 of the GLSL 1.50 spec. 1038a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1039a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick assert(type->is_error() 1040a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || ((type->base_type == GLSL_TYPE_BOOL) 1041cb36f8aaeeb09660843316270a781948f773d90bIan Romanick && type->is_scalar())); 1042a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10431660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], type, 10441660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 104565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt error_emitted = type->is_error(); 1046a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1047a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1048a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_nequal: 1049a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_equal: 10506e659caaa946339a2de3890a8bed091ccb65102aIan Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 10516e659caaa946339a2de3890a8bed091ccb65102aIan Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 10526e659caaa946339a2de3890a8bed091ccb65102aIan Romanick 10536e659caaa946339a2de3890a8bed091ccb65102aIan Romanick /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec: 10546e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * 10556e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * "The equality operators equal (==), and not equal (!=) 10566e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * operate on all types. They result in a scalar Boolean. If 10576e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * the operand types do not match, then there must be a 10586e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * conversion from Section 4.1.10 "Implicit Conversions" 10596e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * applied to one operand that can make them match, in which 10606e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * case this conversion is done." 10616e659caaa946339a2de3890a8bed091ccb65102aIan Romanick */ 1062bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if ((!apply_implicit_conversion(op[0]->type, op[1], state) 1063bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick && !apply_implicit_conversion(op[1]->type, op[0], state)) 1064212b0327b47033442842a7be3d7fb10e08e2bf66Ian Romanick || (op[0]->type != op[1]->type)) { 10656e659caaa946339a2de3890a8bed091ccb65102aIan Romanick _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " 10666e659caaa946339a2de3890a8bed091ccb65102aIan Romanick "type", (this->oper == ast_equal) ? "==" : "!="); 10676e659caaa946339a2de3890a8bed091ccb65102aIan Romanick error_emitted = true; 1068a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick } else if ((state->language_version <= 110) 1069a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick && (op[0]->type->is_array() || op[1]->type->is_array())) { 1070a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick _mesa_glsl_error(& loc, state, "array comparisons forbidden in " 1071a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick "GLSL 1.10"); 1072a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick error_emitted = true; 10736e659caaa946339a2de3890a8bed091ccb65102aIan Romanick } 10746e659caaa946339a2de3890a8bed091ccb65102aIan Romanick 1075175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt if (error_emitted) { 1076175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt result = new(ctx) ir_constant(false); 1077175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt } else { 1078175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt result = do_comparison(ctx, operations[this->oper], op[0], op[1]); 1079175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt assert(result->type == glsl_type::bool_type); 1080175829f1a8ab0df7594131cc569462e45c1974ecEric Anholt } 1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_and: 1084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_xor: 1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_or: 10861eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke op[0] = this->subexpressions[0]->hir(instructions, state); 10871eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke op[1] = this->subexpressions[1]->hir(instructions, state); 1088cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, 1089cfdbf8bc8497b29fbdd9fa7bd00da554aecb5962Chad Versace state, &loc); 10901eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke result = new(ctx) ir_expression(operations[this->oper], type, 10911eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke op[0], op[1]); 10921eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 10931eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke break; 10941eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke 1095a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_not: 10961eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke op[0] = this->subexpressions[0]->hir(instructions, state); 10971eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke 10981eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke if (state->language_version < 130) { 10991eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke _mesa_glsl_error(&loc, state, "bit-wise operations require GLSL 1.30"); 11001eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke error_emitted = true; 11011eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke } 11021eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke 11031eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke if (!op[0]->type->is_integer()) { 11041eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke _mesa_glsl_error(&loc, state, "operand of `~' must be an integer"); 11051eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke error_emitted = true; 11061eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke } 11071eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke 11081eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke type = op[0]->type; 11091eea96326fa652029e3898e104c715e5464f11e4Kenneth Graunke result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL); 1110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11124950a68bf22ede6f4f368c9783e5401816159574Eric Anholt case ast_logic_and: { 11137ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt exec_list rhs_instructions; 111401822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt op[0] = get_scalar_boolean_operand(instructions, state, this, 0, 111501822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt "LHS", &error_emitted); 11167ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, 11177ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt "RHS", &error_emitted); 1118b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt 111944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_constant *op0_const = op[0]->constant_expression_value(); 112044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt if (op0_const) { 112144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt if (op0_const->value.b[0]) { 11227ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt instructions->append_list(&rhs_instructions); 11237ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt result = op[1]; 112444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } else { 112544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt result = op0_const; 112644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } 112744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt type = glsl_type::bool_type; 112844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } else { 112981d664f099a5fd5fac777480532fb4307d591451Ian Romanick ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, 11307e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick "and_tmp", 11317e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 113281d664f099a5fd5fac777480532fb4307d591451Ian Romanick instructions->push_tail(tmp); 113381d664f099a5fd5fac777480532fb4307d591451Ian Romanick 11341660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_if *const stmt = new(ctx) ir_if(op[0]); 113544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt instructions->push_tail(stmt); 11364950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11377ec0c9789669ac88fcdd66c562e6d58281b477ceEric Anholt stmt->then_instructions.append_list(&rhs_instructions); 11381660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); 113944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_assignment *const then_assign = 11401660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(then_deref, op[1], NULL); 114144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt stmt->then_instructions.push_tail(then_assign); 11424950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11431660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); 114444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_assignment *const else_assign = 11451660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false), NULL); 114644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt stmt->else_instructions.push_tail(else_assign); 11474950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11481660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_dereference_variable(tmp); 114944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt type = tmp->type; 115044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } 11514950a68bf22ede6f4f368c9783e5401816159574Eric Anholt break; 11524950a68bf22ede6f4f368c9783e5401816159574Eric Anholt } 11534950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11544950a68bf22ede6f4f368c9783e5401816159574Eric Anholt case ast_logic_or: { 11559e04b190b5f59c5b375645f5756a6edd98a7f90cEric Anholt exec_list rhs_instructions; 115601822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt op[0] = get_scalar_boolean_operand(instructions, state, this, 0, 115701822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt "LHS", &error_emitted); 11589e04b190b5f59c5b375645f5756a6edd98a7f90cEric Anholt op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1, 11599e04b190b5f59c5b375645f5756a6edd98a7f90cEric Anholt "RHS", &error_emitted); 11604950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 116144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_constant *op0_const = op[0]->constant_expression_value(); 116244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt if (op0_const) { 116344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt if (op0_const->value.b[0]) { 116444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt result = op0_const; 116544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } else { 11669e04b190b5f59c5b375645f5756a6edd98a7f90cEric Anholt result = op[1]; 116744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } 116844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt type = glsl_type::bool_type; 116944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } else { 1170dfd30ca6a95a7d95835dad78ffe1fba4d1f4ef69Kenneth Graunke ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type, 11717e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick "or_tmp", 11727e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary); 11730b9ae3befb0bf80e000b159fd44c961a144f9c36Ian Romanick instructions->push_tail(tmp); 11744950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 117581d664f099a5fd5fac777480532fb4307d591451Ian Romanick ir_if *const stmt = new(ctx) ir_if(op[0]); 117681d664f099a5fd5fac777480532fb4307d591451Ian Romanick instructions->push_tail(stmt); 117781d664f099a5fd5fac777480532fb4307d591451Ian Romanick 11781660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp); 117944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_assignment *const then_assign = 11801660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true), NULL); 118144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt stmt->then_instructions.push_tail(then_assign); 11824950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11839e04b190b5f59c5b375645f5756a6edd98a7f90cEric Anholt stmt->else_instructions.append_list(&rhs_instructions); 11841660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp); 118544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt ir_assignment *const else_assign = 11861660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(else_deref, op[1], NULL); 118744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt stmt->else_instructions.push_tail(else_assign); 11884950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11891660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_dereference_variable(tmp); 119044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt type = tmp->type; 119144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt } 11924950a68bf22ede6f4f368c9783e5401816159574Eric Anholt break; 11934950a68bf22ede6f4f368c9783e5401816159574Eric Anholt } 11944950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 11954950a68bf22ede6f4f368c9783e5401816159574Eric Anholt case ast_logic_xor: 1196756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: 1197756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt * 1198756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt * "The logical binary operators and (&&), or ( | | ), and 1199756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt * exclusive or (^^). They operate only on two Boolean 1200756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt * expressions and result in a Boolean expression." 1201756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt */ 1202756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt op[0] = get_scalar_boolean_operand(instructions, state, this, 0, "LHS", 1203756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt &error_emitted); 1204756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt op[1] = get_scalar_boolean_operand(instructions, state, this, 1, "RHS", 1205756c262756b2434efeb2c2a33a180fda0757a6e5Eric Anholt &error_emitted); 12064950a68bf22ede6f4f368c9783e5401816159574Eric Anholt 12071660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, 12081660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 1209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1211a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt case ast_logic_not: 121201822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt op[0] = get_scalar_boolean_operand(instructions, state, this, 0, 121301822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt "operand", &error_emitted); 1214a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt 12151660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type, 12161660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], NULL); 1217a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt break; 1218a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt 1219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mul_assign: 1220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_div_assign: 1221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_add_assign: 1222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sub_assign: { 122318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 122418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 1225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1226bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], 122718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (this->oper == ast_mul_assign), 1228a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt state, & loc); 1229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12301660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type, 12311660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 1232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12333e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt result = do_assignment(instructions, state, 123485caea29c18fad89050ac366c558afef568dcb3fIan Romanick op[0]->clone(ctx, NULL), temp_rhs, false, 123510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt this->subexpressions[0]->get_location()); 123610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = (op[0]->type->is_error()); 1237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* GLSL 1.10 does not allow array assignment. However, we don't have to 1239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * explicitly test for this because none of the binary expression 1240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operators allow array operands either. 1241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 124648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt case ast_mod_assign: { 124748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 124848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt op[1] = this->subexpressions[1]->hir(instructions, state); 124948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 125065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt type = modulus_result_type(op[0]->type, op[1]->type, state, & loc); 125148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 125248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt assert(operations[this->oper] == ir_binop_mod); 125348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 1254768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick ir_rvalue *temp_rhs; 12551660a2954797e056caba319c5d6c70b0d4be22feCarl Worth temp_rhs = new(ctx) ir_expression(operations[this->oper], type, 12561660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 125748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 12583e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt result = do_assignment(instructions, state, 125985caea29c18fad89050ac366c558afef568dcb3fIan Romanick op[0]->clone(ctx, NULL), temp_rhs, false, 126048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt this->subexpressions[0]->get_location()); 126165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt error_emitted = type->is_error(); 126248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt break; 126348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt } 1264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_ls_assign: 1266338ed6ec297d76746b6466c26c307722af965e60Chad Versace case ast_rs_assign: { 1267338ed6ec297d76746b6466c26c307722af965e60Chad Versace op[0] = this->subexpressions[0]->hir(instructions, state); 1268338ed6ec297d76746b6466c26c307722af965e60Chad Versace op[1] = this->subexpressions[1]->hir(instructions, state); 1269338ed6ec297d76746b6466c26c307722af965e60Chad Versace type = shift_result_type(op[0]->type, op[1]->type, this->oper, state, 1270338ed6ec297d76746b6466c26c307722af965e60Chad Versace &loc); 1271338ed6ec297d76746b6466c26c307722af965e60Chad Versace ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], 1272338ed6ec297d76746b6466c26c307722af965e60Chad Versace type, op[0], op[1]); 1273338ed6ec297d76746b6466c26c307722af965e60Chad Versace result = do_assignment(instructions, state, op[0]->clone(ctx, NULL), 127485caea29c18fad89050ac366c558afef568dcb3fIan Romanick temp_rhs, false, 1275338ed6ec297d76746b6466c26c307722af965e60Chad Versace this->subexpressions[0]->get_location()); 1276338ed6ec297d76746b6466c26c307722af965e60Chad Versace error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 1277251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 1278338ed6ec297d76746b6466c26c307722af965e60Chad Versace } 1279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_and_assign: 1281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_xor_assign: 1282d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace case ast_or_assign: { 1283d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace op[0] = this->subexpressions[0]->hir(instructions, state); 1284d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace op[1] = this->subexpressions[1]->hir(instructions, state); 1285d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper, 1286d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace state, &loc); 1287d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], 1288d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace type, op[0], op[1]); 1289d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace result = do_assignment(instructions, state, op[0]->clone(ctx, NULL), 129085caea29c18fad89050ac366c558afef568dcb3fIan Romanick temp_rhs, false, 1291d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace this->subexpressions[0]->get_location()); 1292d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 1293251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 1294d03ac0f8d81fd3032d271586d936f14b7d9201d5Chad Versace } 1295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 129696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick case ast_conditional: { 129796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: 129896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * 129996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * "The ternary selection operator (?:). It operates on three 130096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * expressions (exp1 ? exp2 : exp3). This operator evaluates the 130196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * first expression, which must result in a scalar Boolean." 130296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 130301822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt op[0] = get_scalar_boolean_operand(instructions, state, this, 0, 130401822706ec2c2501a2cd2431a90c56b334b79a5cEric Anholt "condition", &error_emitted); 130596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 130696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* The :? operator is implemented by generating an anonymous temporary 130796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * followed by an if-statement. The last instruction in each branch of 130896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * the if-statement assigns a value to the anonymous temporary. This 130996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * temporary is the r-value of the expression. 131096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 13110ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick exec_list then_instructions; 13120ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick exec_list else_instructions; 131396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 13140ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick op[1] = this->subexpressions[1]->hir(&then_instructions, state); 13150ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick op[2] = this->subexpressions[2]->hir(&else_instructions, state); 131696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 131796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: 131896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * 131996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * "The second and third expressions can be any type, as 132096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * long their types match, or there is a conversion in 132196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * Section 4.1.10 "Implicit Conversions" that can be applied 132296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * to one of the expressions to make their types match. This 132396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * resulting matching type is the type of the entire 132496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * expression." 132596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 1326bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if ((!apply_implicit_conversion(op[1]->type, op[2], state) 1327bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick && !apply_implicit_conversion(op[2]->type, op[1], state)) 1328db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick || (op[1]->type != op[2]->type)) { 132996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick YYLTYPE loc = this->subexpressions[1]->get_location(); 133096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 133196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick _mesa_glsl_error(& loc, state, "Second and third operands of ?: " 133296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick "operator must have matching types."); 133396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick error_emitted = true; 13340ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick type = glsl_type::error_type; 1335db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick } else { 13360ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick type = op[1]->type; 133796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick } 133896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 1339f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec: 1340f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick * 1341f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick * "The second and third expressions must be the same type, but can 1342f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick * be of any type other than an array." 1343f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick */ 1344f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick if ((state->language_version <= 110) && type->is_array()) { 1345f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick _mesa_glsl_error(& loc, state, "Second and third operands of ?: " 1346f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick "operator must not be arrays."); 1347f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick error_emitted = true; 1348f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick } 1349f09fabc448c0781f0cf9160565e1b0bab59a16e5Ian Romanick 13507825d3d15710fdfcfc503754862963aac8065480Ian Romanick ir_constant *cond_val = op[0]->constant_expression_value(); 13517825d3d15710fdfcfc503754862963aac8065480Ian Romanick ir_constant *then_val = op[1]->constant_expression_value(); 13527825d3d15710fdfcfc503754862963aac8065480Ian Romanick ir_constant *else_val = op[2]->constant_expression_value(); 13537825d3d15710fdfcfc503754862963aac8065480Ian Romanick 13547825d3d15710fdfcfc503754862963aac8065480Ian Romanick if (then_instructions.is_empty() 13557825d3d15710fdfcfc503754862963aac8065480Ian Romanick && else_instructions.is_empty() 13567825d3d15710fdfcfc503754862963aac8065480Ian Romanick && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) { 13577825d3d15710fdfcfc503754862963aac8065480Ian Romanick result = (cond_val->value.b[0]) ? then_val : else_val; 13587825d3d15710fdfcfc503754862963aac8065480Ian Romanick } else { 13597e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable *const tmp = 13607e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary); 13610b9ae3befb0bf80e000b159fd44c961a144f9c36Ian Romanick instructions->push_tail(tmp); 13620ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick 13631660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_if *const stmt = new(ctx) ir_if(op[0]); 13647825d3d15710fdfcfc503754862963aac8065480Ian Romanick instructions->push_tail(stmt); 13650ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick 13667825d3d15710fdfcfc503754862963aac8065480Ian Romanick then_instructions.move_nodes_to(& stmt->then_instructions); 13671660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const then_deref = 13681660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_dereference_variable(tmp); 13697825d3d15710fdfcfc503754862963aac8065480Ian Romanick ir_assignment *const then_assign = 13701660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(then_deref, op[1], NULL); 13717825d3d15710fdfcfc503754862963aac8065480Ian Romanick stmt->then_instructions.push_tail(then_assign); 13720ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick 13737825d3d15710fdfcfc503754862963aac8065480Ian Romanick else_instructions.move_nodes_to(& stmt->else_instructions); 13741660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_dereference *const else_deref = 13751660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_dereference_variable(tmp); 13767825d3d15710fdfcfc503754862963aac8065480Ian Romanick ir_assignment *const else_assign = 13771660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_assignment(else_deref, op[2], NULL); 13787825d3d15710fdfcfc503754862963aac8065480Ian Romanick stmt->else_instructions.push_tail(else_assign); 13790ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick 13801660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_dereference_variable(tmp); 13817825d3d15710fdfcfc503754862963aac8065480Ian Romanick } 1382251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 138396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick } 1384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_pre_inc: 138676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt case ast_pre_dec: { 138776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 138876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt if (op[0]->type->base_type == GLSL_TYPE_FLOAT) 13891660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[1] = new(ctx) ir_constant(1.0f); 139076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt else 13911660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[1] = new(ctx) ir_constant(1); 139276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 1393a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt type = arithmetic_result_type(op[0], op[1], false, state, & loc); 139476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 1395768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick ir_rvalue *temp_rhs; 13961660a2954797e056caba319c5d6c70b0d4be22feCarl Worth temp_rhs = new(ctx) ir_expression(operations[this->oper], type, 13971660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 139876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 13993e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt result = do_assignment(instructions, state, 140085caea29c18fad89050ac366c558afef568dcb3fIan Romanick op[0]->clone(ctx, NULL), temp_rhs, false, 140176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt this->subexpressions[0]->get_location()); 140276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt error_emitted = op[0]->type->is_error(); 140376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt break; 140476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt } 1405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_post_inc: 1407de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt case ast_post_dec: { 1408de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 1409de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt if (op[0]->type->base_type == GLSL_TYPE_FLOAT) 14101660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[1] = new(ctx) ir_constant(1.0f); 1411de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt else 14121660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[1] = new(ctx) ir_constant(1); 1413de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 1414de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 1415de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 1416a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt type = arithmetic_result_type(op[0], op[1], false, state, & loc); 1417de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 1418768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick ir_rvalue *temp_rhs; 14191660a2954797e056caba319c5d6c70b0d4be22feCarl Worth temp_rhs = new(ctx) ir_expression(operations[this->oper], type, 14201660a2954797e056caba319c5d6c70b0d4be22feCarl Worth op[0], op[1]); 1421de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 1422de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt /* Get a temporary of a copy of the lvalue before it's modified. 1423de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt * This may get thrown away later. 1424de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt */ 14258273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL)); 1426de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 14273e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt (void)do_assignment(instructions, state, 142885caea29c18fad89050ac366c558afef568dcb3fIan Romanick op[0]->clone(ctx, NULL), temp_rhs, false, 1429de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt this->subexpressions[0]->get_location()); 1430de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 1431de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt error_emitted = op[0]->type->is_error(); 1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1433de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt } 1434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_field_selection: 143618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = _mesa_ast_field_selection_to_hir(this, instructions, state); 1437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 143927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick case ast_array_index: { 144027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick YYLTYPE index_loc = subexpressions[1]->get_location(); 144127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 144227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick op[0] = subexpressions[0]->hir(instructions, state); 144327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick op[1] = subexpressions[1]->hir(instructions, state); 144427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 144527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 144627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 1447a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick ir_rvalue *const array = op[0]; 1448b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 14491660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_dereference_array(op[0], op[1]); 1450b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 1451b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /* Do not use op[0] after this point. Use array. 1452b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 1453b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick op[0] = NULL; 1454b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 145527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 145627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick if (error_emitted) 145727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick break; 145827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 145963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (!array->type->is_array() 146063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick && !array->type->is_matrix() 146163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick && !array->type->is_vector()) { 146227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick _mesa_glsl_error(& index_loc, state, 146363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick "cannot dereference non-array / non-matrix / " 146463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick "non-vector"); 146527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick error_emitted = true; 146627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 146727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 146827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick if (!op[1]->type->is_integer()) { 146927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick _mesa_glsl_error(& index_loc, state, 147027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick "array index must be integer type"); 147127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick error_emitted = true; 147227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } else if (!op[1]->type->is_scalar()) { 147327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick _mesa_glsl_error(& index_loc, state, 147427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick "array index must be scalar"); 147527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick error_emitted = true; 147627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 147727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 147827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick /* If the array index is a constant expression and the array has a 147927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * declared size, ensure that the access is in-bounds. If the array 148027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * index is not a constant expression, ensure that the array has a 148127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * declared size. 148227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick */ 148327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick ir_constant *const const_index = op[1]->constant_expression_value(); 148427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick if (const_index != NULL) { 148527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick const int idx = const_index->value.i[0]; 148663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick const char *type_name; 148763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick unsigned bound = 0; 148863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick 148963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (array->type->is_matrix()) { 149063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick type_name = "matrix"; 149163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } else if (array->type->is_vector()) { 149263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick type_name = "vector"; 149363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } else { 149463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick type_name = "array"; 149563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } 149627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 149727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec: 149827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * 149927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * "It is illegal to declare an array with a size, and then 150027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * later (in the same shader) index the same array with an 150127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * integral constant expression greater than or equal to the 150227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * declared size. It is also illegal to index an array with a 150327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick * negative constant expression." 150427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick */ 150563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (array->type->is_matrix()) { 150663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (array->type->row_type()->vector_elements <= idx) { 150763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick bound = array->type->row_type()->vector_elements; 150863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } 150963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } else if (array->type->is_vector()) { 151063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (array->type->vector_elements <= idx) { 151163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick bound = array->type->vector_elements; 151263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } 151363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } else { 151463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if ((array->type->array_size() > 0) 151563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick && (array->type->array_size() <= idx)) { 151663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick bound = array->type->array_size(); 151763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } 151827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 151927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 152063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (bound > 0) { 152163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick _mesa_glsl_error(& loc, state, "%s index must be < %u", 152263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick type_name, bound); 152363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick error_emitted = true; 152463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } else if (idx < 0) { 152563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick _mesa_glsl_error(& loc, state, "%s index must be >= 0", 152663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick type_name); 152727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick error_emitted = true; 152827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 1529b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 153063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if (array->type->is_array()) { 1531a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick /* If the array is a variable dereference, it dereferences the 1532a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick * whole array, by definition. Use this to get the variable. 1533a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick * 1534a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick * FINISHME: Should some methods for getting / setting / testing 1535a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick * FINISHME: array access limits be added to ir_dereference? 1536a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick */ 1537a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick ir_variable *const v = array->whole_variable_referenced(); 153863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick if ((v != NULL) && (unsigned(idx) > v->max_array_access)) 153963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick v->max_array_access = idx; 154063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick } 15412b7c42b40ae459f7b290eb134d6dabd075aab9f0Kenneth Graunke } else if (array->type->array_size() == 0) { 15422b7c42b40ae459f7b290eb134d6dabd075aab9f0Kenneth Graunke _mesa_glsl_error(&loc, state, "unsized array index must be constant"); 1543a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt } else { 1544a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt if (array->type->is_array()) { 15455226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius /* whole_variable_referenced can return NULL if the array is a 15465226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius * member of a structure. In this case it is safe to not update 15475226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius * the max_array_access field because it is never used for fields 15485226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius * of structures. 15495226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius */ 1550a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt ir_variable *v = array->whole_variable_referenced(); 15515226f8c7b0025031e8540adc93ecfe0b36b8f90fAras Pranckevicius if (v != NULL) 15520d9d036004f135c38990c60f46074b70cff6e663Ian Romanick v->max_array_access = array->type->array_size() - 1; 1553a721abfbd1724e83381b46fc670bb38fbde76f69Eric Anholt } 155427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 155527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 1556e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick /* From page 23 (29 of the PDF) of the GLSL 1.30 spec: 1557e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * 1558f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace * "Samplers aggregated into arrays within a shader (using square 1559f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace * brackets [ ]) can only be indexed with integral constant 1560f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace * expressions [...]." 1561e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * 1562e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * This restriction was added in GLSL 1.30. Shaders using earlier version 1563e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * of the language should not be rejected by the compiler front-end for 1564e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * using this construct. This allows useful things such as using a loop 1565e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * counter as the index to an array of samplers. If the loop in unrolled, 1566e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick * the code should compile correctly. Instead, emit a warning. 1567f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace */ 1568f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace if (array->type->is_array() && 1569f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace array->type->element_type()->is_sampler() && 1570f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace const_index == NULL) { 1571f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace 1572e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick if (state->language_version == 100) { 1573e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick _mesa_glsl_warning(&loc, state, 1574e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "sampler arrays indexed with non-constant " 1575e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "expressions is optional in GLSL ES 1.00"); 1576e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick } else if (state->language_version < 130) { 1577e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick _mesa_glsl_warning(&loc, state, 1578e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "sampler arrays indexed with non-constant " 1579e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "expressions is forbidden in GLSL 1.30 and " 1580e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "later"); 1581e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick } else { 1582e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick _mesa_glsl_error(&loc, state, 1583e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "sampler arrays indexed with non-constant " 1584e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "expressions is forbidden in GLSL 1.30 and " 1585e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick "later"); 1586e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick error_emitted = true; 1587e942f328365309a1d8240cfe8eb5d88391015f37Ian Romanick } 1588f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace } 1589f0f2ec4d8a50c79c2943ac95eb790fb734d88980Chad Versace 159027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick if (error_emitted) 159127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick result->type = glsl_type::error_type; 159227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick 1593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 159427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick } 1595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_function_call: 15977cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* Should *NEVER* get here. ast_function_call should always be handled 15987cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * by ast_function_expression::hir. 1599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 16007cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick assert(0); 1601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_identifier: { 1604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* ast_identifier can appear several places in a full abstract syntax 1605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * tree. This particular use must be at location specified in the grammar 1606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * as 'variable_identifier'. 1607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 16088bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick ir_variable *var = 16098bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->get_variable(this->primary_expression.identifier); 1610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 16111660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_dereference_variable(var); 1612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (var != NULL) { 1614bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick var->used = true; 1615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 161671d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick _mesa_glsl_error(& loc, state, "`%s' undeclared", 161718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick this->primary_expression.identifier); 1618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick error_emitted = true; 1620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_int_constant: 16251660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_constant(this->primary_expression.int_constant); 1626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_uint_constant: 16291660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_constant(this->primary_expression.uint_constant); 1630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_float_constant: 16331660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_constant(this->primary_expression.float_constant); 1634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1636a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bool_constant: 16371660a2954797e056caba319c5d6c70b0d4be22feCarl Worth result = new(ctx) ir_constant(bool(this->primary_expression.bool_constant)); 1638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sequence: { 1641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* It should not be possible to generate a sequence in the AST without 1642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * any expressions in it. 1643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1644304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick assert(!this->expressions.is_empty()); 1645a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* The r-value of a sequence is the last expression in the sequence. If 1647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the other expressions in the sequence do not have side-effects (and 1648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * therefore add instructions to the instruction list), they get dropped 1649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * on the floor. 1650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 16513d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick exec_node *previous_tail_pred = NULL; 16523d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick YYLTYPE previous_operand_loc = loc; 16533d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick 16543d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick foreach_list_typed (ast_node, ast, link, &this->expressions) { 16553d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick /* If one of the operands of comma operator does not generate any 16563d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * code, we want to emit a warning. At each pass through the loop 16573d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * previous_tail_pred will point to the last instruction in the 16583d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * stream *before* processing the previous operand. Naturally, 16593d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * instructions->tail_pred will point to the last instruction in the 16603d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * stream *after* processing the previous operand. If the two 16613d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * pointers match, then the previous operand had no effect. 16623d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * 16633d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * The warning behavior here differs slightly from GCC. GCC will 16643d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * only emit a warning if none of the left-hand operands have an 16653d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * effect. However, it will emit a warning for each. I believe that 16663d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * there are some cases in C (especially with GCC extensions) where 16673d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * it is useful to have an intermediate step in a sequence have no 16683d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * effect, but I don't think these cases exist in GLSL. Either way, 16693d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * it would be a giant hassle to replicate that behavior. 16703d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick */ 16713d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick if (previous_tail_pred == instructions->tail_pred) { 16723d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick _mesa_glsl_warning(&previous_operand_loc, state, 16733d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick "left-hand operand of comma expression has " 16743d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick "no effect"); 16753d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick } 16763d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick 16773d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick /* tail_pred is directly accessed instead of using the get_tail() 16783d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * method for performance reasons. get_tail() has extra code to 16793d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * return NULL when the list is empty. We don't care about that 16803d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick * here, so using tail_pred directly is fine. 16813d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick */ 16823d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick previous_tail_pred = instructions->tail_pred; 16833d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick previous_operand_loc = ast->get_location(); 16843d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick 1685304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick result = ast->hir(instructions, state); 16863d5cfcfed16c5a79bdf67027afe4ea8058b899cbIan Romanick } 1687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Any errors should have already been emitted in the loop above. 1689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick error_emitted = true; 1691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 169408ba9778dbf3326bdfc8ca8035b51412032748eaKenneth Graunke type = NULL; /* use result->type, not type. */ 169508ba9778dbf3326bdfc8ca8035b51412032748eaKenneth Graunke assert(result != NULL); 1696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 169708ba9778dbf3326bdfc8ca8035b51412032748eaKenneth Graunke if (result->type->is_error() && !error_emitted) 169871d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick _mesa_glsl_error(& loc, state, "type mismatch"); 1699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return result; 1701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1704fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 17050044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression_statement::hir(exec_list *instructions, 170618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 1707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1708a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* It is possible to have expression statements that don't have an 1709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * expression. This is the solitary semicolon: 1710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * for (i = 0; i < 5; i++) 1712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * ; 1713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * In this case the expression will be NULL. Test for NULL and don't do 1715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * anything in that case. 1716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 171718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (expression != NULL) 171818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick expression->hir(instructions, state); 1719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1720a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Statements do not have r-values. 1721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1722a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 1723a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1724a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1726fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 17270044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_compound_statement::hir(exec_list *instructions, 172818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 1729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 173018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (new_scope) 17318bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->push_scope(); 1732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 17332b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_node, ast, link, &this->statements) 1734304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->hir(instructions, state); 1735a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 173618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (new_scope) 17378bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->pop_scope(); 1738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Compound statements do not have r-values. 1740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 1742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 174528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanickstatic const glsl_type * 1746d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunkeprocess_array_type(YYLTYPE *loc, const glsl_type *base, ast_node *array_size, 174728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick struct _mesa_glsl_parse_state *state) 174828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick{ 174928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick unsigned length = 0; 175028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 175128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick /* FINISHME: Reject delcarations of multidimensional arrays. */ 175228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 175328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick if (array_size != NULL) { 175428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick exec_list dummy_instructions; 175528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick ir_rvalue *const ir = array_size->hir(& dummy_instructions, state); 175628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick YYLTYPE loc = array_size->get_location(); 175728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 175828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick /* FINISHME: Verify that the grammar forbids side-effects in array 175928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick * FINISHME: sizes. i.e., 'vec4 [x = 12] data' 176028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick */ 176128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick assert(dummy_instructions.is_empty()); 176228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 176328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick if (ir != NULL) { 176428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick if (!ir->type->is_integer()) { 176528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick _mesa_glsl_error(& loc, state, "array size must be integer type"); 176628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } else if (!ir->type->is_scalar()) { 176728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick _mesa_glsl_error(& loc, state, "array size must be scalar type"); 176828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } else { 176928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick ir_constant *const size = ir->constant_expression_value(); 177028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 177128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick if (size == NULL) { 177228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick _mesa_glsl_error(& loc, state, "array size must be a " 177328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick "constant valued expression"); 177428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } else if (size->value.i[0] <= 0) { 177528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick _mesa_glsl_error(& loc, state, "array size must be > 0"); 177628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } else { 177728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick assert(size->type == ir->type); 177828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick length = size->value.u[0]; 177928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } 178028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } 178128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } 1782d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke } else if (state->es_shader) { 1783d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke /* Section 10.17 of the GLSL ES 1.00 specification states that unsized 1784d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke * array declarations have been removed from the language. 1785d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke */ 1786d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke _mesa_glsl_error(loc, state, "unsized array declarations are not " 1787d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke "allowed in GLSL ES 1.00."); 178828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick } 178928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 1790f38d15b80d4e4c8ecb7a76087cdc49835f0aa271Ian Romanick return glsl_type::get_array_instance(base, length); 179128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick} 179228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 179328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick 1794d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickconst glsl_type * 1795d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickast_type_specifier::glsl_type(const char **name, 1796d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick struct _mesa_glsl_parse_state *state) const 1797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1798d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick const struct glsl_type *type; 1799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1800ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke type = state->symbols->get_type(this->type_name); 1801ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke *name = this->type_name; 1802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1803ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke if (this->is_array) { 1804ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke YYLTYPE loc = this->get_location(); 1805ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke type = process_array_type(&loc, type, this->array_size, state); 1806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type; 1809a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1812a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 1813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickapply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, 1814768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick ir_variable *var, 18152e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt struct _mesa_glsl_parse_state *state, 18162e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt YYLTYPE *loc) 1817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1818bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick if (qual->flags.q.invariant) { 1819bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick if (var->used) { 1820bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick _mesa_glsl_error(loc, state, 1821bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick "variable `%s' may not be redeclared " 1822bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick "`invariant' after being used", 1823bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick var->name); 1824bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick } else { 1825bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick var->invariant = 1; 1826bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick } 1827bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick } 1828a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1829e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.constant || qual->flags.q.attribute 1830e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick || qual->flags.q.uniform 1831e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick || (qual->flags.q.varying && (state->target == fragment_shader))) 1832a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->read_only = 1; 1833a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1834e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.centroid) 1835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->centroid = 1; 1836a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1837e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.attribute && state->target != vertex_shader) { 18382e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt var->type = glsl_type::error_type; 18392e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt _mesa_glsl_error(loc, state, 18402e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt "`attribute' variables may not be declared in the " 1841ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick "%s shader", 1842ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick _mesa_glsl_shader_target_name(state->target)); 18432e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt } 18442e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt 184590b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec: 184690b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt * 184790b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt * "The varying qualifier can be used only with the data types 184890b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt * float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of 184990b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt * these." 185090b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt */ 1851e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.varying) { 18520ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt const glsl_type *non_array_type; 18530ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt 18540ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt if (var->type && var->type->is_array()) 18550ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt non_array_type = var->type->fields.array; 18560ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt else 18570ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt non_array_type = var->type; 18580ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt 18590ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) { 18600ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt var->type = glsl_type::error_type; 18610ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt _mesa_glsl_error(loc, state, 18620ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt "varying variables must be of base type float"); 18630ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt } 186490b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt } 186590b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt 18667e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick /* If there is no qualifier that changes the mode of the variable, leave 18677e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick * the setting alone. 18687e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick */ 1869e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.in && qual->flags.q.out) 1870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_inout; 1871e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick else if (qual->flags.q.attribute || qual->flags.q.in 1872e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick || (qual->flags.q.varying && (state->target == fragment_shader))) 1873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_in; 1874e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick else if (qual->flags.q.out 1875e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick || (qual->flags.q.varying && (state->target == vertex_shader))) 1876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_out; 1877e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick else if (qual->flags.q.uniform) 1878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_uniform; 1879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 188086b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick if (state->all_invariant && (state->current_function == NULL)) { 188186b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick switch (state->target) { 188286b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick case vertex_shader: 188386b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick if (var->mode == ir_var_out) 188486b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick var->invariant = true; 188586b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick break; 188686b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick case geometry_shader: 188786b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick if ((var->mode == ir_var_in) || (var->mode == ir_var_out)) 188886b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick var->invariant = true; 188986b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick break; 189086b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick case fragment_shader: 189186b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick if (var->mode == ir_var_in) 189286b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick var->invariant = true; 189386b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick break; 189486b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick } 189586b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick } 189686b4398cd158024f6be9fa830554a11c2a7ebe0cIan Romanick 1897e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (qual->flags.q.flat) 1898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_flat; 1899e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick else if (qual->flags.q.noperspective) 1900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_noperspective; 1901a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else 1902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_smooth; 19039d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 1904e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick var->pixel_center_integer = qual->flags.q.pixel_center_integer; 1905e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick var->origin_upper_left = qual->flags.q.origin_upper_left; 1906e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer) 19078d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick && (strcmp(var->name, "gl_FragCoord") != 0)) { 1908e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick const char *const qual_string = (qual->flags.q.origin_upper_left) 19098d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick ? "origin_upper_left" : "pixel_center_integer"; 19108d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick 19118d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick _mesa_glsl_error(loc, state, 19128d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick "layout qualifier `%s' can only be applied to " 19138d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick "fragment shader input `gl_FragCoord'", 19148d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick qual_string); 19158d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick } 19168d8469eb2ade4fd48188403351a38f740987fb80Ian Romanick 1917eee68d3631813580a14fa51fda6f0c959279256cIan Romanick if (qual->flags.q.explicit_location) { 1918eee68d3631813580a14fa51fda6f0c959279256cIan Romanick const bool global_scope = (state->current_function == NULL); 1919eee68d3631813580a14fa51fda6f0c959279256cIan Romanick bool fail = false; 1920eee68d3631813580a14fa51fda6f0c959279256cIan Romanick const char *string = ""; 1921eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 1922eee68d3631813580a14fa51fda6f0c959279256cIan Romanick /* In the vertex shader only shader inputs can be given explicit 1923eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * locations. 1924eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * 1925eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * In the fragment shader only shader outputs can be given explicit 1926eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * locations. 1927eee68d3631813580a14fa51fda6f0c959279256cIan Romanick */ 1928eee68d3631813580a14fa51fda6f0c959279256cIan Romanick switch (state->target) { 1929eee68d3631813580a14fa51fda6f0c959279256cIan Romanick case vertex_shader: 1930eee68d3631813580a14fa51fda6f0c959279256cIan Romanick if (!global_scope || (var->mode != ir_var_in)) { 1931eee68d3631813580a14fa51fda6f0c959279256cIan Romanick fail = true; 1932eee68d3631813580a14fa51fda6f0c959279256cIan Romanick string = "input"; 1933eee68d3631813580a14fa51fda6f0c959279256cIan Romanick } 1934eee68d3631813580a14fa51fda6f0c959279256cIan Romanick break; 1935eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 1936eee68d3631813580a14fa51fda6f0c959279256cIan Romanick case geometry_shader: 1937eee68d3631813580a14fa51fda6f0c959279256cIan Romanick _mesa_glsl_error(loc, state, 1938eee68d3631813580a14fa51fda6f0c959279256cIan Romanick "geometry shader variables cannot be given " 1939eee68d3631813580a14fa51fda6f0c959279256cIan Romanick "explicit locations\n"); 1940eee68d3631813580a14fa51fda6f0c959279256cIan Romanick break; 1941eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 1942eee68d3631813580a14fa51fda6f0c959279256cIan Romanick case fragment_shader: 1943b078aad8ab22d840456688480a8c27d4664297cePaul Berry if (!global_scope || (var->mode != ir_var_out)) { 1944eee68d3631813580a14fa51fda6f0c959279256cIan Romanick fail = true; 1945eee68d3631813580a14fa51fda6f0c959279256cIan Romanick string = "output"; 1946eee68d3631813580a14fa51fda6f0c959279256cIan Romanick } 1947eee68d3631813580a14fa51fda6f0c959279256cIan Romanick break; 1948a75da2c0e85eb6b8279ec895c3f74cc4aefc0257Kenneth Graunke }; 1949eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 1950eee68d3631813580a14fa51fda6f0c959279256cIan Romanick if (fail) { 1951eee68d3631813580a14fa51fda6f0c959279256cIan Romanick _mesa_glsl_error(loc, state, 1952eee68d3631813580a14fa51fda6f0c959279256cIan Romanick "only %s shader %s variables can be given an " 1953eee68d3631813580a14fa51fda6f0c959279256cIan Romanick "explicit location\n", 1954eee68d3631813580a14fa51fda6f0c959279256cIan Romanick _mesa_glsl_shader_target_name(state->target), 1955eee68d3631813580a14fa51fda6f0c959279256cIan Romanick string); 1956eee68d3631813580a14fa51fda6f0c959279256cIan Romanick } else { 1957eee68d3631813580a14fa51fda6f0c959279256cIan Romanick var->explicit_location = true; 195868a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick 195968a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick /* This bit of silliness is needed because invalid explicit locations 196068a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick * are supposed to be flagged during linking. Small negative values 196168a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias 196268a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS). 196368a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick * The linker needs to be able to differentiate these cases. This 196468a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick * ensures that negative values stay negative. 196568a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick */ 196668a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick if (qual->location >= 0) { 196768a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick var->location = (state->target == vertex_shader) 196868a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick ? (qual->location + VERT_ATTRIB_GENERIC0) 196968a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick : (qual->location + FRAG_RESULT_DATA0); 197068a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick } else { 197168a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick var->location = qual->location; 197268a4fc9d5a9dd3b61472451d659275531253b67dIan Romanick } 1973eee68d3631813580a14fa51fda6f0c959279256cIan Romanick } 1974eee68d3631813580a14fa51fda6f0c959279256cIan Romanick } 1975eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 19764bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick /* Does the declaration use the 'layout' keyword? 19774bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick */ 19784bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick const bool uses_layout = qual->flags.q.pixel_center_integer 19794bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick || qual->flags.q.origin_upper_left 19804bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick || qual->flags.q.explicit_location; 19814bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick 19824bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick /* Does the declaration use the deprecated 'attribute' or 'varying' 19834bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * keywords? 19844bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick */ 19854bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick const bool uses_deprecated_qualifier = qual->flags.q.attribute 19864bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick || qual->flags.q.varying; 19874bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick 19884bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick /* Is the 'layout' keyword used with parameters that allow relaxed checking. 19894bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * Many implementations of GL_ARB_fragment_coord_conventions_enable and some 19904bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable 19914bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * allowed the layout qualifier to be used with 'varying' and 'attribute'. 19924bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * These extensions and all following extensions that add the 'layout' 19934bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * keyword have been modified to require the use of 'in' or 'out'. 19944bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * 19954bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * The following extension do not allow the deprecated keywords: 19964bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * 19974bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_AMD_conservative_depth 19984bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_ARB_gpu_shader5 19994bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_ARB_separate_shader_objects 20004bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_ARB_tesselation_shader 20014bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_ARB_transform_feedback3 20024bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * GL_ARB_uniform_buffer_object 20034bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * 20044bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5 20054bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick * allow layout with the deprecated keywords. 20064bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick */ 20074bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick const bool relaxed_layout_qualifier_checking = 20084bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick state->ARB_fragment_coord_conventions_enable; 20094bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick 20104bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick if (uses_layout && uses_deprecated_qualifier) { 20114bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick if (relaxed_layout_qualifier_checking) { 20124bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick _mesa_glsl_warning(loc, state, 20134bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick "`layout' qualifier may not be used with " 20144bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick "`attribute' or `varying'"); 20154bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick } else { 20164bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick _mesa_glsl_error(loc, state, 20174bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick "`layout' qualifier may not be used with " 20184bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick "`attribute' or `varying'"); 20194bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick } 20204bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick } 20214bcff0c19091c7df2b2e0bafe58addb5bae28f1aIan Romanick 2022bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace /* Layout qualifiers for gl_FragDepth, which are enabled by extension 2023bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace * AMD_conservative_depth. 2024bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace */ 2025bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace int depth_layout_count = qual->flags.q.depth_any 2026bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace + qual->flags.q.depth_greater 2027bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace + qual->flags.q.depth_less 2028bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace + qual->flags.q.depth_unchanged; 2029bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace if (depth_layout_count > 0 2030bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace && !state->AMD_conservative_depth_enable) { 2031bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace _mesa_glsl_error(loc, state, 2032bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "extension GL_AMD_conservative_depth must be enabled " 2033bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "to use depth layout qualifiers"); 2034bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace } else if (depth_layout_count > 0 2035bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace && strcmp(var->name, "gl_FragDepth") != 0) { 2036bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace _mesa_glsl_error(loc, state, 2037bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "depth layout qualifiers can be applied only to " 2038bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "gl_FragDepth"); 2039bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace } else if (depth_layout_count > 1 2040bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace && strcmp(var->name, "gl_FragDepth") == 0) { 2041bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace _mesa_glsl_error(loc, state, 2042bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "at most one depth layout qualifier can be applied to " 2043bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace "gl_FragDepth"); 2044bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace } 2045bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace if (qual->flags.q.depth_any) 2046bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace var->depth_layout = ir_depth_layout_any; 2047bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace else if (qual->flags.q.depth_greater) 2048bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace var->depth_layout = ir_depth_layout_greater; 2049bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace else if (qual->flags.q.depth_less) 2050bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace var->depth_layout = ir_depth_layout_less; 2051bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace else if (qual->flags.q.depth_unchanged) 2052bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace var->depth_layout = ir_depth_layout_unchanged; 2053bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace else 2054bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace var->depth_layout = ir_depth_layout_none; 2055bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace 205610eaa8bcbce1cd6d2e120e913f7abafde9675215Kenneth Graunke if (var->type->is_array() && state->language_version != 110) { 20579d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick var->array_lvalue = true; 20589d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick } 2059a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 2060a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 20618e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick/** 20628e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * Get the variable that is being redeclared by this declaration 20638e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * 20648e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * Semantic checks to verify the validity of the redeclaration are also 20658e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * performed. If semantic checks fail, compilation error will be emitted via 20668e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * \c _mesa_glsl_error, but a non-\c NULL pointer will still be returned. 20678e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * 20688e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * \returns 20698e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * A pointer to an existing variable in the current scope if the declaration 20708e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * is a redeclaration, \c NULL otherwise. 20718e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 20728e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanickir_variable * 20738e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanickget_variable_being_redeclared(ir_variable *var, ast_declaration *decl, 20748e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick struct _mesa_glsl_parse_state *state) 20758e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick{ 20768e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* Check if this declaration is actually a re-declaration, either to 20778e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * resize an array or add qualifiers to an existing variable. 20788e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * 20798e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * This is allowed for variables in the current scope, or when at 20808e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * global scope (for built-ins in the implicit outer scope). 20818e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 20828e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick ir_variable *earlier = state->symbols->get_variable(decl->identifier); 20838e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick if (earlier == NULL || 20848e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick (state->current_function != NULL && 20858e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick !state->symbols->name_declared_this_scope(decl->identifier))) { 20868e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick return NULL; 20878e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } 20888e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 20898e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 20908e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick YYLTYPE loc = decl->get_location(); 20918e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 20928e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec, 20938e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * 20948e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * "It is legal to declare an array without a size and then 20958e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * later re-declare the same name as an array of the same 20968e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * type and specify a size." 20978e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 20988e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick if ((earlier->type->array_size() == 0) 20998e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && var->type->is_array() 21008e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && (var->type->element_type() == earlier->type->element_type())) { 21018e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* FINISHME: This doesn't match the qualifiers on the two 21028e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * FINISHME: declarations. It's not 100% clear whether this is 21038e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * FINISHME: required or not. 21048e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 21058e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21068e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec: 21078e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * 21088e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * "The size [of gl_TexCoord] can be at most 21098e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * gl_MaxTextureCoords." 21108e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 21118e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick const unsigned size = unsigned(var->type->array_size()); 21128e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick if ((strcmp("gl_TexCoord", var->name) == 0) 21138e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && (size > state->Const.MaxTextureCoords)) { 21148e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick _mesa_glsl_error(& loc, state, "`gl_TexCoord' array size cannot " 21158e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "be larger than gl_MaxTextureCoords (%u)\n", 21168e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick state->Const.MaxTextureCoords); 21178e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } else if ((size > 0) && (size <= earlier->max_array_access)) { 21188e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick _mesa_glsl_error(& loc, state, "array size must be > %u due to " 21198e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "previous access", 21208e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->max_array_access); 21218e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } 21228e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21238e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->type = var->type; 21248e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick delete var; 21258e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick var = NULL; 21268e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } else if (state->ARB_fragment_coord_conventions_enable 21278e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && strcmp(var->name, "gl_FragCoord") == 0 21288e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->type == var->type 21298e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->mode == var->mode) { 21308e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* Allow redeclaration of gl_FragCoord for ARB_fcc layout 21318e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * qualifiers. 21328e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 21338e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->origin_upper_left = var->origin_upper_left; 21348e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->pixel_center_integer = var->pixel_center_integer; 21358e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21368e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* According to section 4.3.7 of the GLSL 1.30 spec, 21378e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * the following built-in varaibles can be redeclared with an 21388e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * interpolation qualifier: 21398e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_FrontColor 21408e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_BackColor 21418e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_FrontSecondaryColor 21428e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_BackSecondaryColor 21438e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_Color 21448e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * * gl_SecondaryColor 21458e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 21468e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } else if (state->language_version >= 130 21478e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && (strcmp(var->name, "gl_FrontColor") == 0 21488e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick || strcmp(var->name, "gl_BackColor") == 0 21498e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick || strcmp(var->name, "gl_FrontSecondaryColor") == 0 21508e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick || strcmp(var->name, "gl_BackSecondaryColor") == 0 21518e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick || strcmp(var->name, "gl_Color") == 0 21528e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick || strcmp(var->name, "gl_SecondaryColor") == 0) 21538e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->type == var->type 21548e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->mode == var->mode) { 21558e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->interpolation = var->interpolation; 21568e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21578e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* Layout qualifiers for gl_FragDepth. */ 21588e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } else if (state->AMD_conservative_depth_enable 21598e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && strcmp(var->name, "gl_FragDepth") == 0 21608e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->type == var->type 21618e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->mode == var->mode) { 21628e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21638e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /** From the AMD_conservative_depth spec: 21648e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * Within any shader, the first redeclarations of gl_FragDepth 21658e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick * must appear before any use of gl_FragDepth. 21668e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick */ 21678e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick if (earlier->used) { 21688e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick _mesa_glsl_error(&loc, state, 21698e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "the first redeclaration of gl_FragDepth " 21708e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "must appear before any use of gl_FragDepth"); 21718e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } 21728e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21738e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick /* Prevent inconsistent redeclaration of depth layout qualifier. */ 21748e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick if (earlier->depth_layout != ir_depth_layout_none 21758e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick && earlier->depth_layout != var->depth_layout) { 21768e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick _mesa_glsl_error(&loc, state, 21778e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "gl_FragDepth: depth layout is declared here " 21788e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "as '%s, but it was previously declared as " 21798e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick "'%s'", 21808e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick depth_layout_string(var->depth_layout), 21818e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick depth_layout_string(earlier->depth_layout)); 21828e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } 21838e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21848e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick earlier->depth_layout = var->depth_layout; 21858e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21868e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } else { 21878e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier); 21888e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick } 21898e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick 21908e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick return earlier; 21918e6cb9fe51a2237e51b47198eb7d46b14ad288b5Ian Romanick} 2192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 21930292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick/** 21940292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * Generate the IR for an initializer in a variable declaration 21950292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick */ 21960292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanickir_rvalue * 21970292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanickprocess_initializer(ir_variable *var, ast_declaration *decl, 21980292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ast_fully_specified_type *type, 21990292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick exec_list *initializer_instructions, 22000292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick struct _mesa_glsl_parse_state *state) 22010292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick{ 22020292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ir_rvalue *result = NULL; 22030292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22040292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick YYLTYPE initializer_loc = decl->initializer->get_location(); 22050292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22060292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec: 22070292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 22080292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * "All uniform variables are read-only and are initialized either 22090292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * directly by an application via API commands, or indirectly by 22100292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * OpenGL." 22110292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick */ 22120292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if ((state->language_version <= 110) 22130292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick && (var->mode == ir_var_uniform)) { 22140292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_error(& initializer_loc, state, 22150292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "cannot initialize uniforms in GLSL 1.10"); 22160292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22170292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22180292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (var->type->is_sampler()) { 22190292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_error(& initializer_loc, state, 22200292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "cannot initialize samplers"); 22210292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22220292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22230292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if ((var->mode == ir_var_in) && (state->current_function == NULL)) { 22240292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_error(& initializer_loc, state, 22250292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "cannot initialize %s shader input / %s", 22260292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_shader_target_name(state->target), 22270292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick (state->target == vertex_shader) 22280292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ? "attribute" : "varying"); 22290292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22300292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22310292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ir_dereference *const lhs = new(state) ir_dereference_variable(var); 22320292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ir_rvalue *rhs = decl->initializer->hir(initializer_instructions, 22330292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick state); 22340292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22350292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* Calculate the constant value if this is a const or uniform 22360292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * declaration. 22370292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick */ 22380292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (type->qualifier.flags.q.constant 22390292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick || type->qualifier.flags.q.uniform) { 224085caea29c18fad89050ac366c558afef568dcb3fIan Romanick ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs, true); 22410292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (new_rhs != NULL) { 22420292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick rhs = new_rhs; 22430292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22440292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ir_constant *constant_value = rhs->constant_expression_value(); 22450292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (!constant_value) { 22460292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_error(& initializer_loc, state, 22470292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "initializer of %s variable `%s' must be a " 22480292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "constant expression", 22490292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick (type->qualifier.flags.q.constant) 22500292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick ? "const" : "uniform", 22510292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick decl->identifier); 22520292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (var->type->is_numeric()) { 22530292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* Reduce cascading errors. */ 22540292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->constant_value = ir_constant::zero(state, var->type); 22550292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22560292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } else { 22570292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick rhs = constant_value; 22580292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->constant_value = constant_value; 22590292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22600292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } else { 22610292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick _mesa_glsl_error(&initializer_loc, state, 22620292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "initializer of type %s cannot be assigned to " 22630292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick "variable of type %s", 22640292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick rhs->type->name, var->type->name); 22650292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (var->type->is_numeric()) { 22660292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* Reduce cascading errors. */ 22670292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->constant_value = ir_constant::zero(state, var->type); 22680292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22690292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22700292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 22710292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22720292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (rhs && !rhs->type->is_error()) { 22730292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick bool temp = var->read_only; 22740292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (type->qualifier.flags.q.constant) 22750292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->read_only = false; 22760292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22770292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* Never emit code to initialize a uniform. 22780292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick */ 22790292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick const glsl_type *initializer_type; 22800292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick if (!type->qualifier.flags.q.uniform) { 22810292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick result = do_assignment(initializer_instructions, state, 228285caea29c18fad89050ac366c558afef568dcb3fIan Romanick lhs, rhs, true, 22830292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick type->get_location()); 22840292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick initializer_type = result->type; 22850292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } else 22860292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick initializer_type = rhs->type; 22870292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 22880292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick /* If the declared variable is an unsized array, it must inherrit 22890292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * its full type from the initializer. A declaration such as 22900292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 22910292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * uniform float a[] = float[](1.0, 2.0, 3.0, 3.0); 22920292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 22930292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * becomes 22940292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 22950292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0); 22960292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 22970292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * The assignment generated in the if-statement (below) will also 22980292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * automatically handle this case for non-uniforms. 22990292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * 23000292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * If the declared variable is not an array, the types must 23010292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * already match exactly. As a result, the type assignment 23020292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * here can be done unconditionally. For non-uniforms the call 23030292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * to do_assignment can change the type of the initializer (via 23040292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * the implicit conversion rules). For uniforms the initializer 23050292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * must be a constant expression, and the type of that expression 23060292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick * was validated above. 23070292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick */ 23080292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->type = initializer_type; 23090292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 23100292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick var->read_only = temp; 23110292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick } 23120292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 23130292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick return result; 23140292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick} 23150292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick 2316fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 23170044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_declarator_list::hir(exec_list *instructions, 231818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 2319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 2320953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 2321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *decl_type; 2322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *type_name = NULL; 23238558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt ir_rvalue *result = NULL; 2324c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick YYLTYPE loc = this->get_location(); 2325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 23266f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec: 23276f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * 23286f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * "To ensure that a particular output variable is invariant, it is 23296f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * necessary to use the invariant qualifier. It can either be used to 23306f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * qualify a previously declared variable as being invariant 23316f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * 23326f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * invariant gl_Position; // make existing gl_Position be invariant" 23336f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * 23346f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * In these cases the parser will set the 'invariant' flag in the declarator 23356f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * list, and the type will be NULL. 23366f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick */ 23376f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick if (this->invariant) { 23386f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(this->type == NULL); 23396f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23406f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick if (state->current_function != NULL) { 23416f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 23426f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "All uses of `invariant' keyword must be at global " 23436f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "scope\n"); 23446f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 23456f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23466f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick foreach_list_typed (ast_declaration, decl, link, &this->declarations) { 23476f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(!decl->is_array); 23486f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(decl->array_size == NULL); 23496f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(decl->initializer == NULL); 23506f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23516f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick ir_variable *const earlier = 23526f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick state->symbols->get_variable(decl->identifier); 23536f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick if (earlier == NULL) { 23546f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 23556f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "Undeclared variable `%s' cannot be marked " 23566f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "invariant\n", decl->identifier); 23576f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } else if ((state->target == vertex_shader) 23586f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick && (earlier->mode != ir_var_out)) { 23596f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 23606f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "`%s' cannot be marked invariant, vertex shader " 23616f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "outputs only\n", decl->identifier); 23626f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } else if ((state->target == fragment_shader) 23636f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick && (earlier->mode != ir_var_in)) { 23646f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 23656f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "`%s' cannot be marked invariant, fragment shader " 23666f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "inputs only\n", decl->identifier); 2367bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick } else if (earlier->used) { 2368bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick _mesa_glsl_error(& loc, state, 2369bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick "variable `%s' may not be redeclared " 2370bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick "`invariant' after being used", 2371bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick earlier->name); 23726f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } else { 23736f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick earlier->invariant = true; 23746f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 23756f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 23766f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23776f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick /* Invariant redeclarations do not have r-values. 23786f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick */ 23796f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick return NULL; 23806f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 23816f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23826f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(this->type != NULL); 23836f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick assert(!this->invariant); 23846f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 23853455ce614424a5a23a23037e23d0454e476bceeaIan Romanick /* The type specifier may contain a structure definition. Process that 23863455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * before any of the variable declarations. 23873455ce614424a5a23a23037e23d0454e476bceeaIan Romanick */ 23883455ce614424a5a23a23037e23d0454e476bceeaIan Romanick (void) this->type->specifier->hir(instructions, state); 23893455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 2390d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick decl_type = this->type->specifier->glsl_type(& type_name, state); 2391304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick if (this->declarations.is_empty()) { 23926f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick /* The only valid case where the declaration list can be empty is when 23936f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * the declaration is setting the default precision of a built-in type 23946f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick * (e.g., 'precision highp vec4;'). 2395c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick */ 2396c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick 23976f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick if (decl_type != NULL) { 2398c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick } else { 2399c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick _mesa_glsl_error(& loc, state, "incomplete declaration"); 2400c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick } 2401c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick } 2402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 24032b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_declaration, decl, link, &this->declarations) { 2404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *var_type; 2405768b55a5268572ff9fd03e57e92775882eb0a821Ian Romanick ir_variable *var; 2406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Emit a warning if a variable declaration shadows a 2408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: declaration at a higher scope. 2409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2411cec65a6b76290ee4da91691bd3ef01c3fb8a0c37Ian Romanick if ((decl_type == NULL) || decl_type->is_void()) { 2412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type_name != NULL) { 2413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 2414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type `%s' in declaration of `%s'", 2415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type_name, decl->identifier); 2416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 2417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 2418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type in declaration of `%s'", 2419a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick decl->identifier); 2420a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick continue; 2422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (decl->is_array) { 2425d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke var_type = process_array_type(&loc, decl_type, decl->array_size, 2426d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke state); 2427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 2428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var_type = decl_type; 2429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 24317e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto); 2432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 24333f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification; 24343f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * 24353f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * "Global variables can only use the qualifiers const, 24363f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * attribute, uni form, or varying. Only one may be 24373f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * specified. 24383f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * 24393f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * Local variables can only use the qualifier const." 24403f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt * 244182c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick * This is relaxed in GLSL 1.30. It is also relaxed by any extension 244282c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick * that adds the 'layout' keyword. 24433f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt */ 244482c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick if ((state->language_version < 130) 244582c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick && !state->ARB_explicit_attrib_location_enable 244682c4b4f88af97395a3d1b01e1998ec828cd5d305Ian Romanick && !state->ARB_fragment_coord_conventions_enable) { 2447e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (this->type->qualifier.flags.q.out) { 24483f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt _mesa_glsl_error(& loc, state, 24493f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt "`out' qualifier in declaration of `%s' " 2450469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick "only valid for function parameters in %s.", 2451469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick decl->identifier, state->version_string); 24523f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt } 2453e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (this->type->qualifier.flags.q.in) { 24543f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt _mesa_glsl_error(& loc, state, 24553f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt "`in' qualifier in declaration of `%s' " 2456469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick "only valid for function parameters in %s.", 2457469ea695bbbc984ebec26b2413ab70d450a283caIan Romanick decl->identifier, state->version_string); 24583f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt } 24593f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt /* FINISHME: Test for other invalid qualifiers. */ 24603f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt } 24613f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt 24622e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt apply_type_qualifier_to_variable(& this->type->qualifier, var, state, 24632e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt & loc); 2464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2465e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (this->type->qualifier.flags.q.invariant) { 2466046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt if ((state->target == vertex_shader) && !(var->mode == ir_var_out || 2467046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt var->mode == ir_var_inout)) { 2468046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt /* FINISHME: Note that this doesn't work for invariant on 2469046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * a function signature outval 2470046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt */ 24716f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 24726f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "`%s' cannot be marked invariant, vertex shader " 24736f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "outputs only\n", var->name); 2474046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt } else if ((state->target == fragment_shader) && 2475046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt !(var->mode == ir_var_in || var->mode == ir_var_inout)) { 2476046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt /* FINISHME: Note that this doesn't work for invariant on 2477046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * a function signature inval 2478046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt */ 24796f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick _mesa_glsl_error(& loc, state, 24806f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "`%s' cannot be marked invariant, fragment shader " 24816f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick "inputs only\n", var->name); 24826f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 24836f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick } 24846f0823da09384cc1b557385b9e19a9cc7e901ad7Ian Romanick 2485e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick if (state->current_function != NULL) { 2486b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick const char *mode = NULL; 2487e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick const char *extra = ""; 2488b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick 2489e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick /* There is no need to check for 'inout' here because the parser will 2490e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick * only allow that in function parameter lists. 2491e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick */ 2492e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (this->type->qualifier.flags.q.attribute) { 2493b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick mode = "attribute"; 2494e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick } else if (this->type->qualifier.flags.q.uniform) { 2495b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick mode = "uniform"; 2496e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick } else if (this->type->qualifier.flags.q.varying) { 2497b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick mode = "varying"; 2498e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick } else if (this->type->qualifier.flags.q.in) { 2499e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick mode = "in"; 2500e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick extra = " or in function parameter list"; 2501e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick } else if (this->type->qualifier.flags.q.out) { 2502e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick mode = "out"; 2503e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick extra = " or in function parameter list"; 2504b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick } 2505b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick 2506b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick if (mode) { 2507e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick _mesa_glsl_error(& loc, state, 2508b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick "%s variable `%s' must be declared at " 2509e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick "global scope%s", 2510e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick mode, var->name, extra); 2511e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick } 2512e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick } else if (var->mode == ir_var_in) { 251301a584d09350d2c726312e2c9e88c5dbc54bdb70Chad Versace var->read_only = true; 251401a584d09350d2c726312e2c9e88c5dbc54bdb70Chad Versace 2515fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if (state->target == vertex_shader) { 2516fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick bool error_emitted = false; 2517fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 2518fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: 2519fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 2520fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * "Vertex shader inputs can only be float, floating-point 2521fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * vectors, matrices, signed and unsigned integers and integer 2522fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * vectors. Vertex shader inputs can also form arrays of these 2523fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * types, but not structures." 2524fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 25252d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: 25262d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * 25272d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * "Vertex shader inputs can only be float, floating-point 25282d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * vectors, matrices, signed and unsigned integers and integer 25292d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * vectors. They cannot be arrays or structures." 25302d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * 2531fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: 2532fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 2533fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * "The attribute qualifier can be used only with float, 2534fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * floating-point vectors, and matrices. Attribute variables 2535fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * cannot be declared as arrays or structures." 2536fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick */ 2537fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick const glsl_type *check_type = var->type->is_array() 2538fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick ? var->type->fields.array : var->type; 2539fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 2540fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick switch (check_type->base_type) { 2541fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_FLOAT: 2542fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick break; 2543fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_UINT: 2544fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_INT: 2545fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if (state->language_version > 120) 2546fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick break; 2547fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick /* FALLTHROUGH */ 2548fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick default: 2549fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick _mesa_glsl_error(& loc, state, 2550fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "vertex shader input / attribute cannot have " 2551fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "type %s`%s'", 2552fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick var->type->is_array() ? "array of " : "", 2553fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick check_type->name); 2554fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick error_emitted = true; 2555fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 2556fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 25572d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick if (!error_emitted && (state->language_version <= 130) 2558fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick && var->type->is_array()) { 2559fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick _mesa_glsl_error(& loc, state, 2560fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "vertex shader input / attribute cannot have " 2561fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "array type"); 2562fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick error_emitted = true; 2563fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 2564fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 2565fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 2566fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 256768d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace /* Integer vertex outputs must be qualified with 'flat'. 256868d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace * 256968d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace * From section 4.3.6 of the GLSL 1.30 spec: 257068d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace * "If a vertex output is a signed or unsigned integer or integer 257168d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace * vector, then it must be qualified with the interpolation qualifier 257268d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace * flat." 257368d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace */ 257468d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace if (state->language_version >= 130 257568d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace && state->target == vertex_shader 257668d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace && state->current_function == NULL 257768d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace && var->type->is_integer() 257868d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace && var->mode == ir_var_out 257968d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace && var->interpolation != ir_var_flat) { 258068d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace 258168d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace _mesa_glsl_error(&loc, state, "If a vertex output is an integer, " 258268d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace "then it must be qualified with 'flat'"); 258368d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace } 258468d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace 258568d06b1454aea30c492c7318ab4e8514df8f38fdChad Versace 2586605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace /* Interpolation qualifiers cannot be applied to 'centroid' and 2587605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * 'centroid varying'. 2588605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * 2589605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec: 2590605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * "interpolation qualifiers may only precede the qualifiers in, 2591605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * centroid in, out, or centroid out in a declaration. They do not apply 2592605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace * to the deprecated storage qualifiers varying or centroid varying." 2593605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace */ 2594605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace if (state->language_version >= 130 2595605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace && this->type->qualifier.has_interpolation() 2596605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace && this->type->qualifier.flags.q.varying) { 2597605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace 2598605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace const char *i = this->type->qualifier.interpolation_string(); 2599605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace assert(i != NULL); 2600605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace const char *s; 2601605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace if (this->type->qualifier.flags.q.centroid) 2602605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace s = "centroid varying"; 2603605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace else 2604605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace s = "varying"; 2605605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace 2606605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace _mesa_glsl_error(&loc, state, 2607605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace "qualifier '%s' cannot be applied to the " 2608605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace "deprecated storage qualifier '%s'", i, s); 2609605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace } 2610605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace 2611605aacc67d73db0926e0046a90a07fcd93a2d613Chad Versace 26128faaa4a672c1062e486eda2525287715b554342dChad Versace /* Interpolation qualifiers can only apply to vertex shader outputs and 26138faaa4a672c1062e486eda2525287715b554342dChad Versace * fragment shader inputs. 26148faaa4a672c1062e486eda2525287715b554342dChad Versace * 26158faaa4a672c1062e486eda2525287715b554342dChad Versace * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec: 26168faaa4a672c1062e486eda2525287715b554342dChad Versace * "Outputs from a vertex shader (out) and inputs to a fragment 26178faaa4a672c1062e486eda2525287715b554342dChad Versace * shader (in) can be further qualified with one or more of these 26188faaa4a672c1062e486eda2525287715b554342dChad Versace * interpolation qualifiers" 26198faaa4a672c1062e486eda2525287715b554342dChad Versace */ 26208faaa4a672c1062e486eda2525287715b554342dChad Versace if (state->language_version >= 130 26218faaa4a672c1062e486eda2525287715b554342dChad Versace && this->type->qualifier.has_interpolation()) { 26228faaa4a672c1062e486eda2525287715b554342dChad Versace 26238faaa4a672c1062e486eda2525287715b554342dChad Versace const char *i = this->type->qualifier.interpolation_string(); 26248faaa4a672c1062e486eda2525287715b554342dChad Versace assert(i != NULL); 26258faaa4a672c1062e486eda2525287715b554342dChad Versace 26268faaa4a672c1062e486eda2525287715b554342dChad Versace switch (state->target) { 26278faaa4a672c1062e486eda2525287715b554342dChad Versace case vertex_shader: 26288faaa4a672c1062e486eda2525287715b554342dChad Versace if (this->type->qualifier.flags.q.in) { 26298faaa4a672c1062e486eda2525287715b554342dChad Versace _mesa_glsl_error(&loc, state, 26308faaa4a672c1062e486eda2525287715b554342dChad Versace "qualifier '%s' cannot be applied to vertex " 26318faaa4a672c1062e486eda2525287715b554342dChad Versace "shader inputs", i); 26328faaa4a672c1062e486eda2525287715b554342dChad Versace } 26338faaa4a672c1062e486eda2525287715b554342dChad Versace break; 26348faaa4a672c1062e486eda2525287715b554342dChad Versace case fragment_shader: 26358faaa4a672c1062e486eda2525287715b554342dChad Versace if (this->type->qualifier.flags.q.out) { 26368faaa4a672c1062e486eda2525287715b554342dChad Versace _mesa_glsl_error(&loc, state, 26378faaa4a672c1062e486eda2525287715b554342dChad Versace "qualifier '%s' cannot be applied to fragment " 26388faaa4a672c1062e486eda2525287715b554342dChad Versace "shader outputs", i); 26398faaa4a672c1062e486eda2525287715b554342dChad Versace } 26408faaa4a672c1062e486eda2525287715b554342dChad Versace break; 26418faaa4a672c1062e486eda2525287715b554342dChad Versace default: 26428faaa4a672c1062e486eda2525287715b554342dChad Versace assert(0); 26438faaa4a672c1062e486eda2525287715b554342dChad Versace } 26448faaa4a672c1062e486eda2525287715b554342dChad Versace } 26458faaa4a672c1062e486eda2525287715b554342dChad Versace 26468faaa4a672c1062e486eda2525287715b554342dChad Versace 26471eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace /* From section 4.3.4 of the GLSL 1.30 spec: 26481eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace * "It is an error to use centroid in in a vertex shader." 26491eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace */ 26501eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace if (state->language_version >= 130 26511eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace && this->type->qualifier.flags.q.centroid 26521eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace && this->type->qualifier.flags.q.in 26531eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace && state->target == vertex_shader) { 26541eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace 26551eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace _mesa_glsl_error(&loc, state, 26561eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace "'centroid in' cannot be used in a vertex shader"); 26571eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace } 26581eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace 26591eb0f17fa4aa548779cb7d8ffbd86de3523d6796Chad Versace 2660889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30. 2661889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace */ 2662889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace if (this->type->specifier->precision != ast_precision_none 2663889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace && state->language_version != 100 2664889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace && state->language_version < 130) { 2665889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace 2666889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace _mesa_glsl_error(&loc, state, 2667889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace "precision qualifiers are supported only in GLSL ES " 2668889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace "1.00, and GLSL 1.30 and later"); 2669889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace } 2670889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace 2671889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace 267245e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace /* Precision qualifiers only apply to floating point and integer types. 2673889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * 2674889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * From section 4.5.2 of the GLSL 1.30 spec: 2675889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * "Any floating point or any integer declaration can have the type 2676889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * preceded by one of these precision qualifiers [...] Literal 2677889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * constants do not have precision qualifiers. Neither do Boolean 2678889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace * variables. 26798752824f27c979986ae855667337e89637b005fbKenneth Graunke * 26808752824f27c979986ae855667337e89637b005fbKenneth Graunke * In GLSL ES, sampler types are also allowed. 26818752824f27c979986ae855667337e89637b005fbKenneth Graunke * 26828752824f27c979986ae855667337e89637b005fbKenneth Graunke * From page 87 of the GLSL ES spec: 26838752824f27c979986ae855667337e89637b005fbKenneth Graunke * "RESOLUTION: Allow sampler types to take a precision qualifier." 2684889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace */ 2685889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace if (this->type->specifier->precision != ast_precision_none 268645e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace && !var->type->is_float() 268745e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace && !var->type->is_integer() 26888752824f27c979986ae855667337e89637b005fbKenneth Graunke && !(var->type->is_sampler() && state->es_shader) 268945e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace && !(var->type->is_array() 269045e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace && (var->type->fields.array->is_float() 269145e8e6c6b1b7f3bc00a578fa6809c9bc719c171aChad Versace || var->type->fields.array->is_integer()))) { 2692889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace 2693889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace _mesa_glsl_error(&loc, state, 26948752824f27c979986ae855667337e89637b005fbKenneth Graunke "precision qualifiers apply only to floating point" 26958752824f27c979986ae855667337e89637b005fbKenneth Graunke "%s types", state->es_shader ? ", integer, and sampler" 26968752824f27c979986ae855667337e89637b005fbKenneth Graunke : "and integer"); 2697889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace } 2698889e1a5b6c6602198d649ea5881e0010dec575e9Chad Versace 2699e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick /* Process the initializer and add its instructions to a temporary 2700e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick * list. This list will be added to the instruction stream (below) after 2701e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick * the declaration is added. This is done because in some cases (such as 2702e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick * redeclarations) the declaration may not actually be added to the 2703e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick * instruction stream. 2704e78e0fa42b49b50ed1150f7fdb74bf942ebd6bcfIan Romanick */ 2705fa33d0b85403da94e3f4a7e6c868af215c076b4bEric Anholt exec_list initializer_instructions; 270609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick ir_variable *earlier = get_variable_being_redeclared(var, decl, state); 270709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick 270866faec4895b7bb59a614087a200c05157191b4aeIan Romanick if (decl->initializer != NULL) { 270909a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick result = process_initializer((earlier == NULL) ? var : earlier, 271009a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick decl, this->type, 27110292ffb85c03e9fa15b9395e3875109dd8979292Ian Romanick &initializer_instructions, state); 271266faec4895b7bb59a614087a200c05157191b4aeIan Romanick } 271317d86f4371da413176ba365ca26a58bac172d365Ian Romanick 27140ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec: 27150ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt * 27160ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt * "It is an error to write to a const variable outside of 27170ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt * its declaration, so they must be initialized when 27180ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt * declared." 27190ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt */ 2720e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) { 27210ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt _mesa_glsl_error(& loc, state, 272246f7105df487c91569f7e4a8da74d673c12e5619Chad Versace "const declaration of `%s' must be initialized", 272346f7105df487c91569f7e4a8da74d673c12e5619Chad Versace decl->identifier); 27240ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt } 27250ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt 272609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick /* If the declaration is not a redeclaration, there are a few additional 272709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * semantic checks that must be applied. In addition, variable that was 272809a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * created for the declaration should be added to the IR stream. 27295466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick */ 273009a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick if (earlier == NULL) { 273109a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec, 273209a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * 273309a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * "Identifiers starting with "gl_" are reserved for use by 273409a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * OpenGL, and may not be declared in a shader as either a 273509a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * variable or a function." 273609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick */ 273709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick if (strncmp(decl->identifier, "gl_", 3) == 0) 273809a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick _mesa_glsl_error(& loc, state, 273909a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick "identifier `%s' uses reserved `gl_' prefix", 274009a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick decl->identifier); 27415466b63968b98c9627b8dd207ea2bebf838b5268Ian Romanick 274209a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick /* Add the variable to the symbol table. Note that the initializer's 274309a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * IR was already processed earlier (though it hasn't been emitted 274409a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * yet), without the variable in scope. 274509a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * 274609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * This differs from most C-like languages, but it follows the GLSL 274709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 274809a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * spec: 274909a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * 275009a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * "Within a declaration, the scope of a name starts immediately 275109a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * after the initializer if present or immediately after the name 275209a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * being declared if not." 275309a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick */ 275409a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick if (!state->symbols->add_variable(var)) { 275509a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick YYLTYPE loc = this->get_location(); 275609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick _mesa_glsl_error(&loc, state, "name `%s' already taken in the " 275709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick "current scope", decl->identifier); 275809a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick continue; 275909a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick } 276009a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick 276109a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick /* Push the variable declaration to the top. It means that all the 276209a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * variable declarations will appear in a funny last-to-first order, 276309a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * but otherwise we run into trouble if a function is prototyped, a 276409a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * global var is decled, then the function is defined with usage of 276509a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick * the global var. See glslparsertest's CorrectModule.frag. 276609a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick */ 276709a4ba0fc31fa8fc193dfb7b4fd78e32722b8312Ian Romanick instructions->push_head(var); 27685d25746640ee27882b69a962459727cf924443dbKenneth Graunke } 27695d25746640ee27882b69a962459727cf924443dbKenneth Graunke 2770fa33d0b85403da94e3f4a7e6c868af215c076b4bEric Anholt instructions->append_list(&initializer_instructions); 2771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 27738558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt 27748558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt /* Generally, variable declarations do not have r-values. However, 27758558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * one is used for the declaration in 27768558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * 27778558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * while (bool b = some_condition()) { 27788558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * ... 27798558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * } 27808558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * 27818558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt * so we return the rvalue from the last seen declaration here. 2782a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 27838558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt return result; 2784a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 2785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2787fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 27880044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_parameter_declarator::hir(exec_list *instructions, 278918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 2790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 2791953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 2792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 2793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name = NULL; 27942e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt YYLTYPE loc = this->get_location(); 2795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2796d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick type = this->type->specifier->glsl_type(& name, state); 2797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type == NULL) { 2799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (name != NULL) { 2800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 2801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type `%s' in declaration of `%s'", 280218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick name, this->identifier); 2803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 2804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 2805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type in declaration of `%s'", 280618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick this->identifier); 2807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28090471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::error_type; 2810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2812068c80cfe0a280490353b6b007165d717c672eedEric Anholt /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec: 2813068c80cfe0a280490353b6b007165d717c672eedEric Anholt * 2814068c80cfe0a280490353b6b007165d717c672eedEric Anholt * "Functions that accept no input arguments need not use void in the 2815068c80cfe0a280490353b6b007165d717c672eedEric Anholt * argument list because prototypes (or definitions) are required and 2816068c80cfe0a280490353b6b007165d717c672eedEric Anholt * therefore there is no ambiguity when an empty argument list "( )" is 2817068c80cfe0a280490353b6b007165d717c672eedEric Anholt * declared. The idiom "(void)" as a parameter list is provided for 2818068c80cfe0a280490353b6b007165d717c672eedEric Anholt * convenience." 2819068c80cfe0a280490353b6b007165d717c672eedEric Anholt * 2820068c80cfe0a280490353b6b007165d717c672eedEric Anholt * Placing this check here prevents a void parameter being set up 2821068c80cfe0a280490353b6b007165d717c672eedEric Anholt * for a function, which avoids tripping up checks for main taking 2822068c80cfe0a280490353b6b007165d717c672eedEric Anholt * parameters and lookups of an unnamed symbol. 2823068c80cfe0a280490353b6b007165d717c672eedEric Anholt */ 2824cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick if (type->is_void()) { 2825cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick if (this->identifier != NULL) 2826cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick _mesa_glsl_error(& loc, state, 2827cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick "named parameter cannot have type `void'"); 2828cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 2829cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick is_void = true; 2830068c80cfe0a280490353b6b007165d717c672eedEric Anholt return NULL; 2831cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick } 2832068c80cfe0a280490353b6b007165d717c672eedEric Anholt 283345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick if (formal_parameter && (this->identifier == NULL)) { 283445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick _mesa_glsl_error(& loc, state, "formal parameter lacks a name"); 283545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick return NULL; 283645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick } 283745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick 2838e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke /* This only handles "vec4 foo[..]". The earlier specifier->glsl_type(...) 2839e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke * call already handled the "vec4[..] foo" case. 2840e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke */ 2841e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke if (this->is_array) { 2842d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke type = process_array_type(&loc, type, this->array_size, state); 2843e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke } 2844e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke 2845e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke if (type->array_size() == 0) { 2846e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke _mesa_glsl_error(&loc, state, "arrays passed as parameters must have " 2847e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke "a declared size."); 2848e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke type = glsl_type::error_type; 2849e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke } 2850e511a35fc53fb75a2401d8a94c0c35634175c575Kenneth Graunke 2851cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick is_void = false; 28527e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in); 2853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2854cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick /* Apply any specified qualifiers to the parameter declaration. Note that 2855cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick * for function parameters the default mode is 'in'. 2856cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick */ 28572e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc); 2858a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28590044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick instructions->push_tail(var); 2860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Parameter declarations do not have r-values. 2862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 2864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 2865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 286745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickvoid 2868304ea90233baeac6801a98e981658cb7a2d2501cIan Romanickast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters, 286945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick bool formal, 287045d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick exec_list *ir_parameters, 287145d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick _mesa_glsl_parse_state *state) 2872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 2873cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick ast_parameter_declarator *void_param = NULL; 2874cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick unsigned count = 0; 2875a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28762b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) { 287745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick param->formal_parameter = formal; 2878068c80cfe0a280490353b6b007165d717c672eedEric Anholt param->hir(ir_parameters, state); 2879cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 2880cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick if (param->is_void) 2881cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick void_param = param; 2882cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 2883cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick count++; 2884cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick } 2885cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 2886cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick if ((void_param != NULL) && (count > 1)) { 2887cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick YYLTYPE loc = void_param->get_location(); 2888cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick 2889cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick _mesa_glsl_error(& loc, state, 2890cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick "`void' parameter must be only parameter"); 2891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 2892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 2893a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2894a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 28956fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkevoid 28966fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunkeemit_function(_mesa_glsl_parse_state *state, exec_list *instructions, 28976fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke ir_function *f) 28986fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke{ 28996fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke /* Emit the new function header */ 29006fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke if (state->current_function == NULL) { 29016fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke instructions->push_tail(f); 29026fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke } else { 29036fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke /* IR invariants disallow function declarations or definitions nested 29046fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke * within other function definitions. Insert the new ir_function 29056fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke * block in the instruction sequence before the ir_function block 29066fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke * containing the current ir_function_signature. 29076fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke */ 29086fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke ir_function *const curr = 29096fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke const_cast<ir_function *>(state->current_function->function()); 29106fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke 29116fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke curr->insert_before(f); 29126fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke } 29136fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke} 29146fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke 29156fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke 2916fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 291792318a947958892497722772b03c643ebc943294Ian Romanickast_function::hir(exec_list *instructions, 291892318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state) 2919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 2920953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 292118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ir_function *f = NULL; 292292318a947958892497722772b03c643ebc943294Ian Romanick ir_function_signature *sig = NULL; 292392318a947958892497722772b03c643ebc943294Ian Romanick exec_list hir_parameters; 2924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2925ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke const char *const name = identifier; 2926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 292763b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec, 292863b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * 292963b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * "Function declarations (prototypes) cannot occur inside of functions; 293063b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * they must be at global scope, or for the built-in functions, outside 293163b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * the global scope." 293263b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * 293363b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec, 293463b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * 293563b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * "User defined functions may only be defined within the global scope." 293663b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * 293763b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick * Note that this language does not appear in GLSL 1.10. 293863b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick */ 293963b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick if ((state->current_function != NULL) && (state->language_version != 110)) { 294063b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick YYLTYPE loc = this->get_location(); 294163b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick _mesa_glsl_error(&loc, state, 294263b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick "declaration of function `%s' not allowed within " 294363b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick "function body", name); 294463b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick } 294563b80f8cc181ded154668e60ac2cf0a6a82d118fIan Romanick 2946edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec, 2947edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke * 2948edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke * "Identifiers starting with "gl_" are reserved for use by 2949edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke * OpenGL, and may not be declared in a shader as either a 2950edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke * variable or a function." 2951edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke */ 2952edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke if (strncmp(name, "gl_", 3) == 0) { 2953edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke YYLTYPE loc = this->get_location(); 2954edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke _mesa_glsl_error(&loc, state, 2955edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke "identifier `%s' uses reserved `gl_' prefix", name); 2956edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke } 2957edd180f03216d2fcb2771aeea34e7015fb2b83c3Kenneth Graunke 2958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Convert the list of function parameters to HIR now so that they can be 2959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * used below to compare this function's signature with previously seen 2960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * signatures for functions with the same name. 2961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 296245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick ast_parameter_declarator::parameters_to_hir(& this->parameters, 296345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick is_definition, 296445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick & hir_parameters, state); 2965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2966e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick const char *return_type_name; 2967e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick const glsl_type *return_type = 296892318a947958892497722772b03c643ebc943294Ian Romanick this->return_type->specifier->glsl_type(& return_type_name, state); 2969e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick 297076e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt if (!return_type) { 297176e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt YYLTYPE loc = this->get_location(); 297276e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt _mesa_glsl_error(&loc, state, 297376e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt "function `%s' has undeclared return type `%s'", 297476e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt name, return_type_name); 297576e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt return_type = glsl_type::error_type; 297676e96d74f49cc262ceaf2ed6c48d2f4ed21d219fEric Anholt } 2977e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick 2978ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec: 2979ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke * "No qualifier is allowed on the return type of a function." 2980ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke */ 2981ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke if (this->return_type->has_qualifiers()) { 2982ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke YYLTYPE loc = this->get_location(); 2983ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke _mesa_glsl_error(& loc, state, 2984ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke "function `%s' return type has qualifiers", name); 2985ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke } 2986ac04c257e31fe012dac750bcf5bf3134ba07ebdcKenneth Graunke 2987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Verify that this function's signature either doesn't match a previously 2988a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * seen signature for a function with the same name, or, if a match is found, 2989a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the previously seen signature does not have an associated definition. 2990a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2991e466b182bbf21f62fe6542091f4af3275555db80Ian Romanick f = state->symbols->get_function(name); 299281f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke if (f != NULL && (state->es_shader || f->has_user_signature())) { 2993202604e8160157e4e80b3458175e0170d168e557Ian Romanick sig = f->exact_matching_signature(&hir_parameters); 29940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke if (sig != NULL) { 29950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke const char *badvar = sig->qualifiers_match(&hir_parameters); 29960d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke if (badvar != NULL) { 29970d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke YYLTYPE loc = this->get_location(); 2998abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 29990d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' " 30000d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke "qualifiers don't match prototype", name, badvar); 30010d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke } 30021e7ec3ce128a9d30d7d9e1707a22b270eb525075Eric Anholt 30030d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke if (sig->return_type != return_type) { 30040d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke YYLTYPE loc = this->get_location(); 300560be7626b829af7e1d07330b9a88468924ba350eEric Anholt 30060d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke _mesa_glsl_error(&loc, state, "function `%s' return type doesn't " 30070d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke "match prototype", name); 30080d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke } 3009a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 30100d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke if (is_definition && sig->is_defined) { 30110d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke YYLTYPE loc = this->get_location(); 3012a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 30130d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke _mesa_glsl_error(& loc, state, "function `%s' redefined", name); 3014a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 3015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 3016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 30171660a2954797e056caba319c5d6c70b0d4be22feCarl Worth f = new(ctx) ir_function(name); 3018e8f5ebf313da3ce33ccbbcf9b72946853035fbddEric Anholt if (!state->symbols->add_function(f)) { 3019e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke /* This function name shadows a non-function use of the same name. */ 3020e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke YYLTYPE loc = this->get_location(); 3021e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke 3022e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke _mesa_glsl_error(&loc, state, "function name `%s' conflicts with " 3023e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke "non-function", name); 3024e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke return NULL; 3025e09591317b2470fe9c104606577d4e10255727c0Kenneth Graunke } 30269fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke 30276fae1e4c4d33769e2f255d50907b5aa0ab80edd4Kenneth Graunke emit_function(state, instructions, f); 3028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 3029a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3030ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt /* Verify the return type of main() */ 3031ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt if (strcmp(name, "main") == 0) { 303225711a85c22bed305c9b52b89feb9c600d1892dfIan Romanick if (! return_type->is_void()) { 3033ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt YYLTYPE loc = this->get_location(); 3034ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt 3035ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt _mesa_glsl_error(& loc, state, "main() must return void"); 3036ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt } 3037174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt 303892318a947958892497722772b03c643ebc943294Ian Romanick if (!hir_parameters.is_empty()) { 3039174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt YYLTYPE loc = this->get_location(); 3040174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt 3041174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt _mesa_glsl_error(& loc, state, "main() must not take any parameters"); 3042174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt } 3043ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt } 3044a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3045a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Finish storing the information about this new function in its signature. 3046a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 304792318a947958892497722772b03c643ebc943294Ian Romanick if (sig == NULL) { 30481660a2954797e056caba319c5d6c70b0d4be22feCarl Worth sig = new(ctx) ir_function_signature(return_type); 304992318a947958892497722772b03c643ebc943294Ian Romanick f->add_signature(sig); 3050a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 3051a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3052bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke sig->replace_parameters(&hir_parameters); 305392318a947958892497722772b03c643ebc943294Ian Romanick signature = sig; 305492318a947958892497722772b03c643ebc943294Ian Romanick 305592318a947958892497722772b03c643ebc943294Ian Romanick /* Function declarations (prototypes) do not have r-values. 305692318a947958892497722772b03c643ebc943294Ian Romanick */ 305792318a947958892497722772b03c643ebc943294Ian Romanick return NULL; 305892318a947958892497722772b03c643ebc943294Ian Romanick} 305992318a947958892497722772b03c643ebc943294Ian Romanick 306092318a947958892497722772b03c643ebc943294Ian Romanick 306192318a947958892497722772b03c643ebc943294Ian Romanickir_rvalue * 306292318a947958892497722772b03c643ebc943294Ian Romanickast_function_definition::hir(exec_list *instructions, 306392318a947958892497722772b03c643ebc943294Ian Romanick struct _mesa_glsl_parse_state *state) 306492318a947958892497722772b03c643ebc943294Ian Romanick{ 306592318a947958892497722772b03c643ebc943294Ian Romanick prototype->is_definition = true; 306692318a947958892497722772b03c643ebc943294Ian Romanick prototype->hir(instructions, state); 3067e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick 306892318a947958892497722772b03c643ebc943294Ian Romanick ir_function_signature *signature = prototype->signature; 3069826a39cb14244820e8539a2328bb52447348f184Kenneth Graunke if (signature == NULL) 3070826a39cb14244820e8539a2328bb52447348f184Kenneth Graunke return NULL; 3071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 307241ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick assert(state->current_function == NULL); 307341ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = signature; 30746de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke state->found_return = false; 307541ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick 3076e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick /* Duplicate parameters declared in the prototype as concrete variables. 3077e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick * Add these to the symbol table. 3078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 30798bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->push_scope(); 3080e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick foreach_iter(exec_list_iterator, iter, signature->parameters) { 3081fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt ir_variable *const var = ((ir_instruction *) iter.get())->as_variable(); 3082e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick 3083fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt assert(var != NULL); 3084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 30853359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick /* The only way a parameter would "exist" is if two parameters have 30863359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick * the same name. 30873359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick */ 30883359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick if (state->symbols->name_declared_this_scope(var->name)) { 30893359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick YYLTYPE loc = this->get_location(); 30903359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick 30913359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); 30923359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick } else { 3093001eee52d461233b1e1d6ed3577965e9bcb209e8Eric Anholt state->symbols->add_variable(var); 30943359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick } 3095a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 3096a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 30979fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /* Convert the body of the function to HIR. */ 3098894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt this->body->hir(&signature->body, state); 30999fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke signature->is_defined = true; 3100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 31018bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->pop_scope(); 3102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 310341ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick assert(state->current_function == signature); 310441ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = NULL; 3105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 31066de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke if (!signature->return_type->is_void() && !state->found_return) { 31076de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke YYLTYPE loc = this->get_location(); 31086de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke _mesa_glsl_error(& loc, state, "function `%s' has non-void return type " 31096de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke "%s, but no return statement", 31106de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke signature->function_name(), 31116de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke signature->return_type->name); 31126de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke } 31136de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke 3114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Function definitions do not have r-values. 3115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 3117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 311816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 311916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 3120fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 312116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanickast_jump_statement::hir(exec_list *instructions, 312216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick struct _mesa_glsl_parse_state *state) 312316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick{ 3124953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 312516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 3126c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick switch (mode) { 3127c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick case ast_return: { 312816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick ir_return *inst; 3129aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt assert(state->current_function); 313016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 313116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick if (opt_return_value) { 3132b4cdba687c098eea2ecc61349a4ea02a8769909eChad Versace ir_rvalue *const ret = opt_return_value->hir(instructions, state); 31332db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick 31342db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick /* The value of the return type can be NULL if the shader says 31352db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick * 'return foo();' and foo() is a function that returns void. 31362db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick * 31372db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick * NOTE: The GLSL spec doesn't say that this is an error. The type 31382db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick * of the return value is void. If the return type of the function is 31392db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick * also void, then this should compile without error. Seriously. 31402db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick */ 31412db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick const glsl_type *const ret_type = 31422db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick (ret == NULL) ? glsl_type::void_type : ret->type; 314316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 314418707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke /* Implicit conversions are not allowed for return values. */ 31452db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick if (state->current_function->return_type != ret_type) { 314618707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke YYLTYPE loc = this->get_location(); 314718707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke 314818707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke _mesa_glsl_error(& loc, state, 314918707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke "`return' with wrong type %s, in function `%s' " 315018707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke "returning %s", 31512db46fe5f0145a6afff5b8edc2f00b8c734bb640Ian Romanick ret_type->name, 315218707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke state->current_function->function_name(), 315318707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke state->current_function->return_type->name); 315418707eba1cd6c07fa8b63d0ba5b26f6433f1ae91Kenneth Graunke } 315516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 31561660a2954797e056caba319c5d6c70b0d4be22feCarl Worth inst = new(ctx) ir_return(ret); 315716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } else { 3158aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt if (state->current_function->return_type->base_type != 3159aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt GLSL_TYPE_VOID) { 3160aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt YYLTYPE loc = this->get_location(); 3161aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt 3162aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt _mesa_glsl_error(& loc, state, 3163aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt "`return' with no value, in function %s returning " 3164aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt "non-void", 3165f96c52ba2e290e3ba5f14cd7f87ba5b4382a1785Kenneth Graunke state->current_function->function_name()); 3166aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt } 31671660a2954797e056caba319c5d6c70b0d4be22feCarl Worth inst = new(ctx) ir_return; 316816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } 316916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 31706de825650560198eb97f19e72b2d56e68e3d7a63Kenneth Graunke state->found_return = true; 317116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick instructions->push_tail(inst); 3172c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick break; 317316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } 317416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 3175c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick case ast_discard: 3176b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt if (state->target != fragment_shader) { 3177b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt YYLTYPE loc = this->get_location(); 3178b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt 3179b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt _mesa_glsl_error(& loc, state, 3180b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt "`discard' may only appear in a fragment shader"); 3181b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt } 318277049a702ad54e09c4102fe8c964e069944f83e5Kenneth Graunke instructions->push_tail(new(ctx) ir_discard); 3183c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick break; 3184c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick 3185c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick case ast_break: 3186c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick case ast_continue: 31874cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick /* FINISHME: Handle switch-statements. They cannot contain 'continue', 31884cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick * FINISHME: and they use a different IR instruction for 'break'. 31894cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick */ 31904cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick /* FINISHME: Correctly handle the nesting. If a switch-statement is 31914cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick * FINISHME: inside a loop, a 'continue' is valid and will bind to the 31924cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick * FINISHME: loop. 31934cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick */ 31944cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick if (state->loop_or_switch_nesting == NULL) { 31954cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick YYLTYPE loc = this->get_location(); 31964cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick 31974cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick _mesa_glsl_error(& loc, state, 31984cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick "`%s' may only appear in a loop", 31994cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick (mode == ast_break) ? "break" : "continue"); 32004cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick } else { 32014cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick ir_loop *const loop = state->loop_or_switch_nesting->as_loop(); 32024cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick 32032d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt /* Inline the for loop expression again, since we don't know 32042d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt * where near the end of the loop body the normal copy of it 32052d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt * is going to be placed. 32062d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt */ 32072d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt if (mode == ast_continue && 32082d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt state->loop_or_switch_nesting_ast->rest_expression) { 32092d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt state->loop_or_switch_nesting_ast->rest_expression->hir(instructions, 32102d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt state); 32112d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt } 32122d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt 32134cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick if (loop != NULL) { 32144cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick ir_loop_jump *const jump = 32151660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_loop_jump((mode == ast_break) 32161660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ? ir_loop_jump::jump_break 32171660a2954797e056caba319c5d6c70b0d4be22feCarl Worth : ir_loop_jump::jump_continue); 32184cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick instructions->push_tail(jump); 32194cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick } 32204cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick } 32214cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick 3222c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick break; 3223b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt } 3224b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt 322516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick /* Jump instructions do not have r-values. 322616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick */ 322716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick return NULL; 322816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick} 32293c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_rvalue * 32323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickast_selection_statement::hir(exec_list *instructions, 32333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state) 32343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{ 3235953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 32361660a2954797e056caba319c5d6c70b0d4be22feCarl Worth 32373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *const condition = this->condition->hir(instructions, state); 32383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec: 32403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * 32413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * "Any expression whose type evaluates to a Boolean can be used as the 32423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * conditional expression bool-expression. Vector types are not accepted 32433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * as the expression to if." 32443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * 32453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * The checks are separated so that higher quality diagnostics can be 32463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * generated for cases where both rules are violated. 32473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 32483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick if (!condition->type->is_boolean() || !condition->type->is_scalar()) { 32493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick YYLTYPE loc = this->condition->get_location(); 32503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick _mesa_glsl_error(& loc, state, "if-statement condition must be scalar " 32523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick "boolean"); 32533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 32543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32551660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_if *const stmt = new(ctx) ir_if(condition); 32563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3257665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke if (then_statement != NULL) { 3258665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke state->symbols->push_scope(); 32594f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick then_statement->hir(& stmt->then_instructions, state); 3260665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke state->symbols->pop_scope(); 3261665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke } 32623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 3263665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke if (else_statement != NULL) { 3264665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke state->symbols->push_scope(); 32654f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick else_statement->hir(& stmt->else_instructions, state); 3266665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke state->symbols->pop_scope(); 3267665d75cc5a23f8024034d0c4176fb281f94a30e9Kenneth Graunke } 32683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32693c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick instructions->push_tail(stmt); 32703c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 32713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* if-statements do not have r-values. 32723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 32733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick return NULL; 32743c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick} 32759e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 32769e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 32778c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickvoid 32788c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::condition_to_hir(ir_loop *stmt, 32798c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick struct _mesa_glsl_parse_state *state) 32809e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick{ 3281953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 32821660a2954797e056caba319c5d6c70b0d4be22feCarl Worth 32839e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick if (condition != NULL) { 32849e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick ir_rvalue *const cond = 32859e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick condition->hir(& stmt->body_instructions, state); 32869e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 32879e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick if ((cond == NULL) 32889e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick || !cond->type->is_boolean() || !cond->type->is_scalar()) { 32899e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick YYLTYPE loc = condition->get_location(); 32909e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 32919e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick _mesa_glsl_error(& loc, state, 32929e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick "loop condition must be scalar boolean"); 32939e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick } else { 32949e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick /* As the first code in the loop body, generate a block that looks 32959e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick * like 'if (!condition) break;' as the loop termination condition. 32969e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick */ 32979e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick ir_rvalue *const not_cond = 32981660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_expression(ir_unop_logic_not, glsl_type::bool_type, cond, 32991660a2954797e056caba319c5d6c70b0d4be22feCarl Worth NULL); 33009e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33011660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_if *const if_stmt = new(ctx) ir_if(not_cond); 33029e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33039e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick ir_jump *const break_stmt = 33041660a2954797e056caba319c5d6c70b0d4be22feCarl Worth new(ctx) ir_loop_jump(ir_loop_jump::jump_break); 33059e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33069e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick if_stmt->then_instructions.push_tail(break_stmt); 33079e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick stmt->body_instructions.push_tail(if_stmt); 33089e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick } 33099e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick } 33108c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick} 33118c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33128c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33138c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickir_rvalue * 33148c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::hir(exec_list *instructions, 33158c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick struct _mesa_glsl_parse_state *state) 33168c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick{ 3317953ff1283d3d52e6a6b4850c2b0b574111625010Kenneth Graunke void *ctx = state; 33181660a2954797e056caba319c5d6c70b0d4be22feCarl Worth 3319484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick /* For-loops and while-loops start a new scope, but do-while loops do not. 33208c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 3321484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick if (mode != ast_do_while) 33228c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick state->symbols->push_scope(); 33238c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33248c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick if (init_statement != NULL) 33258c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick init_statement->hir(instructions, state); 33268c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33271660a2954797e056caba319c5d6c70b0d4be22feCarl Worth ir_loop *const stmt = new(ctx) ir_loop(); 33288c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick instructions->push_tail(stmt); 33298c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33308c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick /* Track the current loop and / or switch-statement nesting. 33318c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick */ 33328c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick ir_instruction *const nesting = state->loop_or_switch_nesting; 33332d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt ast_iteration_statement *nesting_ast = state->loop_or_switch_nesting_ast; 33342d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt 33358c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick state->loop_or_switch_nesting = stmt; 33362d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt state->loop_or_switch_nesting_ast = this; 33378c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 33388c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick if (mode != ast_do_while) 33398c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick condition_to_hir(stmt, state); 33409e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33414f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick if (body != NULL) 33424f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick body->hir(& stmt->body_instructions, state); 33439e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33449e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick if (rest_expression != NULL) 33459e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick rest_expression->hir(& stmt->body_instructions, state); 33469e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 33478c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick if (mode == ast_do_while) 33488c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick condition_to_hir(stmt, state); 33498c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick 3350484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick if (mode != ast_do_while) 33519e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick state->symbols->pop_scope(); 33529e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick 3353e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick /* Restore previous nesting before returning. 3354e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick */ 3355e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick state->loop_or_switch_nesting = nesting; 33562d1ed7b1b112cf13dd7eda7f500691f4c98a1cccEric Anholt state->loop_or_switch_nesting_ast = nesting_ast; 3357e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick 33589e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick /* Loops do not have r-values. 33599e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick */ 33609e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick return NULL; 33619e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick} 33623455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 33633455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 33643455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue * 33653455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_type_specifier::hir(exec_list *instructions, 33663455ce614424a5a23a23037e23d0454e476bceeaIan Romanick struct _mesa_glsl_parse_state *state) 33673455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{ 336808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (!this->is_precision_statement && this->structure == NULL) 336908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 337008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 337108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace YYLTYPE loc = this->get_location(); 337208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 337308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (this->precision != ast_precision_none 337408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace && state->language_version != 100 337508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace && state->language_version < 130) { 337608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace _mesa_glsl_error(&loc, state, 337708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "precision qualifiers exist only in " 337808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "GLSL ES 1.00, and GLSL 1.30 and later"); 337908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 338008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace } 338108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (this->precision != ast_precision_none 338208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace && this->structure != NULL) { 338308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace _mesa_glsl_error(&loc, state, 338408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "precision qualifiers do not apply to structures"); 338508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 338608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace } 338708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 338808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace /* If this is a precision statement, check that the type to which it is 338908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * applied is either float or int. 339008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * 339108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * From section 4.5.3 of the GLSL 1.30 spec: 339208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * "The precision statement 339308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * precision precision-qualifier type; 339408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * can be used to establish a default precision qualifier. The type 339508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * field can be either int or float [...]. Any other types or 339608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * qualifiers will result in an error. 339708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace */ 339808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (this->is_precision_statement) { 339908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace assert(this->precision != ast_precision_none); 340008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace assert(this->structure == NULL); /* The check for structures was 340108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace * performed above. */ 340208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (this->is_array) { 340308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace _mesa_glsl_error(&loc, state, 340408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "default precision statements do not apply to " 340508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "arrays"); 340608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 340708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace } 340808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace if (this->type_specifier != ast_float 340908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace && this->type_specifier != ast_int) { 341008a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace _mesa_glsl_error(&loc, state, 341108a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "default precision statements apply only to types " 341208a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace "float and int"); 341308a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 341408a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace } 341508a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 341608a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace /* FINISHME: Translate precision statements into IR. */ 341708a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace return NULL; 341808a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace } 341908a286c9cc8fecb081057e0f551c88a446c47b6fChad Versace 34203455ce614424a5a23a23037e23d0454e476bceeaIan Romanick if (this->structure != NULL) 34213455ce614424a5a23a23037e23d0454e476bceeaIan Romanick return this->structure->hir(instructions, state); 342285ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick 342385ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick return NULL; 34243455ce614424a5a23a23037e23d0454e476bceeaIan Romanick} 34253455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34263455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34273455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue * 34283455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_struct_specifier::hir(exec_list *instructions, 34293455ce614424a5a23a23037e23d0454e476bceeaIan Romanick struct _mesa_glsl_parse_state *state) 34303455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{ 34313455ce614424a5a23a23037e23d0454e476bceeaIan Romanick unsigned decl_count = 0; 34323455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34333455ce614424a5a23a23037e23d0454e476bceeaIan Romanick /* Make an initial pass over the list of structure fields to determine how 34343455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * many there are. Each element in this list is an ast_declarator_list. 34353455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * This means that we actually need to count the number of elements in the 34363455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * 'declarations' list in each of the elements. 34373455ce614424a5a23a23037e23d0454e476bceeaIan Romanick */ 34382b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_declarator_list, decl_list, link, 34392b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick &this->declarations) { 3440304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const (decl_ptr, & decl_list->declarations) { 34413455ce614424a5a23a23037e23d0454e476bceeaIan Romanick decl_count++; 34423455ce614424a5a23a23037e23d0454e476bceeaIan Romanick } 34433455ce614424a5a23a23037e23d0454e476bceeaIan Romanick } 34443455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34453455ce614424a5a23a23037e23d0454e476bceeaIan Romanick /* Allocate storage for the structure fields and process the field 34463455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * declarations. As the declarations are processed, try to also convert 34473455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * the types to HIR. This ensures that structure definitions embedded in 34483455ce614424a5a23a23037e23d0454e476bceeaIan Romanick * other structure definitions are processed. 34493455ce614424a5a23a23037e23d0454e476bceeaIan Romanick */ 3450d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field, 345121b0dbd79937e9d6787f045af7d60d4b6c649ec8Eric Anholt decl_count); 34523455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34533455ce614424a5a23a23037e23d0454e476bceeaIan Romanick unsigned i = 0; 34542b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_declarator_list, decl_list, link, 34552b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick &this->declarations) { 34563455ce614424a5a23a23037e23d0454e476bceeaIan Romanick const char *type_name; 34573455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34583455ce614424a5a23a23037e23d0454e476bceeaIan Romanick decl_list->type->specifier->hir(instructions, state); 34593455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 3460c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke /* Section 10.9 of the GLSL ES 1.00 specification states that 3461c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke * embedded structure definitions have been removed from the language. 3462c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke */ 3463c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke if (state->es_shader && decl_list->type->specifier->structure != NULL) { 3464c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke YYLTYPE loc = this->get_location(); 3465c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke _mesa_glsl_error(&loc, state, "Embedded structure definitions are " 3466c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke "not allowed in GLSL ES 1.00."); 3467c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke } 3468c98deb18d5836f75cf62562f9304e4d90e0ea920Kenneth Graunke 34693455ce614424a5a23a23037e23d0454e476bceeaIan Romanick const glsl_type *decl_type = 34703455ce614424a5a23a23037e23d0454e476bceeaIan Romanick decl_list->type->specifier->glsl_type(& type_name, state); 34713455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34722b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick foreach_list_typed (ast_declaration, decl, link, 34732b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick &decl_list->declarations) { 3474d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke const struct glsl_type *field_type = decl_type; 3475d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke if (decl->is_array) { 3476d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke YYLTYPE loc = decl->get_location(); 3477d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke field_type = process_array_type(&loc, decl_type, decl->array_size, 3478d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke state); 3479d8e34e29eb58c38ef60226156aab8f4a93b397b7Kenneth Graunke } 348073986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick fields[i].type = (field_type != NULL) 348173986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick ? field_type : glsl_type::error_type; 34823455ce614424a5a23a23037e23d0454e476bceeaIan Romanick fields[i].name = decl->identifier; 34833455ce614424a5a23a23037e23d0454e476bceeaIan Romanick i++; 34843455ce614424a5a23a23037e23d0454e476bceeaIan Romanick } 34853455ce614424a5a23a23037e23d0454e476bceeaIan Romanick } 34863455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 34873455ce614424a5a23a23037e23d0454e476bceeaIan Romanick assert(i == decl_count); 34883455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 348949e3577b91f44013746f7a3db411e7041b7d899eIan Romanick const glsl_type *t = 3490ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke glsl_type::get_record_instance(fields, decl_count, this->name); 34911d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick 3492ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick YYLTYPE loc = this->get_location(); 3493a789ca649cb143c0c5bf3209ff1bde398fbd777eIan Romanick if (!state->symbols->add_type(name, t)) { 3494ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name); 3495ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick } else { 3496eb639349e289a6b8be06a54f5e9e0ce18c71d511Kenneth Graunke const glsl_type **s = reralloc(state, state->user_structures, 3497eb639349e289a6b8be06a54f5e9e0ce18c71d511Kenneth Graunke const glsl_type *, 3498eb639349e289a6b8be06a54f5e9e0ce18c71d511Kenneth Graunke state->num_user_structures + 1); 3499a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick if (s != NULL) { 3500a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick s[state->num_user_structures] = t; 3501a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick state->user_structures = s; 3502a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick state->num_user_structures++; 3503a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick } 3504ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick } 35053455ce614424a5a23a23037e23d0454e476bceeaIan Romanick 35063455ce614424a5a23a23037e23d0454e476bceeaIan Romanick /* Structure type definitions do not have r-values. 35073455ce614424a5a23a23037e23d0454e476bceeaIan Romanick */ 35083455ce614424a5a23a23037e23d0454e476bceeaIan Romanick return NULL; 35093455ce614424a5a23a23037e23d0454e476bceeaIan Romanick} 3510