ir.h revision a52b53b56e2b5d5853345d8bcd2a4ff50e495c20
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" 370044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick 38e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 39e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \defgroup IR Intermediate representation nodes 40e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 41e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 42e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 43e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 44e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 45e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Class tags 46e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 47e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Each concrete class derived from \c ir_instruction has a value in this 48e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * enumerant. The value for the type is stored in \c ir_instruction::ir_type 49e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * by the constructor. While using type tags is not very C++, it is extremely 50e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * convenient. For example, during debugging you can simply inspect 51e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to find out the actual type of the object. 52e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 53e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * In addition, it is possible to use a switch-statement based on \c 54e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type to select different behavior for different object 55e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types. For functions that have only slight differences for several object 56e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * types, this allows writing very straightforward, readable code. 57e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 58d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholtenum ir_node_type { 59e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 60e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Zero is unused so that the IR validator can detect cases where 61e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c ir_instruction::ir_type has not been initialized. 62e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 63d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_unset, 64d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_variable, 65d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_assignment, 66d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_call, 67d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_constant, 68d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_array, 69d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_record, 70d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_dereference_variable, 71d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_discard, 72d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_expression, 73d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function, 74d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_function_signature, 75d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_if, 76d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop, 77d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_loop_jump, 78d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_return, 79d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_swizzle, 80d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type_texture, 816dc89d221d43fad5f3edbb903997160af071bec0Brian Paul ir_type_max /**< maximum ir_type enum number, for validation */ 82d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt}; 83d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt 84a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 85a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Base class of all IR instructions 86a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 870044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickclass ir_instruction : public exec_node { 88a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 89d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt enum ir_node_type ir_type; 90a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *type; 91a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 92e46a454305af64710ce8deadafc718f75363ac7eEric Anholt /** ir_print_visitor helper for debugging. */ 934b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt void print(void) const; 94e46a454305af64710ce8deadafc718f75363ac7eEric Anholt 9578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *) = 0; 968895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0; 978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_instruction *clone(void *mem_ctx, 988273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const = 0; 9978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 10044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /** 10144e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \name IR instruction downcast functions 10244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * 10344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * These functions either cast the object to a derived class or return 10444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * \c NULL if the object's type does not match the specified derived class. 10544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke * Additional downcast functions will be added as needed. 10644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke */ 10744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@{*/ 10844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_variable * as_variable() { return NULL; } 1096202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual class ir_function * as_function() { return NULL; } 11044e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual class ir_dereference * as_dereference() { return NULL; } 111b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual class ir_dereference_array * as_dereference_array() { return NULL; } 112d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual class ir_dereference_variable *as_dereference_variable() { return NULL; } 1136d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual class ir_expression * as_expression() { return NULL; } 114fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual class ir_rvalue * as_rvalue() { return NULL; } 11501f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual class ir_loop * as_loop() { return NULL; } 116cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_assignment * as_assignment() { return NULL; } 117cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_call * as_call() { return NULL; } 118cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual class ir_return * as_return() { return NULL; } 1195ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual class ir_if * as_if() { return NULL; } 1207d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual class ir_swizzle * as_swizzle() { return NULL; } 1215c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual class ir_constant * as_constant() { return NULL; } 1221eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke virtual class ir_discard * as_discard() { return NULL; } 12344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke /*@}*/ 12444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 125a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickprotected: 12644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke ir_instruction() 127d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick { 128d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 1290a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke type = NULL; 130d27ec2461bca2625d09a3592ec8cc4137d4347f3Ian Romanick } 131a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 133a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 134fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_rvalue : public ir_instruction { 135fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkepublic: 1368273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0; 137ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 138fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value() = 0; 139fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 140fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke virtual ir_rvalue * as_rvalue() 141fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 142fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return this; 143fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 144fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 14502939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt ir_rvalue *as_rvalue_to_saturate(); 14602939d643f878ce3a3dcd2e7b2c6f035c64ecda7Eric Anholt 147a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual bool is_lvalue() const 148fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke { 149fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke return false; 150fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke } 151fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 1522b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 1532b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 1542b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 155a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 1562b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick { 1572b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick return NULL; 1582b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick } 1592b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 160b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 161b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /** 162b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * If an r-value is a reference to a whole variable, get that variable 163b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * 164b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * \return 165b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * Pointer to a variable that is completely dereferenced by the r-value. If 166b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * the r-value is not a dereference or the dereference does not access the 167b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * entire variable (i.e., it's just one array element, struct field), \c NULL 168b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * is returned. 169b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 170b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 171b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 172b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return NULL; 173b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 174b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 175ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 176ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value zero 177ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 178ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 179ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 180ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 181ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * zero (or \c false for booleans). 182ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 1838e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one 184ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 185ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 186ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 187ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick /** 188ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * Determine if an r-value has the value one 189ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 190ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * The base implementation of this function always returns \c false. The 191ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * \c ir_constant class over-rides this function to return \c true \b only 192ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * for vector and scalar types that have all elements set to the value 193ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * one (or \c true for booleans). 194ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick * 1958e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one 196ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick */ 197ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 198ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick 1998e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick /** 2008e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * Determine if an r-value has the value negative one 2018e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2028e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * The base implementation of this function always returns \c false. The 2038e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \c ir_constant class over-rides this function to return \c true \b only 2048e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * for vector and scalar types that have all elements set to the value 2058e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * negative one. For boolean times, the result is always \c false. 2068e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * 2078e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one 2088e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick */ 2098e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 2108e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick 211fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeprotected: 2120a89175a35ba3ac2a94d0ba9bcc9926edc8927e3Kenneth Graunke ir_rvalue(); 213fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke}; 214fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 215fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 216e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 217e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Variable storage classes 218e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_variable_mode { 220e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_auto = 0, /**< Function local variables and globals. */ 221e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_var_uniform, /**< Variable declared as a uniform. */ 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_in, 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_out, 2247e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_inout, 225819d57fce94b20fa0d34da6f037f0a53c4a5bdc2Kenneth Graunke ir_var_const_in, /**< "in" param that must be a constant expression */ 2267ce186358e881d1e30eda716a8dea73d2dab2ee9Brian Paul ir_var_system_value, /**< Ex: front-face, instance-id, etc. */ 2277e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_var_temporary /**< Temporary variable generated during compilation. */ 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 230a22426dc4c934673e8f0af5c70a67505a4de7aadCarl Worthenum ir_variable_interpolation { 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_smooth = 0, 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_flat, 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_var_noperspective 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2365fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/** 2375fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Layout qualifiers for gl_FragDepth. 2385fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * 2395fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * The AMD_conservative_depth extension allows gl_FragDepth to be redeclared 2405fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * with a layout qualifier. 2415fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */ 2425fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceenum ir_depth_layout { 2435fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_none, /**< No depth layout is specified. */ 2445fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_any, 2455fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_greater, 2465fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_less, 2475fc57f471b10e74546f999269a2a8f9186da9731Chad Versace ir_depth_layout_unchanged 2485fc57f471b10e74546f999269a2a8f9186da9731Chad Versace}; 2495fc57f471b10e74546f999269a2a8f9186da9731Chad Versace 2505fc57f471b10e74546f999269a2a8f9186da9731Chad Versace/** 2515fc57f471b10e74546f999269a2a8f9186da9731Chad Versace * \brief Convert depth layout qualifier to string. 2525fc57f471b10e74546f999269a2a8f9186da9731Chad Versace */ 2535fc57f471b10e74546f999269a2a8f9186da9731Chad Versaceconst char* 2545fc57f471b10e74546f999269a2a8f9186da9731Chad Versacedepth_layout_string(ir_depth_layout layout); 255fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 25689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick/** 25789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Description of built-in state associated with a uniform 25889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 25989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \sa ir_variable::state_slots 26089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */ 26189d81ab16c05818b290ed735c1343d3abde449bfIan Romanickstruct ir_state_slot { 26289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick int tokens[5]; 26389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick int swizzle; 26489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick}; 26589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick 266a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_variable : public ir_instruction { 267a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 2687e2aa91507a5883e33473e0a94215ee3985baad1Ian Romanick ir_variable(const struct glsl_type *, const char *, ir_variable_mode); 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 2708273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const; 2714b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 27244e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_variable *as_variable() 27344e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 27444e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 27544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 27644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 27778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 27878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 27978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 28078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 28178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 2828895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 2838895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 2842d394d4877794d19756c3760d711524dca89f772Ian Romanick 285950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick /** 286950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * Get the string value for the interpolation qualifier 287950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick * 288046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * \return The string that would be used in a shader to specify \c 289046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * mode will be returned. 290046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * 291046bef235744e891e4a48076e1a3ff9a61a63092Eric Anholt * This function should only be used on a shader input or output variable. 292950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick */ 293950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick const char *interpolation_string() const; 294950ceb2bd60c25e7fecdff0fbcbf6e69015588f3Ian Romanick 2958b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick /** 2968b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * Calculate the number of slots required to hold this variable 2978b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * 2988b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * This is used to determine how many uniform or varying locations a variable 2998b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick * occupies. The count is in units of floating point components. 3008b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick */ 3018b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick unsigned component_slots() const; 3028b80e9f9e3bc9ca41c95125826139471f73602c4Ian Romanick 303e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 304e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Delcared name of the variable 305e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 308b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick /** 309b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Highest element accessed with a constant expression array index 310b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * 311b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick * Not used for non-array variables. 312b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick */ 313b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick unsigned max_array_access; 314b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick 315e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 316e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Is the variable read-only? 317e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 318e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * This is set for variables declared as \c const, shader inputs, 319e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * and uniforms. 320e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned read_only:1; 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned centroid:1; 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned invariant:1; 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 325e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 326bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * Has this variable been used for reading or writing? 327bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * 328bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * Several GLSL semantic checks require knowledge of whether or not a 329bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * variable has been used. For example, it is an error to redeclare a 330bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick * variable as invariant after it has been used. 331bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick */ 332bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick unsigned used:1; 333bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick 334bd33055ef4b6dd18d6247ff7d9e47496ff4acc51Ian Romanick /** 335e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Storage class of the variable. 336e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 337e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_mode 338e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned mode:3; 340e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 341e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 342e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Interpolation mode for shader inputs / outputs 343e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 344e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \sa ir_variable_interpolation 345e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned interpolation:2; 3479d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick 3489d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick /** 3499d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * Flag that the whole array is assignable 3509d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * 3519d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * In GLSL 1.20 and later whole arrays are assignable (and comparable for 3529d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick * equality). This flag enables this behavior. 3539d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick */ 3549d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick unsigned array_lvalue:1; 355326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt 356e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 357e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \name ARB_fragment_coord_conventions 358e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * @{ 359e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 3604a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned origin_upper_left:1; 3614a962170d7cf4243d6ae156fca20a6167388925dEric Anholt unsigned pixel_center_integer:1; 362e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /*@}*/ 3634a962170d7cf4243d6ae156fca20a6167388925dEric Anholt 364326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt /** 365bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace * \brief Layout qualifier for gl_FragDepth. 366bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace * 367bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace * This is not equal to \c ir_depth_layout_none if and only if this 368bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace * variable is \c gl_FragDepth and a layout qualifier is specified. 369bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace */ 370bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace ir_depth_layout depth_layout; 371bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace 372bc04d244f5a86fd7085e3d648949413e2d2ec797Chad Versace /** 373eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * Was the location explicitly set in the shader? 374eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * 375eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * If the location is explicitly set in the shader, it \b cannot be changed 376eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * by the linker or by the API (e.g., calls to \c glBindAttribLocation have 377eee68d3631813580a14fa51fda6f0c959279256cIan Romanick * no effect). 378eee68d3631813580a14fa51fda6f0c959279256cIan Romanick */ 379eee68d3631813580a14fa51fda6f0c959279256cIan Romanick unsigned explicit_location:1; 380eee68d3631813580a14fa51fda6f0c959279256cIan Romanick 381eee68d3631813580a14fa51fda6f0c959279256cIan Romanick /** 38269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * Storage location of the base of this variable 38369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 38469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * The precise meaning of this field depends on the nature of the variable. 38569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 38669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader input: one of the values from \c gl_vert_attrib. 38769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Vertex shader output: one of the values from \c gl_vert_result. 38869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader input: one of the values from \c gl_frag_attrib. 38969a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Fragment shader output: one of the values from \c gl_frag_result. 39069a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Uniforms: Per-stage uniform slot number. 39169a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * - Other: This field is not currently used. 39269a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * 39369a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * If the variable is a uniform, shader input, or shader output, and the 39469a079aee8f79104501faeb2a5092b643f956d33Ian Romanick * slot has not been assigned, the value will be -1. 39569a079aee8f79104501faeb2a5092b643f956d33Ian Romanick */ 39669a079aee8f79104501faeb2a5092b643f956d33Ian Romanick int location; 39769a079aee8f79104501faeb2a5092b643f956d33Ian Romanick 39869a079aee8f79104501faeb2a5092b643f956d33Ian Romanick /** 39989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Built-in state that backs this uniform 40089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 40189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * Once set at variable creation, \c state_slots must remain invariant. 40289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * This is because, ideally, this array would be shared by all clones of 40389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * this variable in the IR tree. In other words, we'd really like for it 40489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * to be a fly-weight. 40589d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * 40689d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * If the variable is not a uniform, \c num_state_slots will be zero and 40789d81ab16c05818b290ed735c1343d3abde449bfIan Romanick * \c state_slots will be \c NULL. 40889d81ab16c05818b290ed735c1343d3abde449bfIan Romanick */ 40989d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /*@{*/ 41089d81ab16c05818b290ed735c1343d3abde449bfIan Romanick unsigned num_state_slots; /**< Number of state slots used */ 41189d81ab16c05818b290ed735c1343d3abde449bfIan Romanick ir_state_slot *state_slots; /**< State descriptors. */ 41289d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /*@}*/ 41389d81ab16c05818b290ed735c1343d3abde449bfIan Romanick 41489d81ab16c05818b290ed735c1343d3abde449bfIan Romanick /** 415c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick * Emit a warning if this variable is accessed. 416c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick */ 417c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick const char *warn_extension; 418c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick 419c178c74c27ab292651dcf7da02a7d035366cae04Ian Romanick /** 420326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt * Value assigned in the initializer of a variable declared "const" 421326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt */ 422326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt ir_constant *constant_value; 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@{*/ 4279fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke/** 4289fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * The representation of a function instance; may be the full definition or 4299fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * simply a prototype. 4309fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke */ 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function_signature : public ir_instruction { 432894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /* An ir_function_signature will be part of the list of signatures in 433894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt * an ir_function. 434894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt */ 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 436e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick ir_function_signature(const glsl_type *return_type); 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 4388273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function_signature *clone(void *mem_ctx, 4398273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *ht) const; 44001a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke ir_function_signature *clone_prototype(void *mem_ctx, 44101a25bb64ecae156729794320f9a39733ff8eeaaKenneth Graunke struct hash_table *ht) const; 4424b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 44378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 44478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 44578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 44678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 44778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 4488895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 4498895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 4510f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick * Get the name of the function for which this is a signature 4520f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick */ 4530f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick const char *function_name() const; 4540f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 4550f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick /** 456df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * Get a handle to the function for which this is a signature 457df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 458df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * There is no setter function, this function returns a \c const pointer, 459df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * and \c ir_function_signature::_function is private for a reason. The 460df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * only way to make a connection between a function and function signature 461df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * is via \c ir_function::add_signature. This helps ensure that certain 462df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * invariants (i.e., a function signature is in the list of signatures for 463df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * its \c _function) are met. 464df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * 465df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick * \sa ir_function::add_signature 466df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick */ 467df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick inline const class ir_function *function() const 468df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick { 469df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function; 470df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick } 471df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick 472df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick /** 473abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * Check whether the qualifiers match between this signature's parameters 474abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * and the supplied parameter list. If not, returns the name of the first 475abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke * parameter with mismatched qualifiers (for use in error messages). 476abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke */ 477abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke const char *qualifiers_match(exec_list *params); 478abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke 479abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke /** 480bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * Replace the current parameter list with the given one. This is useful 481bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * if the current information came from a prototype, and either has invalid 482bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke * or missing parameter names. 483bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke */ 484bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke void replace_parameters(exec_list *new_params); 485bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke 486bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke /** 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Function return type. 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \note This discards the optional precision qualifier. 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const struct glsl_type *return_type; 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 494f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_variable of function parameters. 495f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * 496f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * This represents the storage. The paramaters passed in a particular 497f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * call will be in ir_call::actual_paramaters. 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 4990044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list parameters; 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5019fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke /** Whether or not this function has a body (which may be empty). */ 5029fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke unsigned is_defined:1; 5036a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 504f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke /** Whether or not this function signature is a built-in. */ 505f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke unsigned is_builtin:1; 506f412fac5b46eb274cbed8e62234d5dbfd859f1feKenneth Graunke 507894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt /** Body of instructions in the function. */ 508894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt struct exec_list body; 509894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt 5106a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanickprivate: 5116a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick /** Function of which this signature is one overload. */ 512df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick class ir_function *_function; 5136a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 5146a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick friend class ir_function; 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/** 5199fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Header for tracking multiple overloaded functions with the same name. 5209fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * Contains a list of ir_function_signatures representing each of the 5219fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke * actual functions. 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickclass ir_function : public ir_instruction { 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 525882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick ir_function(const char *name); 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5278273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const; 5284b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 5296202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke virtual ir_function *as_function() 5306202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke { 5316202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke return this; 5326202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke } 5336202cbfe3614141e330501959a7322522b35f4e4Kenneth Graunke 53478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 53578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 53678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 53778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 53878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 5398895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 5408895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 5416a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick void add_signature(ir_function_signature *sig) 5426a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick { 543df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick sig->_function = this; 544df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick this->signatures.push_tail(sig); 5456a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick } 5466a15d5b514b703ff8dd024f96ffbcb68484a954eIan Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 54895cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick * Get an iterator for the set of function signatures 54995cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick */ 55095cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick exec_list_iterator iterator() 55195cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick { 55295cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick return signatures.iterator(); 55395cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick } 55495cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick 55595cd6cc195f4652378d7ecf614c6e1c568311a04Ian Romanick /** 5560d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that matches a set of actual parameters, taking implicit 5570d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * conversions into account. 558471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 559b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *matching_signature(const exec_list *actual_param); 560471471f83471481db0445e73f8c89e6a9149838eIan Romanick 561471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 5620d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * Find a signature that exactly matches a set of actual parameters without 5630d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke * any implicit type conversions. 5640d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke */ 565b95897b89d36a25c237a021c299a4eb295856476Ian Romanick ir_function_signature *exact_matching_signature(const exec_list *actual_ps); 5660d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke 5670d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke /** 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Name of the function. 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick const char *name; 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 57281f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke /** Whether or not this function has a signature that isn't a built-in. */ 57381f03393982c29f8f4165b5629c8e8fb708b97a3Kenneth Graunke bool has_user_signature(); 574b6f15869b324ae64a00d0fe46fa3c8c62c1edb6cKenneth Graunke 575471471f83471481db0445e73f8c89e6a9149838eIan Romanick /** 576f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt * List of ir_function_signature for each overloaded function with this name. 577471471f83471481db0445e73f8c89e6a9149838eIan Romanick */ 5780044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick struct exec_list signatures; 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 5800f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick 5810f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanickinline const char *ir_function_signature::function_name() const 5820f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick{ 583df05ad4e1aa5512ce1dfd2e6661641e012c8b279Ian Romanick return this->_function->name; 5840f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick} 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*@}*/ 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 5883c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick/** 5893c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick * IR instruction representing high-level if-statements 5903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick */ 5913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickclass ir_if : public ir_instruction { 5923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickpublic: 5933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_if(ir_rvalue *condition) 5943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick : condition(condition) 5953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 596d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_if; 5973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 5983c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 5998273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const; 6004b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 6015ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt virtual ir_if *as_if() 6025ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt { 6035ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt return this; 6045ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt } 6055ba94206083fcd678febd6cac0231f35c0f1b77aEric Anholt 6063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick virtual void accept(ir_visitor *v) 6073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick { 6083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick v->visit(this); 6093c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick } 6103c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 6118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 6133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick ir_rvalue *condition; 614f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the then branch */ 6153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list then_instructions; 616f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction for the body of the else branch */ 6173c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick exec_list else_instructions; 6183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}; 6193c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 6203c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick 621fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick/** 622fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * IR instruction representing a high-level loop structure. 623fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 624fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickclass ir_loop : public ir_instruction { 625fad607a9be59056aecda50176b4d20a8b5319747Ian Romanickpublic: 6263b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_loop(); 627fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 6288273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const; 6294b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 630fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick virtual void accept(ir_visitor *v) 631fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 632fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick v->visit(this); 633fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 634fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 6358895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 6368895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 63701f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick virtual ir_loop *as_loop() 63801f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick { 63901f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick return this; 64001f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick } 64101f8de4a87157b01e8b9fe31c6766a15bbfb2788Ian Romanick 642fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 643fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * Get an iterator for the instructions of the loop body 644fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 645fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list_iterator iterator() 646fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick { 647fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick return body_instructions.iterator(); 648fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick } 649fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 650f1ddca9f2143e377d2a70941dcedbb1f5c699e07Eric Anholt /** List of ir_instruction that make up the body of the loop. */ 651fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick exec_list body_instructions; 652fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 653fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /** 654fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick * \name Loop counter and controls 6553b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 6563b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Represents a loop like a FORTRAN \c do-loop. 6573b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 6583b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \note 6593b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If \c from and \c to are the same value, the loop will execute once. 660fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick */ 661fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@{*/ 6623b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *from; /** Value of the loop counter on the first 6633b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 6643b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 6653b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick ir_rvalue *to; /** Value of the loop counter on the last 6663b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * iteration of the loop. 6673b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 668fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_rvalue *increment; 669fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick ir_variable *counter; 6703b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick 6713b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick /** 6723b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * Comparison operation in the loop terminator. 6733b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * 6743b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * If any of the loop control fields are non-\c NULL, this field must be 6753b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal, 6763b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal. 6773b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick */ 6783b85f1cc6cb12e9d4931e12cf29adde578f389fdIan Romanick int cmp; 679fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick /*@}*/ 680fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick}; 681fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 682fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 6833c033637de7def553559c11d037f2e8bbb750f77Kenneth Graunkeclass ir_assignment : public ir_instruction { 684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 685e617a53a74cd27a322fd2dd05ff1c66c6437fde3Eric Anholt ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL); 686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 6875a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 6885a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Construct an assignment with an explicit write mask 6895a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 6905a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \note 6915a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Since a write mask is supplied, the LHS must already be a bare 6925a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * \c ir_dereference. The cannot be any swizzles in the LHS. 6935a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 6945a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition, 6955a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask); 6965a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 6978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const; 6984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 699fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 700fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 70178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 70278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 70378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 70478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 70578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 7068895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 7078895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 708cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_assignment * as_assignment() 709cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 710cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 711cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 712cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 7145a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Get a whole variable written by an assignment 7155a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 7165a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * If the LHS of the assignment writes a whole variable, the variable is 7175a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * returned. Otherwise \c NULL is returned. Examples of whole-variable 7185a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment are: 7195a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 7205a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to a scalar 7215a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Assigning to all components of a vector 7225a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole array (or matrix) assignment 7235a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * - Whole structure assignment 7245a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 7255a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_variable *whole_variable_written(); 7265a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 7275a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 7285a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Set the LHS of an assignment 7295a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 7305a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick void set_lhs(ir_rvalue *lhs); 7315a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 7325a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Left-hand side of the assignment. 7345a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 7355a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * This should be treated as read only. If you need to set the LHS of an 7365a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * assignment, use \c ir_assignment::set_lhs. 737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 7385a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick ir_dereference *lhs; 739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value being assigned 742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 743fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *rhs; 744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Optional condition for the assignment. 747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 748fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *condition; 7495a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 7505a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick 7515a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick /** 7525a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * Component mask written 7535a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * 7545a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * For non-vector types in the LHS, this field will be zero. For vector 7555a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * types, a bit will be set for each component that is written. Note that 7565a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick * for \c vec2 and \c vec3 types only the lower bits will ever be set. 757b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 758b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * A partially-set write mask means that each enabled channel gets 759b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * the value from a consecutive channel of the rhs. For example, 760b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * to write just .xyw of gl_FrontColor with color: 761b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * 762b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (assign (constant bool (1)) (xyw) 763b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (var_ref gl_FragColor) 764b39e6f33b60ef9bbaf81f320aaca6a440d8a6a8fEric Anholt * (swiz xyw (var_ref color))) 7655a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick */ 7665a7758efbe14dee026245a4f4f4fb3ccf7b2c23bIan Romanick unsigned write_mask:4; 767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 768a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 7693b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke/* Update ir_expression::num_operands() and operator_strs when 770160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt * updating this list. 7713b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickenum ir_expression_operation { 773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_bit_not, 774a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_logic_not, 775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_neg, 776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_abs, 777a4b7b5a654ca810e296bb0cca1b27b8847f5548aKenneth Graunke ir_unop_sign, 778a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rcp, 779a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_rsq, 78044d68fd06ff8b53fc70a9a07c897dda9b3457ef8Eric Anholt ir_unop_sqrt, 781bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_exp, /**< Log base e on gentype */ 782bc4034b243975089c06c4415d4e26edaaaec7a46Eric Anholt ir_unop_log, /**< Natural log on gentype */ 78301665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_exp2, 78401665262e50162e858c45f92a8a7e12b953e56adEric Anholt ir_unop_log2, 785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_f2i, /**< Float-to-integer conversion. */ 786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_i2f, /**< Integer-to-float conversion. */ 787dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_f2b, /**< Float-to-boolean conversion */ 788dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt ir_unop_b2f, /**< Boolean-to-float conversion */ 789c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_i2b, /**< int-to-boolean conversion */ 790c2cb84e17b2f7a5db146faa9c9c2a2ffac4b6c19Eric Anholt ir_unop_b2i, /**< Boolean-to-int conversion */ 7916c86ea8adc095abeef7b3cd63d3321185542bf36Ian Romanick ir_unop_u2f, /**< Unsigned-to-float conversion. */ 79220ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain ir_unop_i2u, /**< Integer-to-unsigned conversion. */ 79320ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain ir_unop_u2i, /**< Unsigned-to-integer conversion. */ 7945e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt ir_unop_any, 795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Unary floating-point rounding operations. 798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_trunc, 801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_ceil, 802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_unop_floor, 803d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt ir_unop_fract, 804d85d25dd1f4fd281bd210ba6ba5135ba1e3b535fKenneth Graunke ir_unop_round_even, 805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 80757e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /** 80857e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke * \name Trigonometric operations. 80957e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke */ 81057e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@{*/ 81157e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_sin, 81257e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke ir_unop_cos, 813f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */ 814f2616e56de8a48360cae8f269727b58490555f4dIan Romanick ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */ 81557e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke /*@}*/ 81657e7da173e8d38bf0c95ded535cdf1b12a00a1a2Kenneth Graunke 817b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /** 818b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke * \name Partial derivatives. 819b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke */ 820b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@{*/ 821b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdx, 822b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke ir_unop_dFdy, 823b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke /*@}*/ 824b843c7a20c2d65494f30eb82622ae7db380f581aKenneth Graunke 8253a5ce85cfa4914711e56c8cf831699242618928eIan Romanick ir_unop_noise, 8263a5ce85cfa4914711e56c8cf831699242618928eIan Romanick 827007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 828007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the unary operations. 829007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 830007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_unop = ir_unop_noise, 831007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 832a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_add, 833a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_sub, 834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mul, 835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_div, 8368a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt 8378a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt /** 8388a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Takes one of two combinations of arguments: 8398a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 8408a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, vecN) 8418a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * - mod(vecN, float) 8428a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * 8438a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt * Does not take integer types. 8448a1f186cc55979bb9df0a88b48da8d81460c3e7cEric Anholt */ 845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_mod, 846a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 84814eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * \name Binary comparison operators which return a boolean vector. 84914eea268284491d64ff92b37723bff1e9ff14b40Kenneth Graunke * The type of both operands must be equal. 850a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 851a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 852a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_less, 853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_greater, 854a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lequal, 855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_gequal, 8564dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_equal, 8574dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_nequal, 858832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 859832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether all components of operands[0] 860832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * equal the components of operands[1]. 861832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 8624dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_all_equal, 863832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt /** 864832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * Returns single boolean for whether any component of operands[0] 865832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt * is not equal to the corresponding component of operands[1]. 866832aad989e3d319a8aaac046aa49df25da134d82Eric Anholt */ 8674dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri ir_binop_any_nequal, 868a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 871a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \name Bit-wise binary operations. 872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@{*/ 874a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_lshift, 875a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_rshift, 876a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_and, 877a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_xor, 878a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_bit_or, 879a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /*@}*/ 880a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 881a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_and, 882a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_xor, 883a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_logic_or, 884a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 885a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_dot, 886a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_min, 887a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_binop_max, 888a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 889007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_binop_pow, 890007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 891007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 892007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of the binary operations. 893007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 894007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_binop = ir_binop_pow, 895007f4881503b69055d65cfb20bd237673779786bKenneth Graunke 89611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_quadop_vector, 89711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick 898007f4881503b69055d65cfb20bd237673779786bKenneth Graunke /** 899007f4881503b69055d65cfb20bd237673779786bKenneth Graunke * A sentinel marking the last of all operations. 900007f4881503b69055d65cfb20bd237673779786bKenneth Graunke */ 901007f4881503b69055d65cfb20bd237673779786bKenneth Graunke ir_last_opcode = ir_last_binop 902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 904fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_expression : public ir_rvalue { 905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 90613f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 90713f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for unary operation expressions 90813f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 90913f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick ir_expression(int op, const struct glsl_type *type, ir_rvalue *); 9106b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt ir_expression(int op, ir_rvalue *); 91113f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick 91213f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick /** 91313f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick * Constructor for binary operation expressions 91413f57d42b6929f50d8ef8b4123f46a61c46fde7bIan Romanick */ 915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression(int op, const struct glsl_type *type, 916fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *, ir_rvalue *); 9176b937465d4aeab72fabcfe5250d477cf6790a521Eric Anholt ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1); 918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 91911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick /** 92011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick * Constructor for quad operator expressions 92111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick */ 92211d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_expression(int op, const struct glsl_type *type, 92311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *); 92411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick 9256d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt virtual ir_expression *as_expression() 9266d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt { 9276d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt return this; 9286d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt } 9296d8a0a0aadaafbab02dffcf7f89eb0210dd37b2eEric Anholt 9308273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const; 9314b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 932e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 933e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Attempt to constant-fold the expression 934e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * 935e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * If the expression cannot be constant folded, this method will return 936e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * \c NULL. 937e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 938fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 939fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 940e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 941e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 942e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 9437dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke static unsigned int get_num_operands(ir_expression_operation); 944e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 945e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 946e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Determine the number of operands used by an expression 947e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 9484b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt unsigned int get_num_operands() const 9497dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke { 95011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick return (this->operation == ir_quadop_vector) 95111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ? this->type->vector_elements : get_num_operands(operation); 9527dd6adbe2e791b22de97175a8715ef1217619c99Kenneth Graunke } 953160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt 9543b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 9553b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Return a string representing this expression's operator. 9563b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 9573b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke const char *operator_string(); 9583b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 9593b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke /** 960351525d534268b08c090f9ce42a67e9329a969aeIan Romanick * Return a string representing this expression's operator. 961351525d534268b08c090f9ce42a67e9329a969aeIan Romanick */ 962351525d534268b08c090f9ce42a67e9329a969aeIan Romanick static const char *operator_string(ir_expression_operation); 963351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 964351525d534268b08c090f9ce42a67e9329a969aeIan Romanick 965351525d534268b08c090f9ce42a67e9329a969aeIan Romanick /** 9663b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke * Do a reverse-lookup to translate the given string into an operator. 9673b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke */ 9683b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke static ir_expression_operation get_operator(const char *); 9693b96996b7eb6e3603a5f138177867c3e856e0dfaKenneth Graunke 97078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 97178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 97278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 97378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 97478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 9758895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 9768895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ir_expression_operation operation; 97811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick ir_rvalue *operands[4]; 979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 982ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick/** 983ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * IR instruction representing a function call 984ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 985fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_call : public ir_rvalue { 986ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickpublic: 9871f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_call(ir_function_signature *callee, exec_list *actual_parameters) 988b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(callee) 989ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 990d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_call; 9919e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick assert(callee->return_type != NULL); 9929e7c34b865309c65ea5a763900e2d0eae4b58ce5Ian Romanick type = callee->return_type; 993471471f83471481db0445e73f8c89e6a9149838eIan Romanick actual_parameters->move_nodes_to(& this->actual_parameters); 99466f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick this->use_builtin = callee->is_builtin; 995ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 996ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 9978273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const; 9984b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 999fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1000fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1001cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_call *as_call() 1002cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1003cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 1004cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1005cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1006ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick virtual void accept(ir_visitor *v) 1007ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick { 1008ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick v->visit(this); 1009ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick } 1010ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 10118895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 10128895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1013ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick /** 1014ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick * Get a generic ir_call object when an error occurs 1015e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth * 1016d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke * Any allocation will be performed with 'ctx' as ralloc owner. 1017ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick */ 1018e01193af325cbdde51b3219c85c58f19d5a87f1bCarl Worth static ir_call *get_error_instruction(void *ctx); 1019ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 10209878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick /** 10219878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick * Get an iterator for the set of acutal parameters 10229878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick */ 10239878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick exec_list_iterator iterator() 10249878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick { 10259878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick return actual_parameters.iterator(); 10269878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick } 10279878c6518f7938bd5fdae22265dd30bc72d7343cIan Romanick 102893614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick /** 102993614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick * Get the name of the function being called. 103093614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick */ 103193614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick const char *callee_name() const 103293614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick { 10330f0ea5826454cf25d6e76ac848a317e673ff1032Ian Romanick return callee->function_name(); 103493614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick } 103593614bc4b971bb59824179057a4bfa7aac383ce3Ian Romanick 1036e053d62aa573651abdd78666d299272c8219a3aaIan Romanick /** 1037e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Get the function signature bound to this function call 1038e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 10391f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *get_callee() 1040cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1041cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return callee; 1042cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1043cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1044cad9766118d269725ef33b4e9588d674d5225010Eric Anholt /** 1045792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick * Set the function call target 1046792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick */ 10471f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt void set_callee(ir_function_signature *sig); 1048792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick 1049792e01c1e259077eb339af3ce61905fd227ae4bdIan Romanick /** 1050cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * Generates an inline version of the function before @ir, 1051cad9766118d269725ef33b4e9588d674d5225010Eric Anholt * returning the return value of the function. 1052cad9766118d269725ef33b4e9588d674d5225010Eric Anholt */ 1053cad9766118d269725ef33b4e9588d674d5225010Eric Anholt ir_rvalue *generate_inline(ir_instruction *ir); 1054cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1055a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick /* List of ir_rvalue of paramaters passed in this call. */ 1056a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick exec_list actual_parameters; 1057a48a2b66e86d6d1c2fbb24bc60df2fdef42b3086Ian Romanick 105866f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick /** Should this call only bind to a built-in function? */ 105966f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick bool use_builtin; 106066f4ac988d5053c9782d1390541b04f4d9c50078Ian Romanick 1061ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickprivate: 1062471471f83471481db0445e73f8c89e6a9149838eIan Romanick ir_call() 1063b427c917ce47675b102fac3ddace883629ff6be8Ian Romanick : callee(NULL) 1064471471f83471481db0445e73f8c89e6a9149838eIan Romanick { 1065d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_call; 1066471471f83471481db0445e73f8c89e6a9149838eIan Romanick } 1067471471f83471481db0445e73f8c89e6a9149838eIan Romanick 10681f47245bdda2c85bf0f0174e6c24a50486b413aaEric Anholt ir_function_signature *callee; 1069ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}; 1070ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 1071ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick 10729578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/** 10739578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * \name Jump-like IR instructions. 10749578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * 10759578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick * These include \c break, \c continue, \c return, and \c discard. 10769578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick */ 10779578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@{*/ 10789578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_jump : public ir_instruction { 10799578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickprotected: 10809578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_jump() 10819578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1082d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt ir_type = ir_type_unset; 10839578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10849578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 10859578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 10869578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickclass ir_return : public ir_jump { 10879578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickpublic: 10889578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick ir_return() 10899578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(NULL) 10909578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1091d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 10929578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10939578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 1094fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_return(ir_rvalue *value) 10959578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick : value(value) 10969578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 1097d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_return; 10989578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 10999578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 11008273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_return *clone(void *mem_ctx, struct hash_table *) const; 11014b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1102cad9766118d269725ef33b4e9588d674d5225010Eric Anholt virtual ir_return *as_return() 1103cad9766118d269725ef33b4e9588d674d5225010Eric Anholt { 1104cad9766118d269725ef33b4e9588d674d5225010Eric Anholt return this; 1105cad9766118d269725ef33b4e9588d674d5225010Eric Anholt } 1106cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 1107fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *get_value() const 11089578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 11099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick return value; 11109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 11119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 11129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick virtual void accept(ir_visitor *v) 11139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick { 11149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick v->visit(this); 11159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick } 11169578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 11178895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11188895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1119fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke ir_rvalue *value; 11209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}; 1121f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1122f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1123f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick/** 1124f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * Jump instructions used inside loops 1125f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1126f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * These include \c break and \c continue. The \c break within a loop is 1127f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * different from the \c break within a switch-statement. 1128f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * 1129f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick * \sa ir_switch_jump 1130f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick */ 1131f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickclass ir_loop_jump : public ir_jump { 1132f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanickpublic: 1133f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode { 1134f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_break, 1135f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick jump_continue 1136f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick }; 1137f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 11384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt ir_loop_jump(jump_mode mode) 1139f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1140d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_loop_jump; 11410c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->mode = mode; 11420c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt this->loop = loop; 1143f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1144f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 11458273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const; 11464b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1147f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick virtual void accept(ir_visitor *v) 1148f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1149f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick v->visit(this); 1150f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1151f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 11528895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 11538895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1154f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_break() const 1155f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1156f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_break; 1157f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1158f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1159f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick bool is_continue() const 1160f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick { 1161f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick return mode == jump_continue; 1162f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick } 1163f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1164f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick /** Mode selector for the jump instruction. */ 1165f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick enum jump_mode mode; 11660c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholtprivate: 11670c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt /** Loop containing this break instruction. */ 11680c005bd773784ee5feb2ee3d7d00c2c4335eafb4Eric Anholt ir_loop *loop; 1169f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick}; 117016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 117116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke/** 117216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke * IR instruction representing discard statements. 117316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke */ 117416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkeclass ir_discard : public ir_jump { 117516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunkepublic: 117616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard() 117716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 1178d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_discard; 117916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = NULL; 118016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 118116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 118216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_discard(ir_rvalue *cond) 118316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 118484ee01f40acf88185484df386b7715034e7685c9Aras Pranckevicius this->ir_type = ir_type_discard; 118516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke this->condition = cond; 118616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 118716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 11888273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const; 118916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 119016efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual void accept(ir_visitor *v) 119116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke { 119216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke v->visit(this); 119316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke } 119416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 119516efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 119616efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 11971eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke virtual ir_discard *as_discard() 11981eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke { 11991eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke return this; 12001eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke } 12011eb7a81f2e43842acd59929ce65db2142b69134dKenneth Graunke 120216efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke ir_rvalue *condition; 120316efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke}; 12049578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick/*@}*/ 12059578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 12069578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick 120781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 120881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Texture sampling opcodes used in ir_texture 120981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 121081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickenum ir_texture_opcode { 1211e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_tex, /**< Regular texture look-up */ 1212e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txb, /**< Texture look-up with LOD bias */ 1213e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txl, /**< Texture look-up with explicit LOD */ 1214e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txd, /**< Texture look-up with partial derivatvies */ 1215e053d62aa573651abdd78666d299272c8219a3aaIan Romanick ir_txf /**< Texel fetch with explicit LOD */ 121681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 121781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 121881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 121981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick/** 122081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * IR instruction to sample a texture 122181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 122281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * The specific form of the IR instruction depends on the \c mode value 122381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * selected from \c ir_texture_opcodes. In the printed IR, these will 122481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * appear as: 122581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 1226233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * Texel offset (0 or an expression) 1227233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | Projection divisor 1228233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | | Shadow comparitor 1229233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * | | | 1230233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * v v v 1231233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (tex <type> <sampler> <coordinate> 0 1 ( )) 1232233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>) 1233233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>) 1234233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy)) 1235233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke * (txf <type> <sampler> <coordinate> 0 <lod>) 123681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 123781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickclass ir_texture : public ir_rvalue { 123881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanickpublic: 123981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_texture(enum ir_texture_opcode op) 1240c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke : op(op), projector(NULL), shadow_comparitor(NULL), offset(NULL) 124181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick { 1242d16044ad4d6176fec6164f96450a25f76b7677f1Eric Anholt this->ir_type = ir_type_texture; 124381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } 124481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 12458273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const; 12464b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1247fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1248fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 124926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual void accept(ir_visitor *v) 125026d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke { 125126d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke v->visit(this); 125226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke } 125326d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 125426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke virtual ir_visitor_status accept(ir_hierarchical_visitor *); 125526d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 1256c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1257c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Return a string representing the ir_texture_opcode. 1258c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1259c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke const char *opcode_string(); 1260c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 1261233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke /** Set the sampler and type. */ 1262233b88eab9d8095523ebae3c4be1dbf2e2bd856aKenneth Graunke void set_sampler(ir_dereference *sampler, const glsl_type *type); 126356d3f6ad782e9819b40544494826954d3fcf978bKenneth Graunke 1264c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke /** 1265c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke * Do a reverse-lookup to translate a string into an ir_texture_opcode. 1266c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke */ 1267c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke static ir_texture_opcode get_opcode(const char *); 1268c30f6e5dea7e75983784f3539304c8dd36356d1cKenneth Graunke 126981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick enum ir_texture_opcode op; 127081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 127181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Sampler to use for the texture access. */ 127281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_dereference *sampler; 127381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 127481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** Texture coordinate to sample */ 127581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *coordinate; 127681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 127781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 127881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Value used for projective divide. 127981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 128081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no projective divide (the common case), this will be 128181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c NULL. Optimization passes should check for this to point to a constant 128281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * of 1.0 and replace that with \c NULL. 128381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 128481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *projector; 128581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 128681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick /** 128781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * Coordinate used for comparison on shadow look-ups. 128881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * 128981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * If there is no shadow comparison, this will be \c NULL. For the 129081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick * \c ir_txf opcode, this *must* be \c NULL. 129181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick */ 129281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *shadow_comparitor; 129381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1294c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke /** Texel offset. */ 1295c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke ir_rvalue *offset; 129681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 129781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick union { 129881377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *lod; /**< Floating point LOD */ 129981377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *bias; /**< Floating point LOD bias */ 130081377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick struct { 130181377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */ 130281377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */ 130381377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } grad; 130481377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick } lod_info; 130581377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick}; 130681377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 130781377c012cf5db3efe2e39885846c60b6e5c6eb8Ian Romanick 1308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstruct ir_swizzle_mask { 1309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned x:2; 1310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned y:2; 1311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned z:2; 1312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned w:2; 1313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Number of components in the swizzle. 1316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1317f25a5ad93961c335b56d4f0508cc5c00b77ee519Kenneth Graunke unsigned num_components:3; 1318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 1320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Does the swizzle contain duplicate components? 1321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * L-value swizzles cannot contain duplicate components. 1323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick unsigned has_duplicates:1; 1325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1327affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1328affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkeclass ir_swizzle : public ir_rvalue { 1329affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkepublic: 1330affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w, 1331affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke unsigned count); 13326315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 13336315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count); 13346315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 133505a4e59c2410292f595cfe0cc552a86ae69b20d2Eric Anholt ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask); 1336cad9766118d269725ef33b4e9588d674d5225010Eric Anholt 13378273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const; 13384b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1339fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1340fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 13417d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt virtual ir_swizzle *as_swizzle() 13427d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt { 13437d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt return this; 13447d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt } 13457d21104a8b92c139051e9a224c5d863802a8ade6Eric Anholt 1346affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke /** 1347affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke * Construct an ir_swizzle from the textual representation. Can fail. 1348affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke */ 1349affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length); 1350affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1351affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke virtual void accept(ir_visitor *v) 1352affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1353affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke v->visit(this); 1354affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1355affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 13568895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 13578895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1358a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry bool is_lvalue() const 1359affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke { 1360a9fafc6504ebccdc0fee3d2529c3fe6068cc86b8Eric Anholt return val->is_lvalue() && !mask.has_duplicates; 1361affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke } 1362affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 13632b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 13642b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 13652b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1366a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const; 13672b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick 1368affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_rvalue *val; 1369affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke ir_swizzle_mask mask; 13706315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick 13716315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanickprivate: 13726315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick /** 13736315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * Initialize the mask component of a swizzle 13746315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * 13756315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick * This is used by the \c ir_swizzle constructors. 13766315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick */ 13776315b68f5fbe529bce3497b67c42af1eaa62b8c1Ian Romanick void init_mask(const unsigned *components, unsigned count); 1378affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}; 1379affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1380affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke 1381fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_dereference : public ir_rvalue { 1382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 13838273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; 1384ca088cc277ce9f986693c857f3961dc0e1a4d91cIan Romanick 138544e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke virtual ir_dereference *as_dereference() 138644e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke { 138744e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke return this; 138844e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke } 138944e1dfa2df4de3e2de963f0505cdadade6fe8180Kenneth Graunke 1390a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry bool is_lvalue() const; 1391fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke 13922b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick /** 13932b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick * Get the variable that is ultimately referenced by an r-value 13942b3c476fa08e33a0ee1633b173a7df31ecaca582Ian Romanick */ 1395a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const = 0; 139670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 139770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 139870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 139970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_variable : public ir_dereference { 140070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 140170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_variable(ir_variable *var); 140270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 14038273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_variable *clone(void *mem_ctx, 14048273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 14054b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1406fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1407fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1408d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt virtual ir_dereference_variable *as_dereference_variable() 1409d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt { 1410d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt return this; 1411d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt } 1412d4f7e660dd81e05b0829c1b70663b3959fd78f47Eric Anholt 141370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 141470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 141570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1416a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 141770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 141836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->var; 141970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1420f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1421b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick virtual ir_variable *whole_variable_referenced() 1422b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick { 1423b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick /* ir_dereference_variable objects always dereference the entire 1424b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * variable. However, if this dereference is dereferenced by anything 1425b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * else, the complete deferefernce chain is not a whole-variable 1426b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * dereference. This method should only be called on the top most 1427b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick * ir_rvalue in a dereference chain. 1428b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick */ 1429b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick return this->var; 1430b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick } 1431b067db2e253059e83249b1e4d5f3c626b0e33807Ian Romanick 1432c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1433c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1434c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1435c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1436c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1437f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 143836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 143936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick /** 144036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick * Object being dereferenced. 144136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick */ 144236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_variable *var; 144370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 144470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 144570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 144670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_array : public ir_dereference { 144770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 144870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index); 144970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 145070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_array(ir_variable *var, ir_rvalue *array_index); 145170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 14528273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_array *clone(void *mem_ctx, 14538273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 14544b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1455fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1456fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 1457b145e903694fa932ab1e0d955e889555193ab604Eric Anholt virtual ir_dereference_array *as_dereference_array() 1458b145e903694fa932ab1e0d955e889555193ab604Eric Anholt { 1459b145e903694fa932ab1e0d955e889555193ab604Eric Anholt return this; 1460b145e903694fa932ab1e0d955e889555193ab604Eric Anholt } 1461b145e903694fa932ab1e0d955e889555193ab604Eric Anholt 146270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 146370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 146470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1465a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 146670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 146736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->array->variable_referenced(); 146870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 146970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 1470c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1471c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1472c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1473c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1474c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1475f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 147670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 147736ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array; 147836ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *array_index; 147936ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 148070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickprivate: 148170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick void set_array(ir_rvalue *value); 148270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick}; 148370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 148470fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 148570fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickclass ir_dereference_record : public ir_dereference { 148670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanickpublic: 148770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_rvalue *value, const char *field); 148870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 148970fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick ir_dereference_record(ir_variable *var, const char *field); 149070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick 14918273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_dereference_record *clone(void *mem_ctx, 14928273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt struct hash_table *) const; 14934b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1494fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1495fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 149670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick /** 149770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick * Get the variable that is ultimately referenced by an r-value 149870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick */ 1499a52b53b56e2b5d5853345d8bcd2a4ff50e495c20Paul Berry virtual ir_variable *variable_referenced() const 150070fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick { 150136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick return this->record->variable_referenced(); 150270fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick } 1503f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick 1504c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick virtual void accept(ir_visitor *v) 1505c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick { 1506c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick v->visit(this); 1507c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick } 1508c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1509f3a002b503542fe2544025c6a42d552fdc4907c2Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 151036ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick 151136ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick ir_rvalue *record; 151236ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick const char *field; 1513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1516be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick/** 1517be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick * Data stored in an ir_constant 1518be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick */ 1519be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanickunion ir_constant_data { 1520be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick unsigned u[16]; 1521be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick int i[16]; 1522be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick float f[16]; 1523be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick bool b[16]; 1524be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick}; 1525be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1526be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick 1527fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeclass ir_constant : public ir_rvalue { 1528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickpublic: 1529824b659d917a5f14a1f66b891d25036ef9f9adc6Ian Romanick ir_constant(const struct glsl_type *type, const ir_constant_data *data); 15303c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(bool b); 15313c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(unsigned int u); 15323c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(int i); 15333c36b2df7c854d23b2be9580e416fb04079a1befEric Anholt ir_constant(float f); 1534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1535989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick /** 1536756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick * Construct an ir_constant from a list of ir_constant values 1537756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick */ 1538756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick ir_constant(const struct glsl_type *type, exec_list *values); 1539756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick 1540756a3fac4fbbc6b3785715db745f8d58a14baeb9Ian Romanick /** 1541989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * Construct an ir_constant from a scalar component of another ir_constant 1542989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1543989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * The new \c ir_constant inherits the type of the component from the 1544989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * source constant. 1545989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * 1546989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * \note 1547989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * In the case of a matrix constant, the new constant is a scalar, \b not 1548989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick * a vector. 1549989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick */ 1550989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick ir_constant(const ir_constant *c, unsigned i); 1551989cfc432ee7adef701a87783e0c6b064c1cfaeeIan Romanick 1552ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke /** 1553ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke * Return a new ir_constant of the specified type containing all zeros. 1554ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke */ 1555ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke static ir_constant *zero(void *mem_ctx, const glsl_type *type); 1556ee9a3a51b61f0afe75b4b8b0c3025310140437ecKenneth Graunke 15578273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const; 15584b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt 1559fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke virtual ir_constant *constant_expression_value(); 1560fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke 15615c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt virtual ir_constant *as_constant() 15625c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt { 15635c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt return this; 15645c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt } 15655c89f0ecb9581cbe83442ab3f41f2f3701fffab0Eric Anholt 156678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick virtual void accept(ir_visitor *v) 156778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick { 156878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick v->visit(this); 156978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick } 157078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick 15718895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick virtual ir_visitor_status accept(ir_hierarchical_visitor *); 15728895bae55ba8d9f62dd59cbd924ac37c8a7dcdb1Ian Romanick 1573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /** 157431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * Get a particular component of a constant as a specific type 157531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * 157631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * This is useful, for example, to get a value from an integer constant 157731881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * as a float or bool. This appears frequently when constructors are 157831881908ebc11d84c2ff1821410c91340686aa17Ian Romanick * called with all constant parameters. 157931881908ebc11d84c2ff1821410c91340686aa17Ian Romanick */ 158031881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@{*/ 158131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick bool get_bool_component(unsigned i) const; 158231881908ebc11d84c2ff1821410c91340686aa17Ian Romanick float get_float_component(unsigned i) const; 158331881908ebc11d84c2ff1821410c91340686aa17Ian Romanick int get_int_component(unsigned i) const; 158431881908ebc11d84c2ff1821410c91340686aa17Ian Romanick unsigned get_uint_component(unsigned i) const; 158531881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /*@}*/ 158631881908ebc11d84c2ff1821410c91340686aa17Ian Romanick 158774e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant *get_array_element(unsigned i) const; 158874e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 1589b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick ir_constant *get_record_field(const char *name); 1590b94c29a47b5020e4d052679fc5d22c19533fd73bIan Romanick 159131881908ebc11d84c2ff1821410c91340686aa17Ian Romanick /** 15921e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick * Determine whether a constant has the same value as another constant 159338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick * 15948e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * \sa ir_constant::is_zero, ir_constant::is_one, 15958e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick * ir_constant::is_negative_one 15961e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick */ 15971e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick bool has_value(const ir_constant *) const; 15981e8b7a714e8acbb5028a250048452f2efc29d02eIan Romanick 1599ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_zero() const; 1600ad87f2ddc7e6b95e3dd5bbe4d2b19703d305c74eIan Romanick virtual bool is_one() const; 16018e498050dc1a1285c2218fdf4ea506c1cdcd9dd8Ian Romanick virtual bool is_negative_one() const; 160238e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick 160338e55153af031e48125b1cd0a5d939bb92379ddcIan Romanick /** 1604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Value of the constant. 1605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * 1606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The field used to back the values supplied by the constant is determined 1607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * by the type associated with the \c ir_instruction. Constants may be 1608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * scalars, vectors, or matrices. 1609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */ 1610be1d2bfdeab5781b6546b704b566aa214e79da06Ian Romanick union ir_constant_data value; 16117f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick 161274e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Array elements */ 161374e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke ir_constant **array_elements; 161474e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke 161574e1802f5dd8921750851abc6128e4073602d405Kenneth Graunke /* Structure fields */ 16167f1ab834d7aa901ce0e12f40db23d7d9891eae59Ian Romanick exec_list components; 1617710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick 1618710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanickprivate: 1619710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick /** 1620710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick * Parameterless constructor only used by the clone method 1621710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick */ 1622710919fd7cb7ac6cb640afa362f5c409e5a5ec91Ian Romanick ir_constant(void); 1623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}; 1624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 1625e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/*@}*/ 1626e053d62aa573651abdd78666d299272c8219a3aaIan Romanick 1627e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1628e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Apply a visitor to each IR node in a list 1629e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 163070b74928a220aff024664714877defb0caedf33fEric Anholtvoid 163170b74928a220aff024664714877defb0caedf33fEric Anholtvisit_exec_list(exec_list *list, ir_visitor *visitor); 1632adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick 1633e053d62aa573651abdd78666d299272c8219a3aaIan Romanick/** 1634e053d62aa573651abdd78666d299272c8219a3aaIan Romanick * Validate invariants on each IR node in a list 1635e053d62aa573651abdd78666d299272c8219a3aaIan Romanick */ 163653cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholtvoid validate_ir_tree(exec_list *instructions); 163753cdb7e51d85d4b4a35fba3ec200b27991b8488bEric Anholt 163802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct _mesa_glsl_parse_state; 163902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickstruct gl_shader_program; 164002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 164102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/** 164202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether an unlinked shader contains static recursion 164302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * 164402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion, 164502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c _mesa_glsl_error will be called to emit error messages for each function 164602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle. 164702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */ 164802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid 164902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_unlinked(struct _mesa_glsl_parse_state *state, 165002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick exec_list *instructions); 165102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 165202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick/** 165302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * Detect whether a linked shader contains static recursion 165402c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * 165502c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * If the list of instructions is determined to contain static recursion, 165602c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c link_error_printf will be called to emit error messages for each function 165702c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * that is in the recursion cycle. In addition, 165802c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick * \c gl_shader_program::LinkStatus will be set to false. 165902c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick */ 166002c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickvoid 166102c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanickdetect_recursion_linked(struct gl_shader_program *prog, 166202c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick exec_list *instructions); 166302c5ae1b3fef75d5c0a715313a69e6b95ebd5b95Ian Romanick 1664f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick/** 1665f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * Make a clone of each IR instruction in a list 1666f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * 1667f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param in List of IR instructions that are to be cloned 1668f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick * \param out List to hold the cloned instructions 1669f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick */ 1670f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanickvoid 16718273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholtclone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in); 1672f3235eb37f264244f4ea432700be7dd6b2930d6cIan Romanick 1673adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanickextern void 1674adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick_mesa_glsl_initialize_variables(exec_list *instructions, 1675adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick struct _mesa_glsl_parse_state *state); 1676e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick 1677c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholtextern void 167881168351a7f493fcde55e621af046c9301aa93e9Kenneth Graunke_mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state); 1679c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt 168060e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickextern void 1681d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick_mesa_glsl_release_functions(void); 1682d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanick 1683d5be2acae379783c4aa31243e0a88a9e67e6ca7eIan Romanickextern void 168460e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanickreparent_ir(exec_list *list, void *mem_ctx); 168560e2d06d1ccc66ad00cd7ab81c418853f21be291Ian Romanick 16861cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonsecastruct glsl_symbol_table; 16874ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 16884ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickextern void 16894ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanickimport_prototypes(const exec_list *source, exec_list *dest, 16901cbcf6693aa490c4dcb56712bfb9998deb270f08José Fonseca struct glsl_symbol_table *symbols, void *mem_ctx); 16914ccd3c548b9b9a2fee79342445f68d73525bfcdbIan Romanick 16929f82806c7b5109553cf806a5652e6b6198665094Eric Anholtextern bool 16939f82806c7b5109553cf806a5652e6b6198665094Eric Anholtir_has_call(ir_instruction *ir); 16949f82806c7b5109553cf806a5652e6b6198665094Eric Anholt 1695925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtextern void 1696925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholtdo_set_program_inouts(exec_list *instructions, struct gl_program *prog); 1697925b49ff310bf0b307add7c34627cddf87e6a554Eric Anholt 16981ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickextern char * 16991ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanickprototype_string(const glsl_type *return_type, const char *name, 17001ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick exec_list *parameters); 17011ad3ba4ad954b86751bd5b6ad0a431920bff9958Ian Romanick 1702e309a6051d1a04ee581f0a47c6c585918fba1096Ian Romanick#endif /* IR_H */ 1703