// // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2012-2016 LunarG, Inc. // Copyright (C) 2017, 2022-2024 Arm Limited. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // // Neither the name of 3Dlabs Inc. Ltd. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // // Definition of the in-memory high-level intermediate representation // of shaders. This is a tree that parser creates. // // Nodes in the tree are defined as a hierarchy of classes derived from // TIntermNode. Each is a node in a tree. There is no preset branching factor; // each node can have it's own type of list of children. // #ifndef __INTERMEDIATE_H #define __INTERMEDIATE_H #include "Common.h" #include "Types.h" #include "ConstantUnion.h" namespace glslang { class TIntermediate; // // Operators used by the high-level (parse tree) representation. // enum TOperator { … }; enum TLinkType { … }; class TIntermTraverser; class TIntermOperator; class TIntermAggregate; class TIntermUnary; class TIntermBinary; class TIntermConstantUnion; class TIntermSelection; class TIntermSwitch; class TIntermBranch; class TIntermTyped; class TIntermMethod; class TIntermSymbol; class TIntermLoop; } // end namespace glslang // // Base class for the tree nodes // // (Put outside the glslang namespace, as it's used as part of the external interface.) // class TIntermNode { … }; namespace glslang { // // This is just to help yacc. // struct TIntermNodePair { … }; // // Intermediate class for nodes that have a type. // class TIntermTyped : public TIntermNode { … }; // // Handle for, do-while, and while loops. // class TIntermLoop : public TIntermNode { … }; // // Handle case, break, continue, return, and kill. // class TIntermBranch : public TIntermNode { … }; // // Represent method names before seeing their calling signature // or resolving them to operations. Just an expression as the base object // and a textural name. // class TIntermMethod : public TIntermTyped { … }; // // Nodes that correspond to symbols or constants in the source code. // class TIntermSymbol : public TIntermTyped { … }; class TIntermConstantUnion : public TIntermTyped { … }; // Represent the independent aspects of a texturing TOperator struct TCrackedTextureOp { … }; // // Intermediate class for node types that hold operators. // class TIntermOperator : public TIntermTyped { … }; // // Nodes for all the basic binary math operators. // class TIntermBinary : public TIntermOperator { … }; // // Nodes for unary math operators. // class TIntermUnary : public TIntermOperator { … }; TIntermSequence; TQualifierList; // // Nodes that operate on an arbitrary sized set of children. // class TIntermAggregate : public TIntermOperator { … }; // // For if tests. // class TIntermSelection : public TIntermTyped { … }; // // For switch statements. Designed use is that a switch will have sequence of nodes // that are either case/default nodes or a *single* node that represents all the code // in between (if any) consecutive case/defaults. So, a traversal need only deal with // 0 or 1 nodes per case/default statement. // class TIntermSwitch : public TIntermNode { … }; enum TVisit { … }; // // For traversing the tree. User should derive from this, // put their traversal specific data in it, and then pass // it to a Traverse method. // // When using this, just fill in the methods for nodes you want visited. // Return false from a pre-visit to skip visiting that node's subtree. // // Explicitly set postVisit to true if you want post visiting, otherwise, // filled in methods will only be called at pre-visit time (before processing // the subtree). Similarly for inVisit for in-order visiting of nodes with // multiple children. // // If you only want post-visits, explicitly turn off preVisit (and inVisit) // and turn on postVisit. // // In general, for the visit*() methods, return true from interior nodes // to have the traversal continue on to children. // // If you process children yourself, or don't want them processed, return false. // class TIntermTraverser { … }; // KHR_vulkan_glsl says "Two arrays sized with specialization constants are the same type only if // sized with the same symbol, involving no operations" inline bool SameSpecializationConstants(TIntermTyped* node1, TIntermTyped* node2) { … } } // end namespace glslang #endif // __INTERMEDIATE_H