1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_TRANSLATOR_ASNODE_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_TRANSLATOR_ASNODE_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/IntermNode.h" 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <utility> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace sh 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace priv 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker template <typename T> 22*8975f5c5SAndroid Build Coastguard Worker struct AsNode 23*8975f5c5SAndroid Build Coastguard Worker {}; 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker template <> 26*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermNode> 27*8975f5c5SAndroid Build Coastguard Worker { 28*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermNode *exec(TIntermNode *node) { return node; } 29*8975f5c5SAndroid Build Coastguard Worker }; 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker template <> 32*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermTyped> 33*8975f5c5SAndroid Build Coastguard Worker { 34*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermTyped *exec(TIntermNode *node) 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsTyped() : nullptr; 37*8975f5c5SAndroid Build Coastguard Worker } 38*8975f5c5SAndroid Build Coastguard Worker }; 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker template <> 41*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermSymbol> 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermSymbol *exec(TIntermNode *node) 44*8975f5c5SAndroid Build Coastguard Worker { 45*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsSymbolNode() : nullptr; 46*8975f5c5SAndroid Build Coastguard Worker } 47*8975f5c5SAndroid Build Coastguard Worker }; 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker template <> 50*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermConstantUnion> 51*8975f5c5SAndroid Build Coastguard Worker { 52*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermConstantUnion *exec(TIntermNode *node) 53*8975f5c5SAndroid Build Coastguard Worker { 54*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsConstantUnion() : nullptr; 55*8975f5c5SAndroid Build Coastguard Worker } 56*8975f5c5SAndroid Build Coastguard Worker }; 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker template <> 59*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermFunctionPrototype> 60*8975f5c5SAndroid Build Coastguard Worker { 61*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermFunctionPrototype *exec(TIntermNode *node) 62*8975f5c5SAndroid Build Coastguard Worker { 63*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsFunctionPrototypeNode() : nullptr; 64*8975f5c5SAndroid Build Coastguard Worker } 65*8975f5c5SAndroid Build Coastguard Worker }; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker template <> 68*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermPreprocessorDirective> 69*8975f5c5SAndroid Build Coastguard Worker { 70*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermPreprocessorDirective *exec(TIntermNode *node) 71*8975f5c5SAndroid Build Coastguard Worker { 72*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsPreprocessorDirective() : nullptr; 73*8975f5c5SAndroid Build Coastguard Worker } 74*8975f5c5SAndroid Build Coastguard Worker }; 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker template <> 77*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermSwizzle> 78*8975f5c5SAndroid Build Coastguard Worker { 79*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermSwizzle *exec(TIntermNode *node) 80*8975f5c5SAndroid Build Coastguard Worker { 81*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsSwizzleNode() : nullptr; 82*8975f5c5SAndroid Build Coastguard Worker } 83*8975f5c5SAndroid Build Coastguard Worker }; 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker template <> 86*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermBinary> 87*8975f5c5SAndroid Build Coastguard Worker { 88*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermBinary *exec(TIntermNode *node) 89*8975f5c5SAndroid Build Coastguard Worker { 90*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsBinaryNode() : nullptr; 91*8975f5c5SAndroid Build Coastguard Worker } 92*8975f5c5SAndroid Build Coastguard Worker }; 93*8975f5c5SAndroid Build Coastguard Worker 94*8975f5c5SAndroid Build Coastguard Worker template <> 95*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermUnary> 96*8975f5c5SAndroid Build Coastguard Worker { 97*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermUnary *exec(TIntermNode *node) 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsUnaryNode() : nullptr; 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker }; 102*8975f5c5SAndroid Build Coastguard Worker 103*8975f5c5SAndroid Build Coastguard Worker template <> 104*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermTernary> 105*8975f5c5SAndroid Build Coastguard Worker { 106*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermTernary *exec(TIntermNode *node) 107*8975f5c5SAndroid Build Coastguard Worker { 108*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsTernaryNode() : nullptr; 109*8975f5c5SAndroid Build Coastguard Worker } 110*8975f5c5SAndroid Build Coastguard Worker }; 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker template <> 113*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermIfElse> 114*8975f5c5SAndroid Build Coastguard Worker { 115*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermIfElse *exec(TIntermNode *node) 116*8975f5c5SAndroid Build Coastguard Worker { 117*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsIfElseNode() : nullptr; 118*8975f5c5SAndroid Build Coastguard Worker } 119*8975f5c5SAndroid Build Coastguard Worker }; 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard Worker template <> 122*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermSwitch> 123*8975f5c5SAndroid Build Coastguard Worker { 124*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermSwitch *exec(TIntermNode *node) 125*8975f5c5SAndroid Build Coastguard Worker { 126*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsSwitchNode() : nullptr; 127*8975f5c5SAndroid Build Coastguard Worker } 128*8975f5c5SAndroid Build Coastguard Worker }; 129*8975f5c5SAndroid Build Coastguard Worker 130*8975f5c5SAndroid Build Coastguard Worker template <> 131*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermCase> 132*8975f5c5SAndroid Build Coastguard Worker { 133*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermCase *exec(TIntermNode *node) 134*8975f5c5SAndroid Build Coastguard Worker { 135*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsCaseNode() : nullptr; 136*8975f5c5SAndroid Build Coastguard Worker } 137*8975f5c5SAndroid Build Coastguard Worker }; 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker template <> 140*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermFunctionDefinition> 141*8975f5c5SAndroid Build Coastguard Worker { 142*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermFunctionDefinition *exec(TIntermNode *node) 143*8975f5c5SAndroid Build Coastguard Worker { 144*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsFunctionDefinition() : nullptr; 145*8975f5c5SAndroid Build Coastguard Worker } 146*8975f5c5SAndroid Build Coastguard Worker }; 147*8975f5c5SAndroid Build Coastguard Worker 148*8975f5c5SAndroid Build Coastguard Worker template <> 149*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermAggregate> 150*8975f5c5SAndroid Build Coastguard Worker { 151*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermAggregate *exec(TIntermNode *node) 152*8975f5c5SAndroid Build Coastguard Worker { 153*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsAggregate() : nullptr; 154*8975f5c5SAndroid Build Coastguard Worker } 155*8975f5c5SAndroid Build Coastguard Worker }; 156*8975f5c5SAndroid Build Coastguard Worker 157*8975f5c5SAndroid Build Coastguard Worker template <> 158*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermBlock> 159*8975f5c5SAndroid Build Coastguard Worker { 160*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermBlock *exec(TIntermNode *node) 161*8975f5c5SAndroid Build Coastguard Worker { 162*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsBlock() : nullptr; 163*8975f5c5SAndroid Build Coastguard Worker } 164*8975f5c5SAndroid Build Coastguard Worker }; 165*8975f5c5SAndroid Build Coastguard Worker 166*8975f5c5SAndroid Build Coastguard Worker template <> 167*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermGlobalQualifierDeclaration> 168*8975f5c5SAndroid Build Coastguard Worker { 169*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermGlobalQualifierDeclaration *exec(TIntermNode *node) 170*8975f5c5SAndroid Build Coastguard Worker { 171*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsGlobalQualifierDeclarationNode() : nullptr; 172*8975f5c5SAndroid Build Coastguard Worker } 173*8975f5c5SAndroid Build Coastguard Worker }; 174*8975f5c5SAndroid Build Coastguard Worker 175*8975f5c5SAndroid Build Coastguard Worker template <> 176*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermDeclaration> 177*8975f5c5SAndroid Build Coastguard Worker { 178*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermDeclaration *exec(TIntermNode *node) 179*8975f5c5SAndroid Build Coastguard Worker { 180*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsDeclarationNode() : nullptr; 181*8975f5c5SAndroid Build Coastguard Worker } 182*8975f5c5SAndroid Build Coastguard Worker }; 183*8975f5c5SAndroid Build Coastguard Worker 184*8975f5c5SAndroid Build Coastguard Worker template <> 185*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermLoop> 186*8975f5c5SAndroid Build Coastguard Worker { 187*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermLoop *exec(TIntermNode *node) 188*8975f5c5SAndroid Build Coastguard Worker { 189*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsLoopNode() : nullptr; 190*8975f5c5SAndroid Build Coastguard Worker } 191*8975f5c5SAndroid Build Coastguard Worker }; 192*8975f5c5SAndroid Build Coastguard Worker 193*8975f5c5SAndroid Build Coastguard Worker template <> 194*8975f5c5SAndroid Build Coastguard Worker struct AsNode<TIntermBranch> 195*8975f5c5SAndroid Build Coastguard Worker { 196*8975f5c5SAndroid Build Coastguard Worker static ANGLE_INLINE TIntermBranch *exec(TIntermNode *node) 197*8975f5c5SAndroid Build Coastguard Worker { 198*8975f5c5SAndroid Build Coastguard Worker return node ? node->getAsBranchNode() : nullptr; 199*8975f5c5SAndroid Build Coastguard Worker } 200*8975f5c5SAndroid Build Coastguard Worker }; 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker } // namespace priv 203*8975f5c5SAndroid Build Coastguard Worker 204*8975f5c5SAndroid Build Coastguard Worker template <typename T> 205*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE T *asNode(TIntermNode *node) 206*8975f5c5SAndroid Build Coastguard Worker { 207*8975f5c5SAndroid Build Coastguard Worker return priv::AsNode<T>::exec(node); 208*8975f5c5SAndroid Build Coastguard Worker } 209*8975f5c5SAndroid Build Coastguard Worker 210*8975f5c5SAndroid Build Coastguard Worker } // namespace sh 211*8975f5c5SAndroid Build Coastguard Worker 212*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_TRANSLATOR_ASNODE_H_ 213