1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */ 2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/* 3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation 4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"), 7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation 8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions: 11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next 13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the 14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software. 15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE. 23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 25e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#pragma once 26e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#ifndef IR_H 27e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#define IR_H 28e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 29497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdio.h> 30497baf4e4a6a0a2f247c7bfb9bf69a2b93c2c19fIan Romanick#include <stdlib.h> 31ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt 32d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke#include "ralloc.h" 3311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick#include "glsl_types.h" 340044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick#include "list.h" 3578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h" 368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick#include "ir_hierarchical_visitor.h" 37cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry#include "main/mtypes.h" 380044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 39e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes 41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags 47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this 49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant. The value for the type is stored in \c ir_instruction::ir_type 50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor. While using type tags is not very C++, it is extremely 51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient. For example, during debugging you can simply inspect 52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object. 53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c 55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object 56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types. For functions that have only slight differences for several object 57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code. 58e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 59d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type { 60e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Zero is unused so that the IR validator can detect cases where 62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type has not been initialized. 63e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_unset, 65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_variable, 66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_assignment, 67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_call, 68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_constant, 69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_array, 70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_record, 71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_variable, 72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_discard, 73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_expression, 74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function, 75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function_signature, 76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_if, 77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop, 78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop_jump, 79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_return, 80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_swizzle, 81d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_texture, 826dc89d221d43fad5f3edbb903997160af071bec0Brian Paul ir_type_max /**< maximum ir_type enum number, for validation */ 83d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt}; 84d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 87a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 880044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 89a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 90d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt enum ir_node_type ir_type; 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt /** 93a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt * GCC 4.7+ and clang warn when deleting an ir_instruction unless 94a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt * there's a virtual destructor present. Because we almost 95a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt * universally use ralloc for our memory management of 96a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt * ir_instructions, the destructor doesn't need to do any work. 97a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt */ 98a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt virtual ~ir_instruction() 99a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt { 100a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt } 101a018747ac8230f0dfb9f5f49a44d78fe97df84a0Eric Anholt 102e46a454305af64710ce8deadafc718f75363ac7eEric Anholt /** ir_print_visitor helper for debugging. */ 1034b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt void print(void) const; 104e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 10578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 1068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 1078273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_instruction *clone(void *mem_ctx, 1088273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const = 0; 10978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 11144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 11244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 11344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 11444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 11544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 11644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 11744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 11844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 1196202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 12044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 121b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 122d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual class ir_dereference_variable *as_dereference_variable() { return NULL; } 1236d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual class ir_expression * as_expression() { return NULL; } 124fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 12501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 126cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 127cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 128cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 1295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 1307d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 1315c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 1321eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke virtual class ir_discard * as_discard() { return NULL; } 13344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 13444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 135a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 13644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 137d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 138d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 139d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 143807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke/** 144807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke * The base class for all "values"/expression trees. 145807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke */ 146fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 147fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 148f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke const struct glsl_type *type; 149f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke 150807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const; 151ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 152807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke virtual void accept(ir_visitor *v) 153807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke { 154807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke v->visit(this); 155807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke } 156807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke 157807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 158807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke 1596e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 160fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 161fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 162fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 163fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 164fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 165fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 16602939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt ir_rvalue *as_rvalue_to_saturate(); 16702939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt 168a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual bool is_lvalue() const 169fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 170fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 171fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 172fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 1732b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 1742b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 1752b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 176a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 1772b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 1782b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 1792b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 1802b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 181b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 182b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 183b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 184b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 185b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 186b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 187b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 188b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 189b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 190b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 191b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 192b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 193b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 194b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 195b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value zero 198ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 199ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 200ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 201ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 202ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * zero (or \c false for booleans). 203ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 2049aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one, 2059aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * ir_constant::is_basis 206ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 207ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 208ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 209ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 210ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value one 211ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 212ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 213ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 214ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 215ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * one (or \c true for booleans). 216ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 2179aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one, 2189aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * ir_constant::is_basis 219ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 220ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 221ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 2228e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick /** 2238e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * Determine if an r-value has the value negative one 2248e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2258e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * The base implementation of this function always returns \c false. The 2268e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \c ir_constant class over-rides this function to return \c true \b only 2278e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * for vector and scalar types that have all elements set to the value 2289aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * negative one. For boolean types, the result is always \c false. 2298e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2308e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one 2319aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * ir_constant::is_basis 2328e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick */ 2338e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 2348e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick 2359aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner /** 2369aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * Determine if an r-value is a basis vector 2379aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * 2389aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * The base implementation of this function always returns \c false. The 2399aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * \c ir_constant class over-rides this function to return \c true \b only 2409aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * for vector and scalar types that have one element set to the value one, 2419aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * and the other elements set to the value zero. For boolean types, the 2429aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * result is always \c false. 2439aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * 2449aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one, 2459aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * is_constant::is_negative_one 2469aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner */ 2479aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner virtual bool is_basis() const; 2489aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner 249807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke 250807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke /** 251807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke * Return a generic value of error_type. 252807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke * 253807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke * Allocation will be performed with 'mem_ctx' as ralloc owner. 254807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke */ 255807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke static ir_rvalue *error_value(void *mem_ctx); 256807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke 257fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 2580a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke ir_rvalue(); 259fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 260fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 261fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 262e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 263e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes 264e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 266e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_auto = 0, /**< Function local variables and globals. */ 267e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_uniform, /**< Variable declared as a uniform. */ 268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 2707e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_inout, 271819d57fce94b20fa0d34da6f037f0a53c4a5bdc2Kenneth Graunke ir_var_const_in, /**< "in" param that must be a constant expression */ 2727ce186358e881d1e30eda716a8dea73d2dab2ee9Brian Paul ir_var_system_value, /**< Ex: front-face, instance-id, etc. */ 2737e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary /**< Temporary variable generated during compilation. */ 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2765fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/** 2775fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Layout qualifiers for gl_FragDepth. 2785fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * 279b9eb4d8a59699e233255113acafae220c3d8fe3cKenneth Graunke * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared 2805fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * with a layout qualifier. 2815fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */ 2825fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceenum ir_depth_layout { 2835fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_none, /**< No depth layout is specified. */ 2845fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_any, 2855fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_greater, 2865fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_less, 2875fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_unchanged 2885fc57f471b10e74546f999269a2a8f9186da9731Chad Versace}; 2895fc57f471b10e74546f999269a2a8f9186da9731Chad Versace 2905fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/** 2915fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Convert depth layout qualifier to string. 2925fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */ 2935fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceconst char* 2945fc57f471b10e74546f999269a2a8f9186da9731Chad Versacedepth_layout_string(ir_depth_layout layout); 295fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 29689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick/** 29789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Description of built-in state associated with a uniform 29889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 29989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \sa ir_variable::state_slots 30089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */ 30189d81ab16c05818b290ed735c1343d3abde449bfIan Romanickstruct ir_state_slot { 30289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick int tokens[5]; 30389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick int swizzle; 30489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick}; 30589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 3087e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable(const struct glsl_type *, const char *, ir_variable_mode); 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 3108273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; 3114b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 31244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 31344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 31444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 31544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 31644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 31778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 31878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 31978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 32078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 32178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 3228895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 3238895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 3242d394d4877794d19756c3760d711524dca89f772Ian Romanick 325950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick /** 326950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * Get the string value for the interpolation qualifier 327950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * 328046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * \return The string that would be used in a shader to specify \c 329046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * mode will be returned. 330046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * 331c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * This function is used to generate error messages of the form "shader 332c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * uses %s interpolation qualifier", so in the case where there is no 333c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * interpolation qualifier, it returns "no". 334c488150dea083a9677429b4185c6b20d7facd52bPaul Berry * 335046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * This function should only be used on a shader input or output variable. 336950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick */ 337950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick const char *interpolation_string() const; 338950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick 3398b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick /** 340baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * Determine how this variable should be interpolated based on its 341baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * interpolation qualifier (if present), whether it is gl_Color or 342baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * gl_SecondaryColor, and whether flatshading is enabled in the current GL 343baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * state. 344baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * 345baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * The return value will always be either INTERP_QUALIFIER_SMOOTH, 346baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry * INTERP_QUALIFIER_NOPERSPECTIVE, or INTERP_QUALIFIER_FLAT. 347baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry */ 348baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry glsl_interp_qualifier determine_interpolation_mode(bool flat_shade); 349baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry 350baf7f99fd7a092a1390b7a145e09caa5325a8116Paul Berry /** 351f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke * Declared type of the variable 352f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke */ 353f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke const struct glsl_type *type; 354f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke 355f75c2d53146ea14f8dfedcc5b7a4704278ba0792Kenneth Graunke /** 35636b3ee2ffca2f260c9e5eb248b6e2b4ca2bf6fb1Brian Paul * Declared name of the variable 357e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 360b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 361b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 362b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 363b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 364b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 365b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 366b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 367e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 368e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Is the variable read-only? 369e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 370e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * This is set for variables declared as \c const, shader inputs, 371e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * and uniforms. 372e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 375a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 376a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 377e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 378bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * Has this variable been used for reading or writing? 379bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * 380bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * Several GLSL semantic checks require knowledge of whether or not a 381bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * variable has been used. For example, it is an error to redeclare a 382bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * variable as invariant after it has been used. 383f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * 384f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * This is only maintained in the ast_to_hir.cpp path, not in 385f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * Mesa's fixed function or ARB program paths. 386bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick */ 387bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick unsigned used:1; 388bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick 389bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick /** 390f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * Has this variable been statically assigned? 391f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * 392f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * This answers whether the variable was assigned in any path of 393f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * the shader during ast_to_hir. This doesn't answer whether it is 394f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * still written after dead code removal, nor is it maintained in 395f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt * non-ast_to_hir.cpp (GLSL parsing) paths. 396f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt */ 397f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt unsigned assigned:1; 398f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt 399f2475ca424f7e001be50f64dafa5700f6603d684Eric Anholt /** 400e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Storage class of the variable. 401e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 402e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_mode 403e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 405e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 406e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 407e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Interpolation mode for shader inputs / outputs 408e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 409e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_interpolation 410e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 4129d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 4139d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 414e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \name ARB_fragment_coord_conventions 415e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 416e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 4174a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned origin_upper_left:1; 4184a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned pixel_center_integer:1; 419e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /*@}*/ 4204a962170d7cf4243d6ae156fca20a6167388925dEric Anholt 421326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 422eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * Was the location explicitly set in the shader? 423eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * 424eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * If the location is explicitly set in the shader, it \b cannot be changed 425eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * by the linker or by the API (e.g., calls to \c glBindAttribLocation have 426eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * no effect). 427eee68d3631813580a14fa51fda6f0c959279256cIan Romanick */ 428eee68d3631813580a14fa51fda6f0c959279256cIan Romanick unsigned explicit_location:1; 4291256a5dcc86014d48bdc6fd10ea5a2fa11241667Dave Airlie unsigned explicit_index:1; 430eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 431eee68d3631813580a14fa51fda6f0c959279256cIan Romanick /** 432f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * Does this variable have an initializer? 433f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * 434f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * This is used by the linker to cross-validiate initializers of global 435f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * variables. 436f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick */ 437f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick unsigned has_initializer:1; 438f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick 439f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick /** 44022af08b410f47227ea27b06cce097ccbe0130540Ian Romanick * \brief Layout qualifier for gl_FragDepth. 44122af08b410f47227ea27b06cce097ccbe0130540Ian Romanick * 44222af08b410f47227ea27b06cce097ccbe0130540Ian Romanick * This is not equal to \c ir_depth_layout_none if and only if this 44322af08b410f47227ea27b06cce097ccbe0130540Ian Romanick * variable is \c gl_FragDepth and a layout qualifier is specified. 44422af08b410f47227ea27b06cce097ccbe0130540Ian Romanick */ 44522af08b410f47227ea27b06cce097ccbe0130540Ian Romanick ir_depth_layout depth_layout; 44622af08b410f47227ea27b06cce097ccbe0130540Ian Romanick 44722af08b410f47227ea27b06cce097ccbe0130540Ian Romanick /** 44869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * Storage location of the base of this variable 44969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 45069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * The precise meaning of this field depends on the nature of the variable. 45169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 45269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader input: one of the values from \c gl_vert_attrib. 45369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader output: one of the values from \c gl_vert_result. 45469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader input: one of the values from \c gl_frag_attrib. 45569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader output: one of the values from \c gl_frag_result. 456b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * - Uniforms: Per-stage uniform slot number for default uniform block. 457b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * - Uniforms: Index within the uniform block definition for UBO members. 45869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Other: This field is not currently used. 45969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 46069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * If the variable is a uniform, shader input, or shader output, and the 46169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * slot has not been assigned, the value will be -1. 46269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick */ 46369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick int location; 46469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick 46569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick /** 466b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * Uniform block number for uniforms. 467b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * 468b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * This index is into the shader's list of uniform blocks, not the 469b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * linked program's merged list. 470b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * 471b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt * If the variable is not in a uniform block, the value will be -1. 472b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt */ 473b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt int uniform_block; 474b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt 475b3c093c79c2ec49c36af37aa290d5ae452149f6eEric Anholt /** 476f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie * output index for dual source blending. 477f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie */ 478f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie int index; 479f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie 480f8cf79936b42405a8366613b80e3bde21aadaa02Dave Airlie /** 48189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Built-in state that backs this uniform 48289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 48389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Once set at variable creation, \c state_slots must remain invariant. 48489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * This is because, ideally, this array would be shared by all clones of 48589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * this variable in the IR tree. In other words, we'd really like for it 48689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * to be a fly-weight. 48789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 48889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * If the variable is not a uniform, \c num_state_slots will be zero and 48989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \c state_slots will be \c NULL. 49089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */ 49189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /*@{*/ 49289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick unsigned num_state_slots; /**< Number of state slots used */ 49389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick ir_state_slot *state_slots; /**< State descriptors. */ 49489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /*@}*/ 49589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick 49689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /** 497c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 498c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 499c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 500c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 501c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 502326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 503326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 504326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 505f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick 506f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick /** 507f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * Constant expression assigned in the initializer of the variable 508f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * 509f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * \warning 510f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * This field and \c ::constant_value are distinct. Even if the two fields 511f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * refer to constants with the same value, they must point to separate 512f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick * objects. 513f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick */ 514f37b1ad937dd2c420f4c9fd9aa5887942bd31f3fIan Romanick ir_constant *constant_initializer; 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 5199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 5209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 5219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 5229fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 524894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 525894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 526894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 528e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5308273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function_signature *clone(void *mem_ctx, 5318273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const; 53201a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke ir_function_signature *clone_prototype(void *mem_ctx, 53301a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke struct hash_table *ht) const; 5344b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 53578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 53678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 53778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 53878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 53978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 5408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5418895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 5436e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * Attempt to evaluate this function as a constant expression, 5446e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * given a list of the actual parameters and the variable context. 5456e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * Returns NULL for non-built-ins. 546d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke */ 5476e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context); 548d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke 549d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke /** 5500f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 5510f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 5520f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 5530f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 5540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 555df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * Get a handle to the function for which this is a signature 556df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 557df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * There is no setter function, this function returns a \c const pointer, 558df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * and \c ir_function_signature::_function is private for a reason. The 559df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * only way to make a connection between a function and function signature 560df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * is via \c ir_function::add_signature. This helps ensure that certain 561df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * invariants (i.e., a function signature is in the list of signatures for 562df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * its \c _function) are met. 563df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 564df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * \sa ir_function::add_signature 565df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick */ 566df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick inline const class ir_function *function() const 567df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick { 568df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function; 569df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick } 570df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick 571df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick /** 572abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 573abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 574abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 575abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 576abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 577abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 578abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 579bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 580bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 581bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 582bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 583bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 584bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 585bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 593f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 594f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 595f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 596f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 5980044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 6009fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 6019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 6026a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 603f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke /** Whether or not this function signature is a built-in. */ 604f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke unsigned is_builtin:1; 605f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke 606894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 607894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 608894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 6096a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 6106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 611df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick class ir_function *_function; 6126a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 6132ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert /** Function signature of which this one is a prototype clone */ 6142ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert const ir_function_signature *origin; 6152ff7b121cad2892698ff1aa7690dd361ea2739a7Olivier Galibert 6166a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 617363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 618363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /** 619363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * Helper function to run a list of instructions for constant 620363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * expression evaluation. 621363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * 622363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * The hash table represents the values of the visible variables. 623363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * There are no scoping issues because the table is indexed on 624363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * ir_variable pointers, not variable names. 625363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * 626363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * Returns false if the expression is not constant, true otherwise, 627363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * and the value in *result if result is non-NULL. 628363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 629363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert bool constant_expression_evaluate_expression_list(const struct exec_list &body, 630363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert struct hash_table *variable_context, 631363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant **result); 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 6369fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 6379fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 6389fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 642882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 6448273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 6454b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 6466202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 6476202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 6486202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 6496202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 6506202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 65178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 65278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 65378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 65478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 65578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 6568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 6586a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 6596a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 660df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick sig->_function = this; 661df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick this->signatures.push_tail(sig); 6626a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 6636a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 66595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 66695cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 66795cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 66895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 66995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 67095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 67195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 67295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 6730d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 674861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke * conversions into account. Also flags whether the match was exact. 675861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke */ 676861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke ir_function_signature *matching_signature(const exec_list *actual_param, 677861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke bool *match_is_exact); 678861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke 679861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke /** 680861d0a5e12b1baa31211cb8aff983b8fb9b97482Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 6810d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 682471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 683b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *matching_signature(const exec_list *actual_param); 684471471f83471481db0445e73f8c89e6a9149838eIan Romanick 685471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 6860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 6870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 6880d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 689b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *exact_matching_signature(const exec_list *actual_ps); 6900d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 6910d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 69681f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke /** Whether or not this function has a signature that isn't a built-in. */ 69781f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke bool has_user_signature(); 698b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke 699471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 700f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 701471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 7020044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 7040f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 7050f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 7060f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 707df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function->name; 7080f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 7133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 7143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 7153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 7163c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 7173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 7183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 7193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 720d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_if; 7213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 7223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 7238273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 7244b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 7255ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 7265ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 7275ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 7285ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 7295ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 7303c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 7313c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 7323c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 7333c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 7343c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 7358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 7373c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 738f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 7393c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 740f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 7413c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 7423c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 7433c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 7443c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 745fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 746fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 747fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 748fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 749fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 7503b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_loop(); 751fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 7528273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 7534b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 754fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 755fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 756fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 757fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 758fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 7598895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7608895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 76101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 76201f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 76301f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 76401f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 76501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 766fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 767fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 768fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 769fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 770fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 771fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 772fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 773fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 774f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 775fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 776fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 777fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 778fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 7793b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 7803b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Represents a loop like a FORTRAN \c do-loop. 7813b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 7823b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \note 7833b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If \c from and \c to are the same value, the loop will execute once. 784fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 785fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 7863b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *from; /** Value of the loop counter on the first 7873b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 7883b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 7893b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *to; /** Value of the loop counter on the last 7903b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 7913b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 792fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 793fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 7943b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick 7953b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick /** 7963b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Comparison operation in the loop terminator. 7973b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 7983b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If any of the loop control fields are non-\c NULL, this field must be 7993b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, 8003b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. 8013b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 8023b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick int cmp; 803fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 804fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 805fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 806fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 8073c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction { 808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 809e617a53a74cd27a322fd2dd05ff1c66c6437fde3Eric Anholt ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL); 810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 8115a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 8125a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Construct an assignment with an explicit write mask 8135a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 8145a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \note 8155a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Since a write mask is supplied, the LHS must already be a bare 8165a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \c ir_dereference. The cannot be any swizzles in the LHS. 8175a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 8185a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 8195a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask); 8205a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 8218273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 8224b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 8236e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 824fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 82578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 82678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 82778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 82878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 82978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 8308895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 8318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 832cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 833cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 834cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 835cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 836cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 837a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 8385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Get a whole variable written by an assignment 8395a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 8405a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * If the LHS of the assignment writes a whole variable, the variable is 8415a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * returned. Otherwise \c NULL is returned. Examples of whole-variable 8425a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment are: 8435a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 8445a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to a scalar 8455a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to all components of a vector 8465a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole array (or matrix) assignment 8475a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole structure assignment 8485a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 8495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_variable *whole_variable_written(); 8505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 8515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 8525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Set the LHS of an assignment 8535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 8545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick void set_lhs(ir_rvalue *lhs); 8555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 8565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 8585a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 8595a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * This should be treated as read only. If you need to set the LHS of an 8605a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment, use \c ir_assignment::set_lhs. 861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 8625a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_dereference *lhs; 863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 864a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 867fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 872fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 8735a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 8745a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 8755a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 8765a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Component mask written 8775a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 8785a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * For non-vector types in the LHS, this field will be zero. For vector 8795a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * types, a bit will be set for each component that is written. Note that 8805a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * for \c vec2 and \c vec3 types only the lower bits will ever be set. 881b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 882b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * A partially-set write mask means that each enabled channel gets 883b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * the value from a consecutive channel of the rhs. For example, 884b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * to write just .xyw of gl_FrontColor with color: 885b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 886b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (assign (constant bool (1)) (xyw) 887b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (var_ref gl_FragColor) 888b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (swiz xyw (var_ref color))) 8895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 8905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask:4; 891a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 892a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 8933b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 894160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 8953b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 896a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 897a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 898a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 899a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 900a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 901a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 90444d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 905500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_exp, /**< Log base e on gentype */ 906500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_log, /**< Natural log on gentype */ 90701665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 90801665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 909500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_f2i, /**< Float-to-integer conversion. */ 9108e31f961e6cfd9680b33647c053b0f708abb8a18Paul Berry ir_unop_f2u, /**< Float-to-unsigned conversion. */ 911500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_i2f, /**< Integer-to-float conversion. */ 912500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_f2b, /**< Float-to-boolean conversion */ 913500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_b2f, /**< Boolean-to-float conversion */ 914500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_i2b, /**< int-to-boolean conversion */ 915500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_b2i, /**< Boolean-to-int conversion */ 916500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_u2f, /**< Unsigned-to-float conversion. */ 917500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_i2u, /**< Integer-to-unsigned conversion. */ 918500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_u2i, /**< Unsigned-to-integer conversion. */ 919500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_bitcast_i2f, /**< Bit-identical int-to-float "conversion" */ 920500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_bitcast_f2i, /**< Bit-identical float-to-int "conversion" */ 921500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_bitcast_u2f, /**< Bit-identical uint-to-float "conversion" */ 922500dcbb1aa991d4c92200fcacd6eb288bb2638d7Olivier Galibert ir_unop_bitcast_f2u, /**< Bit-identical float-to-uint "conversion" */ 9235e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_unop_any, 924a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 925a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 927a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 928a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 929a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 931a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 932d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_unop_fract, 933d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke ir_unop_round_even, 934a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 93657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 93757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 93857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 93957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 94057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 94157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 942f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */ 943f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */ 94457e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 94557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 946b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 947b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 948b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 949b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 950b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 951b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 952b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 953b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 9543a5ce85cfa4914711e56c8cf831699242618928eIan Romanick ir_unop_noise, 9553a5ce85cfa4914711e56c8cf831699242618928eIan Romanick 956007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 957007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the unary operations. 958007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 959007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_unop = ir_unop_noise, 960007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 964a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 9658a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt 9668a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt /** 9678a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Takes one of two combinations of arguments: 9688a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 9698a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, vecN) 9708a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, float) 9718a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 9728a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Does not take integer types. 9738a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt */ 974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 97714eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * \name Binary comparison operators which return a boolean vector. 97814eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * The type of both operands must be equal. 979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 9854dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_equal, 9864dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_nequal, 987832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 988832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether all components of operands[0] 989832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * equal the components of operands[1]. 990832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 9914dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_all_equal, 992832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 993832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether any component of operands[0] 994832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * is not equal to the corresponding component of operands[1]. 995832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 9964dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_any_nequal, 997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 998a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 1001a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 1003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 1004a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 1005a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 1006a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 1007a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 1008a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 1009a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1010a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 1011a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 1012a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 1013a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1014a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 1015a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 1016a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 1017a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1018007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_binop_pow, 1019007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 1020007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 10212ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt * Load a value the size of a given GLSL type from a uniform block. 10222ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt * 10232ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt * operand0 is the ir_constant uniform block index in the linked shader. 10242ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt * operand1 is a byte offset within the uniform block. 10252ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt */ 10262ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt ir_binop_ubo_load, 10272ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt 10282ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt /** 1029007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the binary operations. 1030007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 10312ea3ab14f2182978f471674c9dfce029d37f70a7Eric Anholt ir_last_binop = ir_binop_ubo_load, 1032007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 103311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_quadop_vector, 103411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick 1035007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 1036007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of all operations. 1037007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 1038d3de40742f50340789ae0df9af582e702e963300Ian Romanick ir_last_opcode = ir_quadop_vector 1039a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1040a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1041fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 1042a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 104313f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 104413f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for unary operation expressions 104513f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 104613f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick ir_expression(int op, const struct glsl_type *type, ir_rvalue *); 10476b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt ir_expression(int op, ir_rvalue *); 104813f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick 104913f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 105013f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for binary operation expressions 105113f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 1052a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 1053fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 10546b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1); 1055a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 105611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick /** 105711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick * Constructor for quad operator expressions 105811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick */ 105911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_expression(int op, const struct glsl_type *type, 106011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *); 106111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick 10626d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual ir_expression *as_expression() 10636d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt { 10646d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt return this; 10656d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt } 10666d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt 10678273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 10684b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1069e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 1070e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Attempt to constant-fold the expression 1071e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 10726e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * The "variable_context" hash table links ir_variable * to ir_constant * 10736e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * that represent the variables' values. \c NULL represents an empty 10746e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * context. 10756e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert * 1076e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * If the expression cannot be constant folded, this method will return 1077e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c NULL. 1078e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 10796e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1080fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1081e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 1082e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 1083e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 10847dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 1085e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 1086e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 1087e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 1088e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 10894b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt unsigned int get_num_operands() const 10907dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 109111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick return (this->operation == ir_quadop_vector) 109211d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ? this->type->vector_elements : get_num_operands(operation); 10937dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 1094160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 10953b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 10963b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 10973b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 10983b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 10993b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 11003b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 1101351525d534268b08c090f9ce42a67e9329a969aeIan Romanick * Return a string representing this expression's operator. 1102351525d534268b08c090f9ce42a67e9329a969aeIan Romanick */ 1103351525d534268b08c090f9ce42a67e9329a969aeIan Romanick static const char *operator_string(ir_expression_operation); 1104351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 1105351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 1106351525d534268b08c090f9ce42a67e9329a969aeIan Romanick /** 11073b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 11083b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 11093b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 11103b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 111178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 111278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 111378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 111478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 111578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 11168895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 111911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_rvalue *operands[4]; 1120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1121a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1122a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1123ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 1124d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * HIR instruction representing a high-level function call, containing a list 1125d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * of parameters and returning a value in the supplied temporary. 1126ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 1127d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunkeclass ir_call : public ir_instruction { 1128ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 1129d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir_call(ir_function_signature *callee, 1130d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir_dereference_variable *return_deref, 1131d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke exec_list *actual_parameters) 1132d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke : return_deref(return_deref), callee(callee) 1133ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 1134d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_call; 11359e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 1136471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 113766f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick this->use_builtin = callee->is_builtin; 1138ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 1139ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 11408273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 11414b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 11426e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1143fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1144cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 1145cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1146cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 1147cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1148cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1149ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 1150ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 1151ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 1152ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 1153ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 11548895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11558895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1156ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 11579878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 11589878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 11599878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 11609878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 11619878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 11629878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 11639878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 116493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 116593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 116693614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 116793614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 116893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 11690f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 117093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 117193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 1172e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 1173cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 1174d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * storing the return value in return_deref. 1175cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 1176d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke void generate_inline(ir_instruction *ir); 1177d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke 1178d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke /** 1179d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * Storage for the function's return value. 1180d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke * This must be NULL if the return type is void. 1181d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke */ 1182d884f60861f270cdcf7d9d47765efcf1e1de30b6Kenneth Graunke ir_dereference_variable *return_deref; 1183cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 118482065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke /** 118582065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke * The specific function signature being called. 118682065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke */ 118782065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke ir_function_signature *callee; 118882065fa20ee3f2880a070f1f4f75509b910ceddeKenneth Graunke 1189a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick /* List of ir_rvalue of paramaters passed in this call. */ 1190a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick exec_list actual_parameters; 1191a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick 119266f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick /** Should this call only bind to a built-in function? */ 119366f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick bool use_builtin; 1194ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 1195ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 1196ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 11979578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 11989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 11999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 12009578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 12019578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 12029578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 12039578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 12049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 12059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 12069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1207d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 12089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 12099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 12109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 12119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 12129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 12139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 12149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 12159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1216d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 12179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 12189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 1219fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 12209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 12219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1222d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 12239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 12249578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 12258273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 12264b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1227cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 1228cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1229cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 1230cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1231cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1232fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 12339578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 12349578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 12359578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 12369578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 12379578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 12389578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 12399578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 12409578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 12419578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 12428895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 12438895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1244fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 12459578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 1246f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1247f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1248f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 1249f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 1250f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1251f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 1252f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 1253f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1254f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 1255f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 1256f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 1257f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 1258f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 1259f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 1260f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 1261f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 1262f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 12634b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_loop_jump(jump_mode mode) 1264f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1265d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_loop_jump; 12660c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->mode = mode; 1267f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1268f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 12698273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 12704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1271f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 1272f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1273f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 1274f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1275f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 12768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 12778895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1278f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 1279f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1280f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 1281f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1282f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1283f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 1284f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1285f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 1286f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1287f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1288f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 1289f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 1290f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 129116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 129216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/** 129316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements. 129416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */ 129516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump { 129616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic: 129716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard() 129816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 1299d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_discard; 130016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = NULL; 130116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 130216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 130316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard(ir_rvalue *cond) 130416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 130584ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius this->ir_type = ir_type_discard; 130616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = cond; 130716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 130816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 13098273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 131016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 131116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void accept(ir_visitor *v) 131216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 131316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke v->visit(this); 131416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 131516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 131616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 131716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 13181eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke virtual ir_discard *as_discard() 13191eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke { 13201eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke return this; 13211eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke } 13221eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke 132316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_rvalue *condition; 132416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}; 13259578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 13269578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 13279578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 132881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 132981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 133081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 133181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 1332e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_tex, /**< Regular texture look-up */ 1333e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txb, /**< Texture look-up with LOD bias */ 1334e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txl, /**< Texture look-up with explicit LOD */ 1335e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txd, /**< Texture look-up with partial derivatvies */ 13361e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke ir_txf, /**< Texel fetch with explicit LOD */ 13371e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke ir_txs /**< Texture size */ 133881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 133981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 134081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 134181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 134281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 134381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 134481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 134581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 134681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 134781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 1348233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * Texel offset (0 or an expression) 1349233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | Projection divisor 1350233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | | Shadow comparitor 1351233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | | | 1352233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * v v v 1353233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (tex <type> <sampler> <coordinate> 0 1 ( )) 1354233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>) 1355233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>) 1356233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy)) 1357233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txf <type> <sampler> <coordinate> 0 <lod>) 13581e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke * (txs <type> <sampler> <lod>) 135981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 136081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 136181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 136281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 1363b656df990f8c1d7468e11afa2079511d8b1febf4Kenneth Graunke : op(op), coordinate(NULL), projector(NULL), shadow_comparitor(NULL), 1364b656df990f8c1d7468e11afa2079511d8b1febf4Kenneth Graunke offset(NULL) 136581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 1366d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_texture; 136781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 136881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 13698273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 13704b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 13716e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1372fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 137326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 137426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 137526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 137626d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 137726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 137826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 137926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 1380c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1381c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 1382c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1383c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 1384c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 1385233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke /** Set the sampler and type. */ 1386233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke void set_sampler(ir_dereference *sampler, const glsl_type *type); 138756d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 1388c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1389c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1390c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1391c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 1392c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 139381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 139481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 139581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 139681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 139781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 139881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 139981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 140081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 140181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 140281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 140381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 140481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 140581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 140681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 140781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 140881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 140981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 141081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 141181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 141281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 141381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 141481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 141581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 141681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 141781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1418c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke /** Texel offset. */ 1419c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke ir_rvalue *offset; 142081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 142181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 142281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 142381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 142481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 142581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 142681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 142781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 142881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 142981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 143081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 143181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 1433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 1434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 1435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 1436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 1437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 1440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1441f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 1442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 1445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 1447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 1449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1451affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1452affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 1453affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 1454affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1455affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 14566315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 14576315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 14586315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 145905a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1460cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 14618273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 14624b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 14636e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1464fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 14657d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 14667d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 14677d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 14687d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 14697d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 1470affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 1471affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 1472affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 1473affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1474affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1475affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 1476affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1477affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 1478affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1479affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 14808895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 14818895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1482a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry bool is_lvalue() const 1483affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1484a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 1485affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1486affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 14872b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 14882b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 14892b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1490a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const; 14912b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 1492affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 1493affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 14946315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 14956315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate: 14966315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick /** 14976315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * Initialize the mask component of a swizzle 14986315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * 14996315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * This is used by the \c ir_swizzle constructors. 15006315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick */ 15016315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick void init_mask(const unsigned *components, unsigned count); 1502affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 1503affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1504affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1505fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 1506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 15078273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1508ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 150944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 151044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 151144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 151244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 151344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 1514a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry bool is_lvalue() const; 1515fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 15162b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 15172b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 15182b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1519a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const = 0; 1520a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1521a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert /** 1522a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * Get the constant that is ultimately referenced by an r-value, 1523a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * in a constant expression evaluation context. 1524a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * 1525a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * The offset is used when the reference is to a specific column of 1526a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * a matrix. 1527a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert */ 1528a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const = 0; 152970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 153070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 153170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 153270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 153370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 153470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 153570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 15368273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_variable *clone(void *mem_ctx, 15378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 15384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 15396e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1540fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1541d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual ir_dereference_variable *as_dereference_variable() 1542d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt { 1543d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt return this; 1544d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1545d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 154670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 154770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 154870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1549a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 155070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 155136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 155270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1553f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1554a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert /** 1555a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * Get the constant that is ultimately referenced by an r-value, 1556a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * in a constant expression evaluation context. 1557a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * 1558a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * The offset is used when the reference is to a specific column of 1559a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * a matrix. 1560a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert */ 1561a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const; 1562a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1563b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 1564b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 1565b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 1566b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 1567b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 1568b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 1569b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 1570b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 1571b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 1572b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 1573b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 1574c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1575c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1576c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1577c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1578c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1579f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 158036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 158136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 158236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 158336ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 158436ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 158570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 158670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 158770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 158870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 158970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 159070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 159170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 159270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 159370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 15948273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_array *clone(void *mem_ctx, 15958273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 15964b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 15976e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1598fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1599b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 1600b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 1601b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 1602b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 1603b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 160470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 160570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 160670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1607a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 160870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 160936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 161070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 161170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 1612a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert /** 1613a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * Get the constant that is ultimately referenced by an r-value, 1614a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * in a constant expression evaluation context. 1615a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * 1616a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * The offset is used when the reference is to a specific column of 1617a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * a matrix. 1618a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert */ 1619a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const; 1620a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1621c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1622c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1623c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1624c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1625c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1626f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 162770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 162836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 162936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 163036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 163170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 163270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 163370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 163470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 163570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 163670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 163770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 163870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 163970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 164070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 164170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 16428273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_record *clone(void *mem_ctx, 16438273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 16444b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 16456e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1646fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 164770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 164870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 164970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1650a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 165170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 165236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 165370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1654f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1655a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert /** 1656a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * Get the constant that is ultimately referenced by an r-value, 1657a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * in a constant expression evaluation context. 1658a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * 1659a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * The offset is used when the reference is to a specific column of 1660a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert * a matrix. 1661a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert */ 1662a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert virtual void constant_referenced(struct hash_table *variable_context, ir_constant *&store, int &offset) const; 1663a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1664c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1665c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1666c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1667c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1668c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1669f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 167036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 167136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 167236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1676be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 1677be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant 1678be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */ 1679be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data { 1680be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick unsigned u[16]; 1681be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick int i[16]; 1682be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick float f[16]; 1683be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick bool b[16]; 1684be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick}; 1685be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1686be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1687fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1689824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick ir_constant(const struct glsl_type *type, const ir_constant_data *data); 16903c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 16913c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 16923c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 16933c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1695989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1696756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1697756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1698756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1699756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1700756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1701989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1702989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1703989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1704989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1705989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1706989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1707989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1708989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1709989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1710989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1711989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 1712ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke /** 1713ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke * Return a new ir_constant of the specified type containing all zeros. 1714ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke */ 1715ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke static ir_constant *zero(void *mem_ctx, const glsl_type *type); 1716ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke 17178273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 17184b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 17196e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert virtual ir_constant *constant_expression_value(struct hash_table *variable_context = NULL); 1720fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 17215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 17225c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 17235c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 17245c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 17255c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 172678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 172778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 172878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 172978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 173078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 17318895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 17328895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 173431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 173531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 173631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 173731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 173831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 173931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 174031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 174131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 174231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 174331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 174431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 174531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 174631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 174774e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant *get_array_element(unsigned i) const; 174874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 1749b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick ir_constant *get_record_field(const char *name); 1750b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick 175131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 17528ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * Copy the values on another constant at a given offset. 17538ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * 17548ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * The offset is ignored for array or struct copies, it's only for 17558ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * scalars or vectors into vectors or matrices. 17568ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * 17578ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * With identical types on both sides and zero offset it's clone() 17588ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * without creating a new object. 17598ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert */ 17608ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert 17618ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert void copy_offset(ir_constant *src, int offset); 17628ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert 17638ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert /** 17648ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * Copy the values on another constant at a given offset and 17658ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * following an assign-like mask. 17668ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * 17678ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * The mask is ignored for scalars. 17688ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * 17698ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * Note that this function only handles what assign can handle, 17708ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * i.e. at most a vector as source and a column of a matrix as 17718ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert * destination. 17728ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert */ 17738ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert 17748ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert void copy_masked_offset(ir_constant *src, int offset, unsigned int mask); 17758ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert 17768ec01ba2ff95449674c779c05afcd32bbf7dbdc8Olivier Galibert /** 17771e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick * Determine whether a constant has the same value as another constant 177838e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick * 17798e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::is_zero, ir_constant::is_one, 17809aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner * ir_constant::is_negative_one, ir_constant::is_basis 17811e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick */ 17821e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick bool has_value(const ir_constant *) const; 17831e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick 1784ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 1785ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 17868e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 17879aa3fbcc2e1f46416f1d334427ebe48388584384Matt Turner virtual bool is_basis() const; 178838e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick 178938e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick /** 1790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1791a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1796be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick union ir_constant_data value; 17977f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 179874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Array elements */ 179974e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant **array_elements; 180074e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 180174e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Structure fields */ 18027f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1803710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick 1804710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate: 1805710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick /** 1806710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick * Parameterless constructor only used by the clone method 1807710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick */ 1808710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick ir_constant(void); 1809a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1811e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/ 1812e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 1813e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1814e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list 1815e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 181670b74928a220aff024664714877defb0caedf33fEric Anholtvoid 181770b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1818adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 1819e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1820e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list 1821e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 182253cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions); 182353cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt 182402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct _mesa_glsl_parse_state; 182502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct gl_shader_program; 182602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 182702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/** 182802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether an unlinked shader contains static recursion 182902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * 183002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion, 183102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c _mesa_glsl_error will be called to emit error messages for each function 183202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle. 183302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */ 183402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid 183502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_unlinked(struct _mesa_glsl_parse_state *state, 183602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick exec_list *instructions); 183702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 183802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/** 183902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether a linked shader contains static recursion 184002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * 184102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion, 184202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c link_error_printf will be called to emit error messages for each function 184302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle. In addition, 184402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c gl_shader_program::LinkStatus will be set to false. 184502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */ 184602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid 184702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_linked(struct gl_shader_program *prog, 184802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick exec_list *instructions); 184902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 1850f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/** 1851f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list 1852f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * 1853f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in List of IR instructions that are to be cloned 1854f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out List to hold the cloned instructions 1855f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */ 1856f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid 18578273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 1858f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick 1859adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1860adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1861adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1862e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1863c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 186481168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke_mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state); 1865c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 186660e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void 1867d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void); 1868d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick 1869d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void 187060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx); 187160e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick 18721cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table; 18734ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 18744ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void 18754ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest, 18761cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca struct glsl_symbol_table *symbols, void *mem_ctx); 18774ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 18789f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool 18799f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir); 18809f82806c7b5109553cf806a5652e6b6198665094Eric Anholt 1881925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void 1882cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berrydo_set_program_inouts(exec_list *instructions, struct gl_program *prog, 1883cf45949d6a896651a5f3864d3b195e26d59eee74Paul Berry bool is_fragment_shader); 1884925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 18851ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickextern char * 18861ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickprototype_string(const glsl_type *return_type, const char *name, 18871ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick exec_list *parameters); 18881ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick 1889e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1890