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