ast_to_hir.cpp revision 2d816204c875ace0fc363d3eeada2255a5009d5c
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 */ 51a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <stdio.h> 52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "main/imports.h" 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{ 62d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick struct simple_node *ptr; 63d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 64adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick _mesa_glsl_initialize_variables(instructions, state); 65a4e92c4b26578614d76ce71b53194ea5c0f58d6cIan Romanick _mesa_glsl_initialize_constructors(instructions, state); 66c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt _mesa_glsl_initialize_functions(instructions, state); 67adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 6841ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = NULL; 6941ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick 70d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick foreach (ptr, & state->translation_unit) { 71d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick ((ast_node *)ptr)->hir(instructions, state); 72d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick } 73d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick} 74d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 75d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick 760104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick/** 770104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is available, convert one operand to a different type 780104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 790104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * The \c from \c ir_rvalue is converted "in place". 800104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 810104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param to Type that the operand it to be converted to 820104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param from Operand that is being converted 830104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param state GLSL compiler state 840104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 850104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \return 860104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is possible (or unnecessary), \c true is returned. 870104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * Otherwise \c false is returned. 880104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 890104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanickstatic bool 90bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from, 910104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick struct _mesa_glsl_parse_state *state) 920104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick{ 93bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if (to->base_type == from->type->base_type) 940104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return true; 950104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 960104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* This conversion was added in GLSL 1.20. If the compilation mode is 970104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * GLSL 1.10, the conversion is skipped. 980104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 990104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick if (state->language_version < 120) 1000104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return false; 1010104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1020104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec: 1030104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * 1040104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * "There are no implicit array or structure conversions. For 1050104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * example, an array of int cannot be implicitly converted to an 1060104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * array of float. There are no implicit conversions between 1070104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * signed and unsigned integers." 1080104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 1090104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick /* FINISHME: The above comment is partially a lie. There is int/uint 1100104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * FINISHME: conversion for immediate constants. 1110104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */ 112bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if (!to->is_float() || !from->type->is_numeric()) 1130104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return false; 1140104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 115bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick switch (from->type->base_type) { 1160104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_INT: 117bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick from = new ir_expression(ir_unop_i2f, to, from, NULL); 1180104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick break; 1190104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_UINT: 120bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick from = new ir_expression(ir_unop_u2f, to, from, NULL); 1210104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick break; 1220104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick case GLSL_TYPE_BOOL: 1230104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick assert(!"FINISHME: Convert bool to float."); 1240104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick default: 1250104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick assert(0); 1260104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick } 1270104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1280104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return true; 1290104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick} 1300104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 1310104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 133bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickarithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, 134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool multiply, 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state) 136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 137bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick const glsl_type *const type_a = value_a->type; 138bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick const glsl_type *const type_b = value_b->type; 1390104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The arithmetic binary operators add (+), subtract (-), 143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * multiply (*), and divide (/) operate on integer and 144a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * floating-point scalars, vectors, and matrices." 145a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 14660b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick if (!type_a->is_numeric() || !type_b->is_numeric()) { 1470471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "If one operand is floating-point based and the other is 152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * not, then the conversions from Section 4.1.10 "Implicit 153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Conversions" are applied to the non-floating-point-based operand." 154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1550104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick if (!apply_implicit_conversion(type_a, value_b, state) 1560104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick && !apply_implicit_conversion(type_b, value_a, state)) { 1570104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick return glsl_type::error_type; 158a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 159a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "If the operands are integer types, they must both be signed or 161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * both be unsigned." 162a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * From this rule and the preceeding conversion it can be inferred that 164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT. 16560b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * The is_numeric check above already filtered out the case where either 16660b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * type is not one of these, so now the base types need only be tested for 16760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick * equality. 168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type_a->base_type != type_b->base_type) { 1700471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "All arithmetic binary operators result in the same fundamental type 174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * (signed integer, unsigned integer, or floating-point) as the 175a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operands they operate on, after operand type conversion. After 176a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * conversion, the following cases are valid 177a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * The two operands are scalars. In this case the operation is 179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * applied, resulting in a scalar." 180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 181cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (type_a->is_scalar() && type_b->is_scalar()) 182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* One operand is a scalar, and the other is a vector or matrix. 185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * In this case, the scalar operation is applied independently to each 186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * component of the vector or matrix, resulting in the same size 187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * vector or matrix." 188a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 189cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (type_a->is_scalar()) { 190cb36f8aaeeb09660843316270a781948f773d90bIan Romanick if (!type_b->is_scalar()) 191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_b; 192cb36f8aaeeb09660843316270a781948f773d90bIan Romanick } else if (type_b->is_scalar()) { 193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 196a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* All of the combinations of <scalar, scalar>, <vector, scalar>, 197a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been 198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * handled. 199a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 20060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(!type_a->is_scalar()); 20160b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(!type_b->is_scalar()); 202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* The two operands are vectors of the same size. In this case, the 204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operation is done component-wise resulting in the same size 205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * vector." 206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 207a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (type_a->is_vector() && type_b->is_vector()) { 2080471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return (type_a == type_b) ? type_a : glsl_type::error_type; 209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* All of the combinations of <scalar, scalar>, <vector, scalar>, 212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and 213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * <vector, vector> have been handled. At least one of the operands must 214a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * be matrix. Further, since there are no integer matrix types, the base 215a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * type of both operands must be float. 216a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 21760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick assert(type_a->is_matrix() || type_b->is_matrix()); 218a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick assert(type_a->base_type == GLSL_TYPE_FLOAT); 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick assert(type_b->base_type == GLSL_TYPE_FLOAT); 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "* The operator is add (+), subtract (-), or divide (/), and the 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operands are matrices with the same number of rows and the same 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * number of columns. In this case, the operation is done component- 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * wise resulting in the same size matrix." 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * * The operator is multiply (*), where both operands are matrices or 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * one operand is a vector and the other a matrix. A right vector 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand is treated as a column vector and a left vector operand as a 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * row vector. In all these cases, it is required that the number of 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * columns of the left operand is equal to the number of rows of the 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * right operand. Then, the multiply (*) operation does a linear 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * algebraic multiply, yielding an object that has the same number of 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * rows as the left operand and the same number of columns as the right 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand. Section 5.10 "Vector and Matrix Operations" explains in 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * more detail how vectors and matrices are operated on." 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (! multiply) { 2370471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return (type_a == type_b) ? type_a : glsl_type::error_type; 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 239fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick if (type_a->is_matrix() && type_b->is_matrix()) { 240c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* Matrix multiply. The columns of A must match the rows of B. Given 241c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the other previously tested constraints, this means the vector type 242c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * of a row from A must be the same as the vector type of a column from 243c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * B. 244c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick */ 245c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick if (type_a->row_type() == type_b->column_type()) { 246c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* The resulting matrix has the number of columns of matrix B and 247c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the number of rows of matrix A. We get the row count of A by 248c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * looking at the size of a vector that makes up a column. The 249c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * transpose (size of a row) is done for B. 250c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick */ 251c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick return 252c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick glsl_type::get_instance(type_a->base_type, 253c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick type_a->column_type()->vector_elements, 254c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick type_b->row_type()->vector_elements); 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 256fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick } else if (type_a->is_matrix()) { 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* A is a matrix and B is a column vector. Columns of A must match 258c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * rows of B. Given the other previously tested constraints, this 259c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * means the vector type of a row from A must be the same as the 260c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * vector the type of B. 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 262c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick if (type_a->row_type() == type_b) 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_b; 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 265fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick assert(type_b->is_matrix()); 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 267c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick /* A is a row vector and B is a matrix. Columns of A must match rows 268c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * of B. Given the other previously tested constraints, this means 269c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * the type of A must be the same as the vector type of a column from 270c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick * B. 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 272c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick if (type_a == type_b->column_type()) 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "All other cases are illegal." 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 2800471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickunary_arithmetic_result_type(const struct glsl_type *type) 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 57: 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The arithmetic unary operators negate (-), post- and pre-increment 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and decrement (-- and ++) operate on integer or floating-point 291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * values (including vectors and matrices). All unary operators work 292a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * component-wise on their operands. These result with the same type 293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * they operated on." 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 295a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick if (!type->is_numeric()) 2960471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type; 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickmodulus_result_type(const struct glsl_type *type_a, 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type_b) 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The operator modulus (%) operates on signed or unsigned integers or 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * integer vectors. The operand types must both be signed or both be 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * unsigned." 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 31140176e249f72b6090204611873b19aed3da67c71Ian Romanick if (!type_a->is_integer() || !type_b->is_integer() 312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (type_a->base_type != type_b->base_type)) { 3130471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The operands cannot be vectors of differing size. If one operand is 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * a scalar and the other vector, then the scalar is applied component- 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * wise to the vector, resulting in the same type as the vector. If both 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * are vectors of the same size, the result is computed component-wise." 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 321a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (type_a->is_vector()) { 322a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick if (!type_b->is_vector() 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (type_a->vector_elements == type_b->vector_elements)) 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_a; 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type_b; 327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The operator modulus (%) is not defined for any other data types 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * (non-integer types)." 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3310471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 336bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickrelational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b, 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state) 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 339bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick const glsl_type *const type_a = value_a->type; 340bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick const glsl_type *const type_b = value_b->type; 3410150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick 342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* From GLSL 1.50 spec, page 56: 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * "The relational operators greater than (>), less than (<), greater 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * than or equal (>=), and less than or equal (<=) operate only on 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalar integer and scalar floating-point expressions." 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 347a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick if (!type_a->is_numeric() 348a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick || !type_b->is_numeric() 349cb36f8aaeeb09660843316270a781948f773d90bIan Romanick || !type_a->is_scalar() 350cb36f8aaeeb09660843316270a781948f773d90bIan Romanick || !type_b->is_scalar()) 3510471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "Either the operands' types must match, or the conversions from 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Section 4.1.10 "Implicit Conversions" will be applied to the integer 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operand, after which the types must match." 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3570150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick if (!apply_implicit_conversion(type_a, value_b, state) 3580150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick && !apply_implicit_conversion(type_b, value_a, state)) { 3590150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick return glsl_type::error_type; 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type_a->base_type != type_b->base_type) 3630471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::error_type; 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* "The result is scalar Boolean." 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 3670471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick return glsl_type::bool_type; 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3710bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick/** 3720bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that a value can be assigned to a location with a specified type 3730bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 3740bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that \c rhs can be assigned to some location. If the types are 3750bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * not an exact match but an automatic conversion is possible, \c rhs will be 3760bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * converted. 3770bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 3780bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \return 3790bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type. 3800bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Otherwise the actual RHS to be assigned will be returned. This may be 3810bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c rhs, or it may be \c rhs after some type conversion. 3820bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * 3830bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \note 3840bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * In addition to being used for assignments, this function is used to 3850bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * type-check return values. 3860bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 387fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 388fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkevalidate_assignment(const glsl_type *lhs_type, ir_rvalue *rhs) 3890bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick{ 3900bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick const glsl_type *const rhs_type = rhs->type; 3910bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 3920bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* If there is already some error in the RHS, just return it. Anything 3930bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * else will lead to an avalanche of error message back to the user. 3940bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 3950bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick if (rhs_type->is_error()) 3960bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return rhs; 3970bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 3980bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* FINISHME: For GLSL 1.10, check that the types are not arrays. */ 3990bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 4000bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* If the types are identical, the assignment can trivially proceed. 4010bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */ 4020bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick if (rhs_type == lhs_type) 4030bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return rhs; 4040bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 4050bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick /* FINISHME: Check for and apply automatic conversions. */ 4060bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick return NULL; 4070bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick} 4080bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 40910a685218610e737e23d2d8a243ed6ff6613becdEric Anholtir_rvalue * 41010a685218610e737e23d2d8a243ed6ff6613becdEric Anholtdo_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, 41110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt ir_rvalue *lhs, ir_rvalue *rhs, 41210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt YYLTYPE lhs_loc) 41310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt{ 41410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt bool error_emitted = (lhs->type->is_error() || rhs->type->is_error()); 41510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 41610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt if (!error_emitted) { 41710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt /* FINISHME: This does not handle 'foo.bar.a.b.c[5].d = 5' */ 41810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt if (!lhs->is_lvalue()) { 41910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); 42010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = true; 42110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 42210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 42310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 42410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt ir_rvalue *new_rhs = validate_assignment(lhs->type, rhs); 42510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt if (new_rhs == NULL) { 42610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt _mesa_glsl_error(& lhs_loc, state, "type mismatch"); 42710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } else { 42810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt rhs = new_rhs; 42910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt } 43010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 43110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt ir_instruction *tmp = new ir_assignment(lhs, rhs, NULL); 43210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt instructions->push_tail(tmp); 43310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt 43410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt return rhs; 43510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt} 4360bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick 4375185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 4385185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick/** 4395185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick * Generate a new temporary and add its declaration to the instruction stream 4405185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick */ 4415185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickstatic ir_variable * 4425185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickgenerate_temporary(const glsl_type *type, exec_list *instructions, 4435185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick struct _mesa_glsl_parse_state *state) 4445185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick{ 4455185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick char *name = (char *) malloc(sizeof(char) * 13); 4465185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 4475185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick snprintf(name, 13, "tmp_%08X", state->temp_index); 4485185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick state->temp_index++; 4495185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 4505185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick ir_variable *const var = new ir_variable(type, name); 4515185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick instructions->push_tail(var); 4525185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 4535185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick return var; 4545185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick} 4555185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 4565185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick 457de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtstatic ir_rvalue * 458de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtget_lvalue_copy(exec_list *instructions, struct _mesa_glsl_parse_state *state, 459de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_rvalue *lvalue, YYLTYPE loc) 460de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt{ 461de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_variable *var; 462de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_rvalue *var_deref; 463de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 464de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt /* FINISHME: Give unique names to the temporaries. */ 465de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var = new ir_variable(lvalue->type, "_internal_tmp"); 466de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var->mode = ir_var_auto; 467de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 468de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var_deref = new ir_dereference(var); 469de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt do_assignment(instructions, state, var_deref, lvalue, loc); 470de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 471de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt /* Once we've created this temporary, mark it read only so it's no 472de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt * longer considered an lvalue. 473de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt */ 474de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt var->read_only = true; 475de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 476de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt return var_deref; 477de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt} 478de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 479de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 480fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 4810044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_node::hir(exec_list *instructions, 48218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 48318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick{ 48418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (void) instructions; 48518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (void) state; 48618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 48718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick return NULL; 48818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick} 48918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 49018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick 491fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 4920044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression::hir(exec_list *instructions, 49318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick static const int operations[AST_NUM_OPERATORS] = { 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_assign doesn't convert to ir_expression. */ 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_plus doesn't convert to ir_expression. */ 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_equal, 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_nequal, 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Note: The following block of expression types actually convert 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to multiple IR instructions. 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, /* ast_mul_assign */ 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, /* ast_div_assign */ 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, /* ast_mod_assign */ 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, /* ast_add_assign */ 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, /* ast_sub_assign */ 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, /* ast_ls_assign */ 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, /* ast_rs_assign */ 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, /* ast_and_assign */ 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, /* ast_xor_assign */ 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, /* ast_or_assign */ 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_conditional doesn't convert to ir_expression. */ 536de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_add, /* ast_pre_inc. */ 537de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_sub, /* ast_pre_dec. */ 538de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_add, /* ast_post_inc. */ 539de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt ir_binop_sub, /* ast_post_dec. */ 540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_field_selection doesn't conv to ir_expression. */ 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_array_index doesn't convert to ir_expression. */ 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_function_call doesn't conv to ir_expression. */ 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_identifier doesn't convert to ir_expression. */ 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_int_constant doesn't convert to ir_expression. */ 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_uint_constant doesn't conv to ir_expression. */ 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_float_constant doesn't conv to ir_expression. */ 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_bool_constant doesn't conv to ir_expression. */ 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick -1, /* ast_sequence doesn't convert to ir_expression. */ 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick }; 550fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *result = NULL; 551fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *op[2]; 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node op_list; 5530471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick const struct glsl_type *type = glsl_type::error_type; 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick bool error_emitted = false; 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick YYLTYPE loc; 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 55718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick loc = this->get_location(); 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick make_empty_list(& op_list); 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 56018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick switch (this->oper) { 5616652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick case ast_assign: { 56218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 56318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 56510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt result = do_assignment(instructions, state, op[0], op[1], 56610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt this->subexpressions[0]->get_location()); 56710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = result->type->is_error(); 56810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt type = result->type; 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 5706652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick } 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_plus: 57318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 575a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick error_emitted = op[0]->type->is_error(); 576a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick if (type->is_error()) 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick op[0]->type = type; 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick result = op[0]; 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_neg: 58318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = unary_arithmetic_result_type(op[0]->type); 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 587a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick error_emitted = op[0]->type->is_error(); 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 58918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_expression(operations[this->oper], type, 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick op[0], NULL); 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_add: 594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sub: 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mul: 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_div: 59718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 59818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 600bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], 60118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (this->oper == ast_mul), 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick state); 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 60418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_expression(operations[this->oper], type, 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick op[0], op[1]); 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mod: 60918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 61018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 612a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = modulus_result_type(op[0]->type, op[1]->type); 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 61618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick assert(operations[this->oper] == ir_binop_mod); 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 61818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_expression(operations[this->oper], type, 619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick op[0], op[1]); 620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_lshift: 623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_rshift: 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Implement bit-shift operators. */ 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_less: 628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_greater: 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_lequal: 630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_gequal: 63118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 63218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 634a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 636bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = relational_result_type(op[0], op[1], state); 637a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* The relational operators must either generate an error or result 639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * in a scalar boolean. See page 57 of the GLSL 1.50 spec. 640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 641a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick assert(type->is_error() 642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || ((type->base_type == GLSL_TYPE_BOOL) 643cb36f8aaeeb09660843316270a781948f773d90bIan Romanick && type->is_scalar())); 644a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 64518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_expression(operations[this->oper], type, 646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick op[0], op[1]); 647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_nequal: 650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_equal: 6516e659caaa946339a2de3890a8bed091ccb65102aIan Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 6526e659caaa946339a2de3890a8bed091ccb65102aIan Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 6536e659caaa946339a2de3890a8bed091ccb65102aIan Romanick 6546e659caaa946339a2de3890a8bed091ccb65102aIan Romanick /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec: 6556e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * 6566e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * "The equality operators equal (==), and not equal (!=) 6576e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * operate on all types. They result in a scalar Boolean. If 6586e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * the operand types do not match, then there must be a 6596e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * conversion from Section 4.1.10 "Implicit Conversions" 6606e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * applied to one operand that can make them match, in which 6616e659caaa946339a2de3890a8bed091ccb65102aIan Romanick * case this conversion is done." 6626e659caaa946339a2de3890a8bed091ccb65102aIan Romanick */ 663bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if ((!apply_implicit_conversion(op[0]->type, op[1], state) 664bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick && !apply_implicit_conversion(op[1]->type, op[0], state)) 665212b0327b47033442842a7be3d7fb10e08e2bf66Ian Romanick || (op[0]->type != op[1]->type)) { 6666e659caaa946339a2de3890a8bed091ccb65102aIan Romanick _mesa_glsl_error(& loc, state, "operands of `%s' must have the same " 6676e659caaa946339a2de3890a8bed091ccb65102aIan Romanick "type", (this->oper == ast_equal) ? "==" : "!="); 6686e659caaa946339a2de3890a8bed091ccb65102aIan Romanick error_emitted = true; 6696e659caaa946339a2de3890a8bed091ccb65102aIan Romanick } 6706e659caaa946339a2de3890a8bed091ccb65102aIan Romanick 6716e659caaa946339a2de3890a8bed091ccb65102aIan Romanick result = new ir_expression(operations[this->oper], glsl_type::bool_type, 6726e659caaa946339a2de3890a8bed091ccb65102aIan Romanick op[0], op[1]); 6736e659caaa946339a2de3890a8bed091ccb65102aIan Romanick type = glsl_type::bool_type; 6746e659caaa946339a2de3890a8bed091ccb65102aIan Romanick 6756e659caaa946339a2de3890a8bed091ccb65102aIan Romanick assert(result->type == glsl_type::bool_type); 676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_and: 679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_xor: 680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_or: 681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_not: 682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Implement bit-wise operators. */ 683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_logic_and: 686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_logic_xor: 687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_logic_or: 688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_logic_not: 689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Implement logical operators. */ 690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mul_assign: 693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_div_assign: 694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_add_assign: 695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sub_assign: { 69618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 69718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick op[1] = this->subexpressions[1]->hir(instructions, state); 698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 699bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], 70018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick (this->oper == ast_mul_assign), 701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick state); 702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 703fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *temp_rhs = new ir_expression(operations[this->oper], type, 704fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke op[0], op[1]); 705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 70610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt result = do_assignment(instructions, state, op[0], temp_rhs, 70710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt this->subexpressions[0]->get_location()); 70810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt type = result->type; 70910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt error_emitted = (op[0]->type->is_error()); 710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* GLSL 1.10 does not allow array assignment. However, we don't have to 712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * explicitly test for this because none of the binary expression 713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * operators allow array operands either. 714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 71948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt case ast_mod_assign: { 72048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 72148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt op[1] = this->subexpressions[1]->hir(instructions, state); 72248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 72348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 72448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 72548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt type = modulus_result_type(op[0]->type, op[1]->type); 72648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 72748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt assert(operations[this->oper] == ir_binop_mod); 72848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 72948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt struct ir_rvalue *temp_rhs; 73048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt temp_rhs = new ir_expression(operations[this->oper], type, 73148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt op[0], op[1]); 73248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt 73348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt result = do_assignment(instructions, state, op[0], temp_rhs, 73448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt this->subexpressions[0]->get_location()); 73548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt type = result->type; 73648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt error_emitted = op[0]->type->is_error(); 73748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt break; 73848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt } 739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_ls_assign: 741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_rs_assign: 742251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_and_assign: 745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_xor_assign: 746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_or_assign: 747251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 74996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick case ast_conditional: { 75096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick op[0] = this->subexpressions[0]->hir(instructions, state); 75196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 75296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: 75396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * 75496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * "The ternary selection operator (?:). It operates on three 75596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * expressions (exp1 ? exp2 : exp3). This operator evaluates the 75696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * first expression, which must result in a scalar Boolean." 75796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 75896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) { 75996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick YYLTYPE loc = this->subexpressions[0]->get_location(); 76096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 76196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick _mesa_glsl_error(& loc, state, "?: condition must be scalar boolean"); 76296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick error_emitted = true; 76396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick } 76496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 76596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* The :? operator is implemented by generating an anonymous temporary 76696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * followed by an if-statement. The last instruction in each branch of 76796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * the if-statement assigns a value to the anonymous temporary. This 76896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * temporary is the r-value of the expression. 76996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 77096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_variable *const tmp = generate_temporary(glsl_type::error_type, 77196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick instructions, state); 77296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 77396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_if *const stmt = new ir_if(op[0]); 77496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick instructions->push_tail(stmt); 77596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 77696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick op[1] = this->subexpressions[1]->hir(& stmt->then_instructions, state); 77796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_dereference *const then_deref = new ir_dereference(tmp); 77896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_assignment *const then_assign = 77996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick new ir_assignment(then_deref, op[1], NULL); 78096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick stmt->then_instructions.push_tail(then_assign); 78196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 78296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick op[2] = this->subexpressions[2]->hir(& stmt->else_instructions, state); 78396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_dereference *const else_deref = new ir_dereference(tmp); 78496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick ir_assignment *const else_assign = 78596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick new ir_assignment(else_deref, op[2], NULL); 78696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick stmt->else_instructions.push_tail(else_assign); 78796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 78896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec: 78996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * 79096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * "The second and third expressions can be any type, as 79196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * long their types match, or there is a conversion in 79296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * Section 4.1.10 "Implicit Conversions" that can be applied 79396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * to one of the expressions to make their types match. This 79496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * resulting matching type is the type of the entire 79596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick * expression." 79696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick */ 797bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick if ((!apply_implicit_conversion(op[1]->type, op[2], state) 798bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick && !apply_implicit_conversion(op[2]->type, op[1], state)) 799db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick || (op[1]->type != op[2]->type)) { 80096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick YYLTYPE loc = this->subexpressions[1]->get_location(); 80196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 80296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick _mesa_glsl_error(& loc, state, "Second and third operands of ?: " 80396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick "operator must have matching types."); 80496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick error_emitted = true; 805db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick } else { 806db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick tmp->type = op[1]->type; 80796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick } 80896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick 80996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick result = new ir_dereference(tmp); 81096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick type = tmp->type; 811251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick break; 81296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick } 813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_pre_inc: 81576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt case ast_pre_dec: { 81676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 81776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt if (op[0]->type->base_type == GLSL_TYPE_FLOAT) 81876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt op[1] = new ir_constant(1.0f); 81976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt else 82076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt op[1] = new ir_constant(1); 82176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 822bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], false, state); 82376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 82476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt struct ir_rvalue *temp_rhs; 82576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt temp_rhs = new ir_expression(operations[this->oper], type, 82676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt op[0], op[1]); 82776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt 82876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt result = do_assignment(instructions, state, op[0], temp_rhs, 82976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt this->subexpressions[0]->get_location()); 83076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt type = result->type; 83176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt error_emitted = op[0]->type->is_error(); 83276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt break; 83376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt } 834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_post_inc: 836de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt case ast_post_dec: { 837de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt op[0] = this->subexpressions[0]->hir(instructions, state); 838de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt if (op[0]->type->base_type == GLSL_TYPE_FLOAT) 839de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt op[1] = new ir_constant(1.0f); 840de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt else 841de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt op[1] = new ir_constant(1); 842de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 843de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt error_emitted = op[0]->type->is_error() || op[1]->type->is_error(); 844de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 845bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick type = arithmetic_result_type(op[0], op[1], false, state); 846de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 847de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt struct ir_rvalue *temp_rhs; 848de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt temp_rhs = new ir_expression(operations[this->oper], type, 849de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt op[0], op[1]); 850de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 851de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt /* Get a temporary of a copy of the lvalue before it's modified. 852de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt * This may get thrown away later. 853de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt */ 854de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt result = get_lvalue_copy(instructions, state, op[0], 855de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt this->subexpressions[0]->get_location()); 856de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 857de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt (void)do_assignment(instructions, state, op[0], temp_rhs, 858de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt this->subexpressions[0]->get_location()); 859de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt 860de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt type = result->type; 861de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt error_emitted = op[0]->type->is_error(); 862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 863de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt } 864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_field_selection: 86618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = _mesa_ast_field_selection_to_hir(this, instructions, state); 867a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = result->type; 868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_array_index: 871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_function_call: 8747cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick /* Should *NEVER* get here. ast_function_call should always be handled 8757cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick * by ast_function_expression::hir. 876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 8777cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick assert(0); 878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 880a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_identifier: { 881a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* ast_identifier can appear several places in a full abstract syntax 882a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * tree. This particular use must be at location specified in the grammar 883a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * as 'variable_identifier'. 884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 8858bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick ir_variable *var = 8868bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->get_variable(this->primary_expression.identifier); 887a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick result = new ir_dereference(var); 889a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 890a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (var != NULL) { 891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = result->type; 892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 89371d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick _mesa_glsl_error(& loc, state, "`%s' undeclared", 89418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick this->primary_expression.identifier); 895a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick error_emitted = true; 897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 901a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_int_constant: 9020471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::int_type; 90318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_constant(type, & this->primary_expression); 904a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 906a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_uint_constant: 9070471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::uint_type; 90818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_constant(type, & this->primary_expression); 909a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 910a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 911a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_float_constant: 9120471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::float_type; 91318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_constant(type, & this->primary_expression); 914a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bool_constant: 9170471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::bool_type; 91818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = new ir_constant(type, & this->primary_expression); 919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sequence: { 922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node *ptr; 923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* It should not be possible to generate a sequence in the AST without 925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * any expressions in it. 926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 92718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick assert(!is_empty_list(&this->expressions)); 928a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 929a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* The r-value of a sequence is the last expression in the sequence. If 930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the other expressions in the sequence do not have side-effects (and 931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * therefore add instructions to the instruction list), they get dropped 932a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * on the floor. 933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 93418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick foreach (ptr, &this->expressions) 93518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick result = ((ast_node *)ptr)->hir(instructions, state); 936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = result->type; 938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Any errors should have already been emitted in the loop above. 940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick error_emitted = true; 942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 946cef3baecf636a30b62cd7a1e8de57c7650f7003eIan Romanick if (type->is_error() && !error_emitted) 94771d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick _mesa_glsl_error(& loc, state, "type mismatch"); 948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return result; 950a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 951a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 953fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 9540044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression_statement::hir(exec_list *instructions, 95518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 956a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* It is possible to have expression statements that don't have an 958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * expression. This is the solitary semicolon: 959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * for (i = 0; i < 5; i++) 961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * ; 962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * In this case the expression will be NULL. Test for NULL and don't do 964a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * anything in that case. 965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 96618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (expression != NULL) 96718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick expression->hir(instructions, state); 968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Statements do not have r-values. 970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 971a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 973a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 975fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 9760044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_compound_statement::hir(exec_list *instructions, 97718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 978a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node *ptr; 980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 98218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (new_scope) 9838bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->push_scope(); 984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 98518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick foreach (ptr, &statements) 98618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ((ast_node *)ptr)->hir(instructions, state); 987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 98818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick if (new_scope) 9898bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->pop_scope(); 990a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 991a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Compound statements do not have r-values. 992a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 993a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 994a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 995a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type * 998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanicktype_specifier_to_glsl_type(const struct ast_type_specifier *spec, 999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char **name, 1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state) 1001a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct glsl_type *type; 1003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1004a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (spec->type_specifier == ast_struct) { 1005a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Handle annonymous structures. */ 1006a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type = NULL; 1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 10088bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick type = state->symbols->get_type(spec->type_name); 10097f9d30974317a4050fb8990ce1a3eebbb190483aIan Romanick *name = spec->type_name; 1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1011a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Handle array declarations. Note that this requires complete 1012f3f111eac45162e9634208cd7305981d8393328dIan Romanick * FINISHME: handling of constant expressions. 1013a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1014a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return type; 1017a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1018a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1019a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1020a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 1021a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickapply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, 1022a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ir_variable *var, 10232e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt struct _mesa_glsl_parse_state *state, 10242e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt YYLTYPE *loc) 1025a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1026a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (qual->invariant) 1027a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->invariant = 1; 1028a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1029a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Mark 'in' variables at global scope as read-only. */ 1030a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (qual->constant || qual->attribute || qual->uniform 1031a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (qual->varying && (state->target == fragment_shader))) 1032a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->read_only = 1; 1033a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1034a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (qual->centroid) 1035a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->centroid = 1; 1036a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10372e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt if (qual->attribute && state->target == fragment_shader) { 10382e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt var->type = glsl_type::error_type; 10392e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt _mesa_glsl_error(loc, state, 10402e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt "`attribute' variables may not be declared in the " 10412e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt "fragment shader"); 10422e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt } 10432e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt 1044a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (qual->in && qual->out) 1045a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_inout; 1046a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else if (qual->attribute || qual->in 1047a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick || (qual->varying && (state->target == fragment_shader))) 1048a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_in; 10490b678234625fac67a89285ad2871dedc891fb1b1Ian Romanick else if (qual->out || (qual->varying && (state->target == vertex_shader))) 1050a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_out; 1051a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else if (qual->uniform) 1052a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_uniform; 1053a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else 1054a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->mode = ir_var_auto; 1055a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1056a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (qual->flat) 1057a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_flat; 1058a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else if (qual->noperspective) 1059a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_noperspective; 1060a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else 1061a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var->interpolation = ir_var_smooth; 1062a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1063a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1064a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1065fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 10660044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_declarator_list::hir(exec_list *instructions, 106718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 1068a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1069a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node *ptr; 1070a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *decl_type; 1071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *type_name = NULL; 1072a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1073a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1074a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Handle vertex shader "invariant" declarations that do not 1075a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: include a type. These re-declare built-in variables to be 1076a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: invariant. 1077a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1078a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 107918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick decl_type = type_specifier_to_glsl_type(this->type->specifier, 1080a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick & type_name, state); 1081a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 108218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick foreach (ptr, &this->declarations) { 1083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ast_declaration *const decl = (struct ast_declaration * )ptr; 1084a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *var_type; 1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct ir_variable *var; 10862e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt YYLTYPE loc = this->get_location(); 1087a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1088a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Emit a warning if a variable declaration shadows a 1089a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: declaration at a higher scope. 1090a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1091a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1092cec65a6b76290ee4da91691bd3ef01c3fb8a0c37Ian Romanick if ((decl_type == NULL) || decl_type->is_void()) { 1093a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type_name != NULL) { 1094a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 1095a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type `%s' in declaration of `%s'", 1096a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type_name, decl->identifier); 1097a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 1098a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 1099a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type in declaration of `%s'", 1100a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick decl->identifier); 1101a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick continue; 1103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1105a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (decl->is_array) { 1106a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Handle array declarations. Note that this requires 1107a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: complete handling of constant expressions. 1108a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 11098518e75d289638b10cb9350f287ccbdf1c927040Eric Anholt var_type = glsl_type::error_type; 1110a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1111a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Reject delcarations of multidimensional arrays. */ 1112a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 1113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var_type = decl_type; 1114a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick var = new ir_variable(var_type, decl->identifier); 1117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1118f3f111eac45162e9634208cd7305981d8393328dIan Romanick /* FINISHME: Variables that are attribute, uniform, varying, in, or 1119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: out varibles must be declared either at global scope or 1120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: in a parameter list (in and out only). 1121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11232e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt apply_type_qualifier_to_variable(& this->type->qualifier, var, state, 11242e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt & loc); 1125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1126a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Attempt to add the variable to the symbol table. If this fails, it 1127a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * means the variable has already been declared at this scope. 1128a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 11293359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick if (state->symbols->name_declared_this_scope(decl->identifier)) { 113018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick YYLTYPE loc = this->get_location(); 1131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, "`%s' redeclared", 1133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick decl->identifier); 1134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick continue; 1135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1136a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 11370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick instructions->push_tail(var); 1138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1139fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if (this->type->qualifier.attribute 1140fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick && (state->current_function != NULL)) { 1141fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick _mesa_glsl_error(& loc, state, 1142fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "attribute variable `%s' must be declared at global " 1143fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "scope", 1144fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick var->name); 1145fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 1146fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 1147fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if ((var->mode == ir_var_in) && (state->current_function == NULL)) { 1148fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if (state->target == vertex_shader) { 1149fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick bool error_emitted = false; 1150fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 1151fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: 1152fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 1153fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * "Vertex shader inputs can only be float, floating-point 1154fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * vectors, matrices, signed and unsigned integers and integer 1155fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * vectors. Vertex shader inputs can also form arrays of these 1156fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * types, but not structures." 1157fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 11582d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec: 11592d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * 11602d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * "Vertex shader inputs can only be float, floating-point 11612d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * vectors, matrices, signed and unsigned integers and integer 11622d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * vectors. They cannot be arrays or structures." 11632d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick * 1164fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec: 1165fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * 1166fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * "The attribute qualifier can be used only with float, 1167fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * floating-point vectors, and matrices. Attribute variables 1168fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick * cannot be declared as arrays or structures." 1169fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick */ 1170fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick const glsl_type *check_type = var->type->is_array() 1171fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick ? var->type->fields.array : var->type; 1172fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 1173fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick switch (check_type->base_type) { 1174fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_FLOAT: 1175fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick break; 1176fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_UINT: 1177fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick case GLSL_TYPE_INT: 1178fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick if (state->language_version > 120) 1179fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick break; 1180fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick /* FALLTHROUGH */ 1181fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick default: 1182fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick _mesa_glsl_error(& loc, state, 1183fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "vertex shader input / attribute cannot have " 1184fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "type %s`%s'", 1185fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick var->type->is_array() ? "array of " : "", 1186fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick check_type->name); 1187fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick error_emitted = true; 1188fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 1189fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 11902d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick if (!error_emitted && (state->language_version <= 130) 1191fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick && var->type->is_array()) { 1192fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick _mesa_glsl_error(& loc, state, 1193fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "vertex shader input / attribute cannot have " 1194fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick "array type"); 1195fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick error_emitted = true; 1196fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 1197fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 1198fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick } 1199fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick 120066faec4895b7bb59a614087a200c05157191b4aeIan Romanick if (decl->initializer != NULL) { 120143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick YYLTYPE initializer_loc = decl->initializer->get_location(); 120243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick 120366faec4895b7bb59a614087a200c05157191b4aeIan Romanick /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec: 120466faec4895b7bb59a614087a200c05157191b4aeIan Romanick * 120566faec4895b7bb59a614087a200c05157191b4aeIan Romanick * "All uniform variables are read-only and are initialized either 120666faec4895b7bb59a614087a200c05157191b4aeIan Romanick * directly by an application via API commands, or indirectly by 120766faec4895b7bb59a614087a200c05157191b4aeIan Romanick * OpenGL." 120866faec4895b7bb59a614087a200c05157191b4aeIan Romanick */ 120966faec4895b7bb59a614087a200c05157191b4aeIan Romanick if ((state->language_version <= 110) 121066faec4895b7bb59a614087a200c05157191b4aeIan Romanick && (var->mode == ir_var_uniform)) { 121143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick _mesa_glsl_error(& initializer_loc, state, 121243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick "cannot initialize uniforms in GLSL 1.10"); 121343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick } 121443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick 121543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick if (var->type->is_sampler()) { 121643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick _mesa_glsl_error(& initializer_loc, state, 121743de17282017bdf187d6e646de3262cc64b7f46bIan Romanick "cannot initialize samplers"); 121843de17282017bdf187d6e646de3262cc64b7f46bIan Romanick } 121919360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick 122043de17282017bdf187d6e646de3262cc64b7f46bIan Romanick if ((var->mode == ir_var_in) && (state->current_function == NULL)) { 122143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick _mesa_glsl_error(& initializer_loc, state, 122243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick "cannot initialize %s shader input / %s", 122343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick (state->target == vertex_shader) 122443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick ? "vertex" : "fragment", 122543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick (state->target == vertex_shader) 122643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick ? "attribute" : "varying"); 122766faec4895b7bb59a614087a200c05157191b4aeIan Romanick } 122866faec4895b7bb59a614087a200c05157191b4aeIan Romanick 122966faec4895b7bb59a614087a200c05157191b4aeIan Romanick ir_dereference *const lhs = new ir_dereference(var); 123066faec4895b7bb59a614087a200c05157191b4aeIan Romanick ir_rvalue *const rhs = decl->initializer->hir(instructions, state); 123119360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick 123266faec4895b7bb59a614087a200c05157191b4aeIan Romanick /* FINISHME: If the declaration is either 'const' or 'uniform', the 123366faec4895b7bb59a614087a200c05157191b4aeIan Romanick * FINISHME: initializer (rhs) must be a constant expression. 123466faec4895b7bb59a614087a200c05157191b4aeIan Romanick */ 123566faec4895b7bb59a614087a200c05157191b4aeIan Romanick 123666faec4895b7bb59a614087a200c05157191b4aeIan Romanick if (!rhs->type->is_error()) { 123766faec4895b7bb59a614087a200c05157191b4aeIan Romanick (void) do_assignment(instructions, state, lhs, rhs, 123866faec4895b7bb59a614087a200c05157191b4aeIan Romanick this->get_location()); 123966faec4895b7bb59a614087a200c05157191b4aeIan Romanick } 124066faec4895b7bb59a614087a200c05157191b4aeIan Romanick } 124117d86f4371da413176ba365ca26a58bac172d365Ian Romanick 124217d86f4371da413176ba365ca26a58bac172d365Ian Romanick /* Add the vairable to the symbol table after processing the initializer. 124317d86f4371da413176ba365ca26a58bac172d365Ian Romanick * This differs from most C-like languages, but it follows the GLSL 124417d86f4371da413176ba365ca26a58bac172d365Ian Romanick * specification. From page 28 (page 34 of the PDF) of the GLSL 1.50 124517d86f4371da413176ba365ca26a58bac172d365Ian Romanick * spec: 124617d86f4371da413176ba365ca26a58bac172d365Ian Romanick * 124717d86f4371da413176ba365ca26a58bac172d365Ian Romanick * "Within a declaration, the scope of a name starts immediately 124817d86f4371da413176ba365ca26a58bac172d365Ian Romanick * after the initializer if present or immediately after the name 124917d86f4371da413176ba365ca26a58bac172d365Ian Romanick * being declared if not." 125017d86f4371da413176ba365ca26a58bac172d365Ian Romanick */ 125117d86f4371da413176ba365ca26a58bac172d365Ian Romanick const bool added_variable = 125217d86f4371da413176ba365ca26a58bac172d365Ian Romanick state->symbols->add_variable(decl->identifier, var); 125317d86f4371da413176ba365ca26a58bac172d365Ian Romanick assert(added_variable); 1254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Variable declarations do not have r-values. 1257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 1259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1262fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 12630044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_parameter_declarator::hir(exec_list *instructions, 126418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 1265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 1267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name = NULL; 12682e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt YYLTYPE loc = this->get_location(); 1269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 127018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick type = type_specifier_to_glsl_type(this->type->specifier, & name, state); 1271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type == NULL) { 1273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (name != NULL) { 1274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 1275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type `%s' in declaration of `%s'", 127618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick name, this->identifier); 1277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 1278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_glsl_error(& loc, state, 1279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick "invalid type in declaration of `%s'", 128018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick this->identifier); 1281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12830471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick type = glsl_type::error_type; 1284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 128618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ir_variable *var = new ir_variable(type, this->identifier); 1287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Handle array declarations. Note that this requires 1289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FINISHME: complete handling of constant expressions. 1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1292cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick /* Apply any specified qualifiers to the parameter declaration. Note that 1293cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick * for function parameters the default mode is 'in'. 1294cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick */ 12952e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc); 1296cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick if (var->mode == ir_var_auto) 1297cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick var->mode = ir_var_in; 1298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12990044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick instructions->push_tail(var); 1300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Parameter declarations do not have r-values. 1302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 1304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 1308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function_parameters_to_hir(struct simple_node *ast_parameters, 13090044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list *ir_parameters, 1310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct _mesa_glsl_parse_state *state) 1311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 1312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick struct simple_node *ptr; 1313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick foreach (ptr, ast_parameters) { 131518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ((ast_node *)ptr)->hir(ir_parameters, state); 1316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic bool 13210044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickparameter_lists_match(exec_list *list_a, exec_list *list_b) 1322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 13230044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list_iterator iter_a = list_a->iterator(); 13240044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list_iterator iter_b = list_b->iterator(); 1325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 13260044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick while (iter_a.has_next()) { 1327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* If all of the parameters from the other parameter list have been 1328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * exhausted, the lists have different length and, by definition, 1329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * do not match. 1330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 13310044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick if (!iter_b.has_next()) 1332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return false; 1333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* If the types of the parameters do not match, the parameters lists 1335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * are different. 1336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME */ 1338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 13400044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick iter_a.next(); 13410044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick iter_b.next(); 1342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return true; 1345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 1346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1348fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 13490044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_function_definition::hir(exec_list *instructions, 135018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick struct _mesa_glsl_parse_state *state) 1351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 135218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ir_label *label; 135318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ir_function_signature *signature = NULL; 135418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ir_function *f = NULL; 13550044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick exec_list parameters; 1356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Convert the list of function parameters to HIR now so that they can be 1359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * used below to compare this function's signature with previously seen 1360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * signatures for functions with the same name. 1361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 136218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ast_function_parameters_to_hir(& this->prototype->parameters, & parameters, 1363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick state); 1364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1365e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick const char *return_type_name; 1366e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick const glsl_type *return_type = 1367e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick type_specifier_to_glsl_type(this->prototype->return_type->specifier, 1368e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick & return_type_name, state); 1369e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick 1370e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick assert(return_type != NULL); 1371e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick 1372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Verify that this function's signature either doesn't match a previously 1373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * seen signature for a function with the same name, or, if a match is found, 1374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * that the previously seen signature does not have an associated definition. 1375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 13763359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick const char *const name = this->prototype->identifier; 13773359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick f = state->symbols->get_function(name); 1378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (f != NULL) { 13790044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick foreach_iter(exec_list_iterator, iter, f->signatures) { 13800044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick signature = (struct ir_function_signature *) iter.get(); 1381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Compare the parameter list of the function being defined to the 1383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * existing function. If the parameter lists match, then the return 1384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * type must also match and the existing function must not have a 1385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * definition. 1386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (parameter_lists_match(& parameters, & signature->parameters)) { 1388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Compare return types. */ 1389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (signature->definition != NULL) { 139118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick YYLTYPE loc = this->get_location(); 1392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 13933359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick _mesa_glsl_error(& loc, state, "function `%s' redefined", name); 1394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick signature = NULL; 1395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 1396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick signature = NULL; 1400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14023359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick } else if (state->symbols->name_declared_this_scope(name)) { 14033359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick /* This function name shadows a non-function use of the same name. 14043359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick */ 14053359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick YYLTYPE loc = this->get_location(); 14063359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick 14073359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick _mesa_glsl_error(& loc, state, "function name `%s' conflicts with " 14083359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick "non-function", name); 14093359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick signature = NULL; 1410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 1411882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick f = new ir_function(name); 14128bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->add_function(f->name, f); 1413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1415ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt /* Verify the return type of main() */ 1416ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt if (strcmp(name, "main") == 0) { 1417ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt if (return_type != glsl_type::get_instance(GLSL_TYPE_VOID, 0, 0)) { 1418ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt YYLTYPE loc = this->get_location(); 1419ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt 1420ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt _mesa_glsl_error(& loc, state, "main() must return void"); 1421ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt } 1422ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt } 1423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Finish storing the information about this new function in its signature. 1425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (signature == NULL) { 1427e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick signature = new ir_function_signature(return_type); 14280044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick f->signatures.push_tail(signature); 1429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } else { 1430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Destroy all of the previous parameter information. The previous 1431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parameter information comes from the function prototype, and it can 1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * either include invalid parameter names or may not have names at all. 1433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 14340044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick foreach_iter(exec_list_iterator, iter, signature->parameters) { 143544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke assert(((ir_instruction *) iter.get())->as_variable() != NULL); 1436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick iter.remove(); 14380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick delete iter.get(); 1439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 144341ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick assert(state->current_function == NULL); 144441ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = signature; 144541ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick 144618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick ast_function_parameters_to_hir(& this->prototype->parameters, 1447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick & signature->parameters, 1448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick state); 1449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* FINISHME: Set signature->return_type */ 1450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14513359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick label = new ir_label(name); 1452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (signature->definition == NULL) { 1453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick signature->definition = label; 1454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 14550044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick instructions->push_tail(label); 1456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Add the function parameters to the symbol table. During this step the 1458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parameter declarations are also moved from the temporary "parameters" list 1459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to the instruction list. There are other more efficient ways to do this, 1460a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * but they involve ugly linked-list gymnastics. 1461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 14628bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->push_scope(); 14630044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick foreach_iter(exec_list_iterator, iter, parameters) { 14640044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick ir_variable *const var = (ir_variable *) iter.get(); 1465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 146644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke assert(((ir_instruction *) var)->as_variable() != NULL); 1467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14680044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick iter.remove(); 14690044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick instructions->push_tail(var); 1470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14713359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick /* The only way a parameter would "exist" is if two parameters have 14723359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick * the same name. 14733359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick */ 14743359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick if (state->symbols->name_declared_this_scope(var->name)) { 14753359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick YYLTYPE loc = this->get_location(); 14763359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick 14773359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name); 14783359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick } else { 14793359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick state->symbols->add_variable(var->name, var); 14803359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick } 1481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 1482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Convert the body of the function to HIR, and append the resulting 1484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * instructions to the list that currently consists of the function label 1485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and the function parameters. 1486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 148718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick this->body->hir(instructions, state); 1488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 14898bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick state->symbols->pop_scope(); 1490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 149141ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick assert(state->current_function == signature); 149241ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick state->current_function = NULL; 1493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* Function definitions do not have r-values. 1495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return NULL; 1497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 149816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 149916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 1500fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue * 150116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanickast_jump_statement::hir(exec_list *instructions, 150216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick struct _mesa_glsl_parse_state *state) 150316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick{ 150416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 150516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick if (mode == ast_return) { 150616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick ir_return *inst; 150716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 150816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick if (opt_return_value) { 150916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick /* FINISHME: Make sure the enclosing function has a non-void return 151016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick * FINISHME: type. 151116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick */ 151216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 151316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick ir_expression *const ret = (ir_expression *) 151416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick opt_return_value->hir(instructions, state); 151516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick assert(ret != NULL); 151616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 151716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick /* FINISHME: Make sure the type of the return value matches the return 151816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick * FINISHME: type of the enclosing function. 151916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick */ 152016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 152116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick inst = new ir_return(ret); 152216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } else { 152316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick /* FINISHME: Make sure the enclosing function has a void return type. 152416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick */ 152516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick inst = new ir_return; 152616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } 152716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 152816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick instructions->push_tail(inst); 152916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick } 153016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick 153116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick /* Jump instructions do not have r-values. 153216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick */ 153316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick return NULL; 153416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick} 15353c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15363c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_rvalue * 15383c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickast_selection_statement::hir(exec_list *instructions, 15393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct _mesa_glsl_parse_state *state) 15403c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{ 15413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *const condition = this->condition->hir(instructions, state); 15423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick struct simple_node *ptr; 15433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec: 15453c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * 15463c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * "Any expression whose type evaluates to a Boolean can be used as the 15473c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * conditional expression bool-expression. Vector types are not accepted 15483c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * as the expression to if." 15493c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * 15503c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * The checks are separated so that higher quality diagnostics can be 15513c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * generated for cases where both rules are violated. 15523c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 15533c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick if (!condition->type->is_boolean() || !condition->type->is_scalar()) { 15543c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick YYLTYPE loc = this->condition->get_location(); 15553c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15563c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick _mesa_glsl_error(& loc, state, "if-statement condition must be scalar " 15573c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick "boolean"); 15583c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 15593c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15603c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if *const stmt = new ir_if(condition); 15613c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick if (then_statement != NULL) { 15633c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ast_node *node = (ast_node *) then_statement; 15643c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick do { 15653c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick node->hir(& stmt->then_instructions, state); 15663c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick node = (ast_node *) node->next; 15673c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } while (node != then_statement); 15683c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 15693c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15703c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick if (else_statement != NULL) { 15713c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ast_node *node = (ast_node *) else_statement; 15723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick do { 15733c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick node->hir(& stmt->else_instructions, state); 15743c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick node = (ast_node *) node->next; 15753c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } while (node != else_statement); 15763c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 15773c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15783c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick instructions->push_tail(stmt); 15793c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 15803c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick /* if-statements do not have r-values. 15813c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 15823c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick return NULL; 15833c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick} 1584