1 // 2 // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 #ifndef COMPILER_TRANSLATOR_OPERATOR_H_ 8 #define COMPILER_TRANSLATOR_OPERATOR_H_ 9 10 // 11 // Operators used by the high-level (parse tree) representation. 12 // 13 enum TOperator 14 { 15 EOpNull, // if in a node, should only mean a node is still being built 16 17 // Call a function defined in the AST. This might be a user-defined function or a function 18 // inserted by an AST transformation. 19 EOpCallFunctionInAST, 20 21 // Call an internal helper function with a raw implementation - the implementation can't be 22 // subject to AST transformations. Raw functions have a few constraints to keep them compatible 23 // with AST traversers: 24 // * They should not return arrays. 25 // * They should not have out parameters. 26 EOpCallInternalRawFunction, 27 28 // Call a built-in function like a texture or image function. 29 EOpCallBuiltInFunction, 30 31 // 32 // Unary operators 33 // 34 35 EOpNegative, 36 EOpPositive, 37 EOpLogicalNot, 38 EOpBitwiseNot, 39 40 EOpPostIncrement, 41 EOpPostDecrement, 42 EOpPreIncrement, 43 EOpPreDecrement, 44 45 EOpArrayLength, 46 47 // 48 // binary operations (ones with special GLSL syntax are used in TIntermBinary nodes, others in 49 // TIntermAggregate nodes) 50 // 51 52 EOpAdd, 53 EOpSub, 54 EOpMul, 55 EOpDiv, 56 EOpIMod, 57 58 EOpEqual, 59 EOpNotEqual, 60 EOpLessThan, 61 EOpGreaterThan, 62 EOpLessThanEqual, 63 EOpGreaterThanEqual, 64 65 EOpEqualComponentWise, 66 EOpNotEqualComponentWise, 67 EOpLessThanComponentWise, 68 EOpLessThanEqualComponentWise, 69 EOpGreaterThanComponentWise, 70 EOpGreaterThanEqualComponentWise, 71 72 EOpComma, 73 74 EOpVectorTimesScalar, 75 EOpVectorTimesMatrix, 76 EOpMatrixTimesVector, 77 EOpMatrixTimesScalar, 78 EOpMatrixTimesMatrix, 79 80 EOpLogicalOr, 81 EOpLogicalXor, 82 EOpLogicalAnd, 83 84 EOpBitShiftLeft, 85 EOpBitShiftRight, 86 87 EOpBitwiseAnd, 88 EOpBitwiseXor, 89 EOpBitwiseOr, 90 91 EOpIndexDirect, 92 EOpIndexIndirect, 93 EOpIndexDirectStruct, 94 EOpIndexDirectInterfaceBlock, 95 96 // 97 // Built-in functions mapped to operators (either unary or with multiple parameters) 98 // 99 100 EOpRadians, 101 EOpDegrees, 102 EOpSin, 103 EOpCos, 104 EOpTan, 105 EOpAsin, 106 EOpAcos, 107 EOpAtan, 108 109 EOpSinh, 110 EOpCosh, 111 EOpTanh, 112 EOpAsinh, 113 EOpAcosh, 114 EOpAtanh, 115 116 EOpPow, 117 EOpExp, 118 EOpLog, 119 EOpExp2, 120 EOpLog2, 121 EOpSqrt, 122 EOpInversesqrt, 123 124 EOpAbs, 125 EOpSign, 126 EOpFloor, 127 EOpTrunc, 128 EOpRound, 129 EOpRoundEven, 130 EOpCeil, 131 EOpFract, 132 EOpMod, 133 EOpModf, 134 EOpMin, 135 EOpMax, 136 EOpClamp, 137 EOpMix, 138 EOpStep, 139 EOpSmoothstep, 140 EOpIsnan, 141 EOpIsinf, 142 EOpFma, 143 144 EOpFloatBitsToInt, 145 EOpFloatBitsToUint, 146 EOpIntBitsToFloat, 147 EOpUintBitsToFloat, 148 149 EOpFrexp, 150 EOpLdexp, 151 152 EOpPackSnorm2x16, 153 EOpPackUnorm2x16, 154 EOpPackHalf2x16, 155 EOpUnpackSnorm2x16, 156 EOpUnpackUnorm2x16, 157 EOpUnpackHalf2x16, 158 159 EOpPackUnorm4x8, 160 EOpPackSnorm4x8, 161 EOpUnpackUnorm4x8, 162 EOpUnpackSnorm4x8, 163 164 EOpLength, 165 EOpDistance, 166 EOpDot, 167 EOpCross, 168 EOpNormalize, 169 EOpFaceforward, 170 EOpReflect, 171 EOpRefract, 172 173 EOpDFdx, // Fragment only, OES_standard_derivatives extension 174 EOpDFdy, // Fragment only, OES_standard_derivatives extension 175 EOpFwidth, // Fragment only, OES_standard_derivatives extension 176 177 EOpMulMatrixComponentWise, 178 EOpOuterProduct, 179 EOpTranspose, 180 EOpDeterminant, 181 EOpInverse, 182 183 EOpAny, 184 EOpAll, 185 EOpLogicalNotComponentWise, 186 187 EOpBitfieldExtract, 188 EOpBitfieldInsert, 189 EOpBitfieldReverse, 190 EOpBitCount, 191 EOpFindLSB, 192 EOpFindMSB, 193 EOpUaddCarry, 194 EOpUsubBorrow, 195 EOpUmulExtended, 196 EOpImulExtended, 197 198 // 199 // Branch 200 // 201 202 EOpKill, // Fragment only 203 EOpReturn, 204 EOpBreak, 205 EOpContinue, 206 207 // 208 // Constructor 209 // 210 211 EOpConstruct, 212 213 // 214 // moves 215 // 216 217 EOpAssign, 218 EOpInitialize, 219 EOpAddAssign, 220 EOpSubAssign, 221 222 EOpMulAssign, 223 EOpVectorTimesMatrixAssign, 224 EOpVectorTimesScalarAssign, 225 EOpMatrixTimesScalarAssign, 226 EOpMatrixTimesMatrixAssign, 227 228 EOpDivAssign, 229 EOpIModAssign, 230 EOpBitShiftLeftAssign, 231 EOpBitShiftRightAssign, 232 EOpBitwiseAndAssign, 233 EOpBitwiseXorAssign, 234 EOpBitwiseOrAssign, 235 236 // barriers 237 EOpBarrier, 238 EOpMemoryBarrier, 239 EOpMemoryBarrierAtomicCounter, 240 EOpMemoryBarrierBuffer, 241 EOpMemoryBarrierImage, 242 EOpMemoryBarrierShared, 243 EOpGroupMemoryBarrier, 244 245 // Atomic functions 246 EOpAtomicAdd, 247 EOpAtomicMin, 248 EOpAtomicMax, 249 EOpAtomicAnd, 250 EOpAtomicOr, 251 EOpAtomicXor, 252 EOpAtomicExchange, 253 EOpAtomicCompSwap, 254 255 // Geometry only 256 EOpEmitVertex, 257 EOpEndPrimitive, 258 259 // Desktop GLSL functions 260 EOpFTransform, 261 EOpPackDouble2x32, 262 EOpUnpackDouble2x32, 263 }; 264 265 // Returns the string corresponding to the operator in GLSL 266 const char *GetOperatorString(TOperator op); 267 268 // Say whether or not a binary or unary operation changes the value of a variable. 269 bool IsAssignment(TOperator op); 270 271 // Say whether or not an operator represents an atomic function. 272 bool IsAtomicFunction(TOperator op); 273 274 #endif // COMPILER_TRANSLATOR_OPERATOR_H_ 275