ir.h revision 950ceb2bd60c25e7fecdff0fbcbf6e69015588f3
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* -*- c++ -*- */ 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright © 2010 Intel Corporation 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copy of this software and associated documentation files (the "Software"), 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * to deal in the Software without restriction, including without limitation 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the rights to use, copy, modify, merge, publish, distribute, sublicense, 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * and/or sell copies of the Software, and to permit persons to whom the 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Software is furnished to do so, subject to the following conditions: 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The above copyright notice and this permission notice (including the next 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * paragraph) shall be included in all copies or substantial portions of the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Software. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DEALINGS IN THE SOFTWARE. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#pragma once 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IR_H 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IR_H 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <cstdio> 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include <cstdlib> 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "list.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "ir_visitor.h" 34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "ir_hierarchical_visitor.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)struct ir_program { 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void *bong_hits; 38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)/** 41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Base class of all IR instructions 42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */ 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class ir_instruction : public exec_node { 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) const struct glsl_type *type; 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) class ir_constant *constant_expression_value(); 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) /** ir_print_visitor helper for debugging. */ 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void print(void); 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 52591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch virtual void accept(ir_visitor *) = 0; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * \name IR instruction downcast functions 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * These functions either cast the object to a derived class or return 59323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * \c NULL if the object's type does not match the specified derived class. 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Additional downcast functions will be added as needed. 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 62f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu /*@{*/ 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual class ir_variable * as_variable() { return NULL; } 64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu virtual class ir_function * as_function() { return NULL; } 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual class ir_dereference * as_dereference() { return NULL; } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual class ir_dereference_array * as_dereference_array() { return NULL; } 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual class ir_rvalue * as_rvalue() { return NULL; } 68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu virtual class ir_loop * as_loop() { return NULL; } 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual class ir_assignment * as_assignment() { return NULL; } 70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu virtual class ir_call * as_call() { return NULL; } 71323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) virtual class ir_return * as_return() { return NULL; } 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual class ir_if * as_if() { return NULL; } 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual class ir_swizzle * as_swizzle() { return NULL; } 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual class ir_constant * as_constant() { return NULL; } 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /*@}*/ 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuprotected: 78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ir_instruction() 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu /* empty */ 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 83323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ir_rvalue : public ir_instruction { 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ir_rvalue * as_rvalue() 88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return this; 90323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool is_lvalue() 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Get the variable that is ultimately referenced by an r-value 99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu */ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ir_variable *variable_referenced() 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return NULL; 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * If an r-value is a reference to a whole variable, get that variable 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * \return 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Pointer to a variable that is completely dereferenced by the r-value. If 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * the r-value is not a dereference or the dereference does not access the 11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * entire variable (i.e., it's just one array element, struct field), \c NULL 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * is returned. 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual ir_variable *whole_variable_referenced() 11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return NULL; 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdochprotected: 12123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch ir_rvalue() 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 12323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch /* empty */ 12423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch } 125323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_variable_mode { 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_var_auto = 0, 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_var_uniform, 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_var_in, 132323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ir_var_out, 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_var_inout 13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_varaible_interpolation { 13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_var_smooth = 0, 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_var_flat, 139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ir_var_noperspective 14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 143f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass ir_variable : public ir_instruction { 14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public: 14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_variable(const struct glsl_type *, const char *); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ir_variable *as_variable() 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void accept(ir_visitor *v) 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) v->visit(this); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual ir_visitor_status accept(ir_hierarchical_visitor *); 15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch /** 16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Duplicate an IR variable 161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * 16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * \note 163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * This will probably be made \c virtual and moved to the base class 16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * eventually. 16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_variable *clone() const 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_variable *var = new ir_variable(type, name); 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch var->max_array_access = this->max_array_access; 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var->read_only = this->read_only; 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var->centroid = this->centroid; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var->invariant = this->invariant; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var->mode = this->mode; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var->interpolation = this->interpolation; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return var; 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Get the string value for the interpolation qualifier 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * \return 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * If none of \c shader_in or \c shader_out is set, an empty string will 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * be returned. Otherwise the string that would be used in a shader to 1861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) * specify \c mode will be returned. 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *interpolation_string() const; 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *name; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Highest element accessed with a constant expression array index 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Not used for non-array variables. 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned max_array_access; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch unsigned read_only:1; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned centroid:1; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned invariant:1; 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** If the variable is initialized outside of the scope of the shader */ 203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch unsigned shader_in:1; 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * If the variable value is later used outside of the scope of the shader. 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned shader_out:1; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned mode:3; 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned interpolation:2; 21183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Flag that the whole array is assignable 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * In GLSL 1.20 and later whole arrays are assignable (and comparable for 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * equality). This flag enables this behavior. 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned array_lvalue:1; 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Emit a warning if this variable is accessed. 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *warn_extension; 22406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Value assigned in the initializer of a variable declared "const" 227e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_constant *constant_value; 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 23009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/*@{*/ 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/** 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * The representation of a function instance; may be the full definition or 23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * simply a prototype. 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class ir_function_signature : public ir_instruction { 23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /* An ir_function_signature will be part of the list of signatures in 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * an ir_function. 24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) */ 241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_function_signature(const glsl_type *return_type); 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void accept(ir_visitor *v) 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch v->visit(this); 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual ir_visitor_status accept(ir_hierarchical_visitor *); 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Get the name of the function for which this is a signature 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char *function_name() const; 25509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /** 2571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) * Check whether the qualifiers match between this signature's parameters 2581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) * and the supplied parameter list. If not, returns the name of the first 2591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) * parameter with mismatched qualifiers (for use in error messages). 260e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 261e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const char *qualifiers_match(exec_list *params); 262e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 263e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /** 264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Replace the current parameter list with the given one. This is useful 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * if the current information came from a prototype, and either has invalid 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * or missing parameter names. 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void replace_parameters(exec_list *new_params); 269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Function return type. 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * \note This discards the optional precision qualifier. 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const struct glsl_type *return_type; 276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * List of ir_variable of function parameters. 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This represents the storage. The paramaters passed in a particular 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * call will be in ir_call::actual_paramaters. 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) struct exec_list parameters; 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** Whether or not this function has a body (which may be empty). */ 286197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch unsigned is_defined:1; 287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) /** Body of instructions in the function. */ 289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) struct exec_list body; 290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** Function of which this signature is one overload. */ 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class ir_function *function; 294e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class ir_function; 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/** 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Header for tracking multiple overloaded functions with the same name. 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Contains a list of ir_function_signatures representing each of the 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * actual functions. 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ir_function : public ir_instruction { 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 30653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ir_function(const char *name); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual ir_function *as_function() 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void accept(ir_visitor *v) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v->visit(this); 31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual ir_visitor_status accept(ir_hierarchical_visitor *); 319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void add_signature(ir_function_signature *sig) 321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) sig->function = this; 323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) signatures.push_tail(sig); 324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 325d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) /** 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Get an iterator for the set of function signatures 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) exec_list_iterator iterator() 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return signatures.iterator(); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 334a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch /** 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Find a signature that matches a set of actual parameters, taking implicit 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * conversions into account. 337f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) */ 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const ir_function_signature *matching_signature(exec_list *actual_param); 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 340f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) /** 341323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) * Find a signature that exactly matches a set of actual parameters without 342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) * any implicit type conversions. 343323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) */ 344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ir_function_signature *exact_matching_signature(exec_list *actual_ps); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Name of the function. 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const char *name; 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 351f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)private: 352f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) /** 353f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * List of ir_function_signature for each overloaded function with this name. 354f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) */ 355f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) struct exec_list signatures; 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const char *ir_function_signature::function_name() const 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return function->name; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/*@}*/ 3638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 3648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 3655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/** 3667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch * IR instruction representing high-level if-statements 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ir_if : public ir_instruction { 369bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)public: 370bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ir_if(ir_rvalue *condition) 371bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) : condition(condition) 372bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 3737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch /* empty */ 3747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 3757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 3767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch virtual ir_if *as_if() 377bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void accept(ir_visitor *v) 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v->visit(this); 3845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 3865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) ir_rvalue *condition; 3895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /** List of ir_instruction for the body of the then branch */ 3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) exec_list then_instructions; 3915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /** List of ir_instruction for the body of the else branch */ 3925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) exec_list else_instructions; 3938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}; 3945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/** 3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * IR instruction representing a high-level loop structure. 3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */ 3995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class ir_loop : public ir_instruction { 4005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)public: 4015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) ir_loop() : from(NULL), to(NULL), increment(NULL), counter(NULL) 4025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 4035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /* empty */ 4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void accept(ir_visitor *v) 4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) v->visit(this); 4095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) virtual ir_loop *as_loop() 4145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 4155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return this; 4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) /** 4195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Get an iterator for the instructions of the loop body 4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */ 4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) exec_list_iterator iterator() 4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return body_instructions.iterator(); 4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 42510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 42610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch /** List of ir_instruction that make up the body of the loop. */ 42710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch exec_list body_instructions; 42810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 42910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch /** 43010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch * \name Loop counter and controls 43110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch */ 43210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch /*@{*/ 43310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ir_rvalue *from; 43410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ir_rvalue *to; 43510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ir_rvalue *increment; 43610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ir_variable *counter; 43710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch /*@}*/ 43810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}; 43910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 44010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 44110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochclass ir_assignment : public ir_rvalue { 44210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochpublic: 44310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition); 44410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 44510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch virtual void accept(ir_visitor *v) 44610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch { 44710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch v->visit(this); 44810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 44910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 45010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ir_assignment * as_assignment() 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) return this; 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Left-hand side of the assignment. 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_rvalue *lhs; 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Value being assigned 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_rvalue *rhs; 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) /** 4688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) * Optional condition for the assignment. 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_rvalue *condition; 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* Update ir_expression::num_operands() and operator_strs when 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * updating this list. 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ir_expression_operation { 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_bit_not, 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_logic_not, 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_neg, 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_abs, 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_sign, 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_rcp, 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_unop_rsq, 484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ir_unop_sqrt, 485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_exp, 486926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_log, 48709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_unop_exp2, 488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_log2, 489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_f2i, /**< Float-to-integer conversion. */ 490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_i2f, /**< Integer-to-float conversion. */ 491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_f2b, /**< Float-to-boolean conversion */ 49209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_unop_b2f, /**< Boolean-to-float conversion */ 493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_i2b, /**< int-to-boolean conversion */ 494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_b2i, /**< Boolean-to-int conversion */ 495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_u2f, /**< Unsigned-to-float conversion. */ 496323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * \name Unary floating-point rounding operations. 49909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /*@{*/ 501323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ir_unop_trunc, 502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ir_unop_ceil, 5038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) ir_unop_floor, 50481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) /*@}*/ 5058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 5068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) /** 50781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * \name Trigonometric operations. 50881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) */ 50981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) /*@{*/ 51081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ir_unop_sin, 51181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ir_unop_cos, 512e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /*@}*/ 513e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 514e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /** 515e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * \name Partial derivatives. 516e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 51709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /*@{*/ 51809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_unop_dFdx, 519f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ir_unop_dFdy, 520e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /*@}*/ 521e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 522e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ir_binop_add, 523e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ir_binop_sub, 524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ir_binop_mul, 525e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ir_binop_div, 526e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ir_binop_mod, 527e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 528e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch /** 52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * \name Binary comparison operators 53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 53109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /*@{*/ 53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_less, 53309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_greater, 53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_lequal, 53509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_gequal, 53609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_equal, 53709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ir_binop_nequal, 53809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) /*@}*/ 53909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 540f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu /** 541f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu * \name Bit-wise binary operations. 542323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) */ 543323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) /*@{*/ 544f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ir_binop_lshift, 545f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles) ir_binop_rshift, 546f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ir_binop_bit_and, 547197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ir_binop_bit_xor, 548197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ir_binop_bit_or, 549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch /*@}*/ 550f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 551f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ir_binop_logic_and, 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ir_binop_logic_xor, 553 ir_binop_logic_or, 554 555 ir_binop_dot, 556 ir_binop_min, 557 ir_binop_max, 558 559 ir_binop_pow 560}; 561 562class ir_expression : public ir_rvalue { 563public: 564 ir_expression(int op, const struct glsl_type *type, 565 ir_rvalue *, ir_rvalue *); 566 567 static unsigned int get_num_operands(ir_expression_operation); 568 unsigned int get_num_operands() 569 { 570 return get_num_operands(operation); 571 } 572 573 /** 574 * Return a string representing this expression's operator. 575 */ 576 const char *operator_string(); 577 578 /** 579 * Do a reverse-lookup to translate the given string into an operator. 580 */ 581 static ir_expression_operation get_operator(const char *); 582 583 virtual void accept(ir_visitor *v) 584 { 585 v->visit(this); 586 } 587 588 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 589 590 ir_expression *clone(); 591 592 ir_expression_operation operation; 593 ir_rvalue *operands[2]; 594}; 595 596 597/** 598 * IR instruction representing a function call 599 */ 600class ir_call : public ir_rvalue { 601public: 602 ir_call(const ir_function_signature *callee, exec_list *actual_parameters) 603 : callee(callee) 604 { 605 assert(callee->return_type != NULL); 606 type = callee->return_type; 607 actual_parameters->move_nodes_to(& this->actual_parameters); 608 } 609 610 virtual ir_call *as_call() 611 { 612 return this; 613 } 614 615 virtual void accept(ir_visitor *v) 616 { 617 v->visit(this); 618 } 619 620 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 621 622 /** 623 * Get a generic ir_call object when an error occurs 624 */ 625 static ir_call *get_error_instruction(); 626 627 /** 628 * Get an iterator for the set of acutal parameters 629 */ 630 exec_list_iterator iterator() 631 { 632 return actual_parameters.iterator(); 633 } 634 635 /** 636 * Get the name of the function being called. 637 */ 638 const char *callee_name() const 639 { 640 return callee->function_name(); 641 } 642 643 const ir_function_signature *get_callee() 644 { 645 return callee; 646 } 647 648 /** 649 * Generates an inline version of the function before @ir, 650 * returning the return value of the function. 651 */ 652 ir_rvalue *generate_inline(ir_instruction *ir); 653 654private: 655 ir_call() 656 : callee(NULL) 657 { 658 /* empty */ 659 } 660 661 const ir_function_signature *callee; 662 663 /* List of ir_rvalue of paramaters passed in this call. */ 664 exec_list actual_parameters; 665}; 666 667 668/** 669 * \name Jump-like IR instructions. 670 * 671 * These include \c break, \c continue, \c return, and \c discard. 672 */ 673/*@{*/ 674class ir_jump : public ir_instruction { 675protected: 676 ir_jump() 677 { 678 /* empty */ 679 } 680}; 681 682class ir_return : public ir_jump { 683public: 684 ir_return() 685 : value(NULL) 686 { 687 /* empty */ 688 } 689 690 ir_return(ir_rvalue *value) 691 : value(value) 692 { 693 /* empty */ 694 } 695 696 virtual ir_return *as_return() 697 { 698 return this; 699 } 700 701 ir_rvalue *get_value() const 702 { 703 return value; 704 } 705 706 virtual void accept(ir_visitor *v) 707 { 708 v->visit(this); 709 } 710 711 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 712 713 ir_rvalue *value; 714}; 715 716 717/** 718 * Jump instructions used inside loops 719 * 720 * These include \c break and \c continue. The \c break within a loop is 721 * different from the \c break within a switch-statement. 722 * 723 * \sa ir_switch_jump 724 */ 725class ir_loop_jump : public ir_jump { 726public: 727 enum jump_mode { 728 jump_break, 729 jump_continue 730 }; 731 732 ir_loop_jump(ir_loop *loop, jump_mode mode) 733 : loop(loop), mode(mode) 734 { 735 /* empty */ 736 } 737 738 virtual void accept(ir_visitor *v) 739 { 740 v->visit(this); 741 } 742 743 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 744 745 bool is_break() const 746 { 747 return mode == jump_break; 748 } 749 750 bool is_continue() const 751 { 752 return mode == jump_continue; 753 } 754 755private: 756 /** Loop containing this break instruction. */ 757 ir_loop *loop; 758 759 /** Mode selector for the jump instruction. */ 760 enum jump_mode mode; 761}; 762/*@}*/ 763 764 765/** 766 * Texture sampling opcodes used in ir_texture 767 */ 768enum ir_texture_opcode { 769 ir_tex, /* Regular texture look-up */ 770 ir_txb, /* Texture look-up with LOD bias */ 771 ir_txl, /* Texture look-up with explicit LOD */ 772 ir_txd, /* Texture look-up with partial derivatvies */ 773 ir_txf /* Texel fetch with explicit LOD */ 774}; 775 776 777/** 778 * IR instruction to sample a texture 779 * 780 * The specific form of the IR instruction depends on the \c mode value 781 * selected from \c ir_texture_opcodes. In the printed IR, these will 782 * appear as: 783 * 784 * Texel offset 785 * | Projection divisor 786 * | | Shadow comparitor 787 * | | | 788 * v v v 789 * (tex (sampler) (coordinate) (0 0 0) (1) ( )) 790 * (txb (sampler) (coordinate) (0 0 0) (1) ( ) (bias)) 791 * (txl (sampler) (coordinate) (0 0 0) (1) ( ) (lod)) 792 * (txd (sampler) (coordinate) (0 0 0) (1) ( ) (dPdx dPdy)) 793 * (txf (sampler) (coordinate) (0 0 0) (lod)) 794 */ 795class ir_texture : public ir_rvalue { 796public: 797 ir_texture(enum ir_texture_opcode op) 798 : op(op), projector(NULL), shadow_comparitor(NULL) 799 { 800 /* empty */ 801 } 802 803 virtual void accept(ir_visitor *v) 804 { 805 v->visit(this); 806 } 807 808 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 809 810 /** 811 * Return a string representing the ir_texture_opcode. 812 */ 813 const char *opcode_string(); 814 815 /** Set the sampler and infer the type. */ 816 void set_sampler(ir_dereference *sampler); 817 818 /** 819 * Do a reverse-lookup to translate a string into an ir_texture_opcode. 820 */ 821 static ir_texture_opcode get_opcode(const char *); 822 823 enum ir_texture_opcode op; 824 825 /** Sampler to use for the texture access. */ 826 ir_dereference *sampler; 827 828 /** Texture coordinate to sample */ 829 ir_rvalue *coordinate; 830 831 /** 832 * Value used for projective divide. 833 * 834 * If there is no projective divide (the common case), this will be 835 * \c NULL. Optimization passes should check for this to point to a constant 836 * of 1.0 and replace that with \c NULL. 837 */ 838 ir_rvalue *projector; 839 840 /** 841 * Coordinate used for comparison on shadow look-ups. 842 * 843 * If there is no shadow comparison, this will be \c NULL. For the 844 * \c ir_txf opcode, this *must* be \c NULL. 845 */ 846 ir_rvalue *shadow_comparitor; 847 848 /** Explicit texel offsets. */ 849 signed char offsets[3]; 850 851 union { 852 ir_rvalue *lod; /**< Floating point LOD */ 853 ir_rvalue *bias; /**< Floating point LOD bias */ 854 struct { 855 ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 856 ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 857 } grad; 858 } lod_info; 859}; 860 861 862struct ir_swizzle_mask { 863 unsigned x:2; 864 unsigned y:2; 865 unsigned z:2; 866 unsigned w:2; 867 868 /** 869 * Number of components in the swizzle. 870 */ 871 unsigned num_components:3; 872 873 /** 874 * Does the swizzle contain duplicate components? 875 * 876 * L-value swizzles cannot contain duplicate components. 877 */ 878 unsigned has_duplicates:1; 879}; 880 881 882class ir_swizzle : public ir_rvalue { 883public: 884 ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 885 unsigned count); 886 ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 887 888 virtual ir_swizzle *as_swizzle() 889 { 890 return this; 891 } 892 893 ir_swizzle *clone() 894 { 895 return new ir_swizzle(this->val, this->mask); 896 } 897 898 /** 899 * Construct an ir_swizzle from the textual representation. Can fail. 900 */ 901 static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 902 903 virtual void accept(ir_visitor *v) 904 { 905 v->visit(this); 906 } 907 908 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 909 910 bool is_lvalue() 911 { 912 return val->is_lvalue() && !mask.has_duplicates; 913 } 914 915 /** 916 * Get the variable that is ultimately referenced by an r-value 917 */ 918 virtual ir_variable *variable_referenced(); 919 920 ir_rvalue *val; 921 ir_swizzle_mask mask; 922}; 923 924 925class ir_dereference : public ir_rvalue { 926public: 927 virtual ir_dereference *as_dereference() 928 { 929 return this; 930 } 931 932 bool is_lvalue(); 933 934 /** 935 * Get the variable that is ultimately referenced by an r-value 936 */ 937 virtual ir_variable *variable_referenced() = 0; 938}; 939 940 941class ir_dereference_variable : public ir_dereference { 942public: 943 ir_dereference_variable(ir_variable *var); 944 945 /** 946 * Get the variable that is ultimately referenced by an r-value 947 */ 948 virtual ir_variable *variable_referenced() 949 { 950 return this->var; 951 } 952 953 virtual ir_variable *whole_variable_referenced() 954 { 955 /* ir_dereference_variable objects always dereference the entire 956 * variable. However, if this dereference is dereferenced by anything 957 * else, the complete deferefernce chain is not a whole-variable 958 * dereference. This method should only be called on the top most 959 * ir_rvalue in a dereference chain. 960 */ 961 return this->var; 962 } 963 964 virtual void accept(ir_visitor *v) 965 { 966 v->visit(this); 967 } 968 969 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 970 971 /** 972 * Object being dereferenced. 973 */ 974 ir_variable *var; 975}; 976 977 978class ir_dereference_array : public ir_dereference { 979public: 980 ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 981 982 ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 983 984 virtual ir_dereference_array *as_dereference_array() 985 { 986 return this; 987 } 988 989 /** 990 * Get the variable that is ultimately referenced by an r-value 991 */ 992 virtual ir_variable *variable_referenced() 993 { 994 return this->array->variable_referenced(); 995 } 996 997 virtual void accept(ir_visitor *v) 998 { 999 v->visit(this); 1000 } 1001 1002 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1003 1004 ir_rvalue *array; 1005 ir_rvalue *array_index; 1006 1007private: 1008 void set_array(ir_rvalue *value); 1009}; 1010 1011 1012class ir_dereference_record : public ir_dereference { 1013public: 1014 ir_dereference_record(ir_rvalue *value, const char *field); 1015 1016 ir_dereference_record(ir_variable *var, const char *field); 1017 1018 /** 1019 * Get the variable that is ultimately referenced by an r-value 1020 */ 1021 virtual ir_variable *variable_referenced() 1022 { 1023 return this->record->variable_referenced(); 1024 } 1025 1026 virtual void accept(ir_visitor *v) 1027 { 1028 v->visit(this); 1029 } 1030 1031 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1032 1033 ir_rvalue *record; 1034 const char *field; 1035}; 1036 1037 1038/** 1039 * Data stored in an ir_constant 1040 */ 1041union ir_constant_data { 1042 unsigned u[16]; 1043 int i[16]; 1044 float f[16]; 1045 bool b[16]; 1046}; 1047 1048 1049class ir_constant : public ir_rvalue { 1050public: 1051 ir_constant(const struct glsl_type *type, const ir_constant_data *data); 1052 ir_constant(bool b); 1053 ir_constant(unsigned int u); 1054 ir_constant(int i); 1055 ir_constant(float f); 1056 1057 /** 1058 * Construct an ir_constant from a list of ir_constant values 1059 */ 1060 ir_constant(const struct glsl_type *type, exec_list *values); 1061 1062 /** 1063 * Construct an ir_constant from a scalar component of another ir_constant 1064 * 1065 * The new \c ir_constant inherits the type of the component from the 1066 * source constant. 1067 * 1068 * \note 1069 * In the case of a matrix constant, the new constant is a scalar, \b not 1070 * a vector. 1071 */ 1072 ir_constant(const ir_constant *c, unsigned i); 1073 1074 virtual ir_constant *as_constant() 1075 { 1076 return this; 1077 } 1078 1079 virtual void accept(ir_visitor *v) 1080 { 1081 v->visit(this); 1082 } 1083 1084 virtual ir_visitor_status accept(ir_hierarchical_visitor *); 1085 1086 ir_constant *clone(); 1087 1088 /** 1089 * Get a particular component of a constant as a specific type 1090 * 1091 * This is useful, for example, to get a value from an integer constant 1092 * as a float or bool. This appears frequently when constructors are 1093 * called with all constant parameters. 1094 */ 1095 /*@{*/ 1096 bool get_bool_component(unsigned i) const; 1097 float get_float_component(unsigned i) const; 1098 int get_int_component(unsigned i) const; 1099 unsigned get_uint_component(unsigned i) const; 1100 /*@}*/ 1101 1102 ir_constant *get_record_field(const char *name); 1103 1104 /** 1105 * Determine whether a constant has the same value as another constant 1106 */ 1107 bool has_value(const ir_constant *) const; 1108 1109 /** 1110 * Value of the constant. 1111 * 1112 * The field used to back the values supplied by the constant is determined 1113 * by the type associated with the \c ir_instruction. Constants may be 1114 * scalars, vectors, or matrices. 1115 */ 1116 union ir_constant_data value; 1117 1118 exec_list components; 1119 1120private: 1121 /** 1122 * Parameterless constructor only used by the clone method 1123 */ 1124 ir_constant(void); 1125}; 1126 1127void 1128visit_exec_list(exec_list *list, ir_visitor *visitor); 1129 1130void validate_ir_tree(exec_list *instructions); 1131 1132extern void 1133_mesa_glsl_initialize_variables(exec_list *instructions, 1134 struct _mesa_glsl_parse_state *state); 1135 1136extern void 1137_mesa_glsl_initialize_functions(exec_list *instructions, 1138 struct _mesa_glsl_parse_state *state); 1139 1140#endif /* IR_H */ 1141