Edit

kc3-lang/angle/src/compiler/translator/Operator.cpp

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2017-01-02 17:34:40
    Hash : d68924e5
    Message : Use GetOperatorString when writing GLSL unary built-in calls GetOperatorString is now used when writing GLSL for built-in calls that fall under TIntermUnary. Component-wise not TOperator enum is renamed for consistency. This also cleans up some unnecessary creation of string objects when writing built-in functions. BUG=angleproject:1682 TEST=angle_unittests, angle_end2end_tests, WebGL conformance tests Change-Id: I89b2ef222bf5af479d4977417f320789b58ace85 Reviewed-on: https://chromium-review.googlesource.com/424552 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/Operator.cpp
  • //
    // Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    #include "compiler/translator/Operator.h"
    
    const char *GetOperatorString(TOperator op)
    {
        switch (op)
        {
            // Note: ops from EOpNull to EOpPrototype can't be handled here.
    
            case EOpNegative:
                return "-";
            case EOpPositive:
                return "+";
            case EOpLogicalNot:
                return "!";
            case EOpBitwiseNot:
                return "~";
    
            case EOpPostIncrement:
                return "++";
            case EOpPostDecrement:
                return "--";
            case EOpPreIncrement:
                return "++";
            case EOpPreDecrement:
                return "--";
    
            case EOpAdd:
                return "+";
            case EOpSub:
                return "-";
            case EOpMul:
                return "*";
            case EOpDiv:
                return "/";
            case EOpIMod:
                return "%";
    
            case EOpEqual:
                return "==";
            case EOpNotEqual:
                return "!=";
            case EOpLessThan:
                return "<";
            case EOpGreaterThan:
                return ">";
            case EOpLessThanEqual:
                return "<=";
            case EOpGreaterThanEqual:
                return ">=";
    
            case EOpEqualComponentWise:
                return "equal";
            case EOpNotEqualComponentWise:
                return "notEqual";
            case EOpLessThanComponentWise:
                return "lessThan";
            case EOpGreaterThanComponentWise:
                return "greaterThan";
            case EOpLessThanEqualComponentWise:
                return "lessThanEqual";
            case EOpGreaterThanEqualComponentWise:
                return "greaterThanEqual";
    
            case EOpComma:
                return ",";
    
            // Fall-through.
            case EOpVectorTimesScalar:
            case EOpVectorTimesMatrix:
            case EOpMatrixTimesVector:
            case EOpMatrixTimesScalar:
            case EOpMatrixTimesMatrix:
                return "*";
    
            case EOpLogicalOr:
                return "||";
            case EOpLogicalXor:
                return "^^";
            case EOpLogicalAnd:
                return "&&";
    
            case EOpBitShiftLeft:
                return "<<";
            case EOpBitShiftRight:
                return ">>";
    
            case EOpBitwiseAnd:
                return "&";
            case EOpBitwiseXor:
                return "^";
            case EOpBitwiseOr:
                return "|";
    
            // Fall-through.
            case EOpIndexDirect:
            case EOpIndexIndirect:
                return "[]";
    
            case EOpIndexDirectStruct:
            case EOpIndexDirectInterfaceBlock:
                return ".";
    
            case EOpRadians:
                return "radians";
            case EOpDegrees:
                return "degrees";
            case EOpSin:
                return "sin";
            case EOpCos:
                return "cos";
            case EOpTan:
                return "tan";
            case EOpAsin:
                return "asin";
            case EOpAcos:
                return "acos";
            case EOpAtan:
                return "atan";
    
            case EOpSinh:
                return "sinh";
            case EOpCosh:
                return "cosh";
            case EOpTanh:
                return "tanh";
            case EOpAsinh:
                return "asinh";
            case EOpAcosh:
                return "acosh";
            case EOpAtanh:
                return "atanh";
    
            case EOpPow:
                return "pow";
            case EOpExp:
                return "exp";
            case EOpLog:
                return "log";
            case EOpExp2:
                return "exp2";
            case EOpLog2:
                return "log2";
            case EOpSqrt:
                return "sqrt";
            case EOpInverseSqrt:
                return "inversesqrt";
    
            case EOpAbs:
                return "abs";
            case EOpSign:
                return "sign";
            case EOpFloor:
                return "floor";
            case EOpTrunc:
                return "trunc";
            case EOpRound:
                return "round";
            case EOpRoundEven:
                return "roundEven";
            case EOpCeil:
                return "ceil";
            case EOpFract:
                return "fract";
            case EOpMod:
                return "mod";
            case EOpModf:
                return "modf";
            case EOpMin:
                return "min";
            case EOpMax:
                return "max";
            case EOpClamp:
                return "clamp";
            case EOpMix:
                return "mix";
            case EOpStep:
                return "step";
            case EOpSmoothStep:
                return "smoothstep";
            case EOpIsNan:
                return "isnan";
            case EOpIsInf:
                return "isinf";
    
            case EOpFloatBitsToInt:
                return "floatBitsToInt";
            case EOpFloatBitsToUint:
                return "floatBitsToUint";
            case EOpIntBitsToFloat:
                return "intBitsToFloat";
            case EOpUintBitsToFloat:
                return "uintBitsToFloat";
    
            case EOpPackSnorm2x16:
                return "packSnorm2x16";
            case EOpPackUnorm2x16:
                return "packUnorm2x16";
            case EOpPackHalf2x16:
                return "packHalf2x16";
            case EOpUnpackSnorm2x16:
                return "unpackSnorm2x16";
            case EOpUnpackUnorm2x16:
                return "unpackUnorm2x16";
            case EOpUnpackHalf2x16:
                return "unpackHalf2x16";
    
            case EOpLength:
                return "length";
            case EOpDistance:
                return "distance";
            case EOpDot:
                return "dot";
            case EOpCross:
                return "cross";
            case EOpNormalize:
                return "normalize";
            case EOpFaceForward:
                return "faceforward";
            case EOpReflect:
                return "reflect";
            case EOpRefract:
                return "refract";
    
            case EOpDFdx:
                return "dFdx";
            case EOpDFdy:
                return "dFdy";
            case EOpFwidth:
                return "fwidth";
    
            case EOpMulMatrixComponentWise:
                return "matrixCompMult";
            case EOpOuterProduct:
                return "outerProduct";
            case EOpTranspose:
                return "transpose";
            case EOpDeterminant:
                return "determinant";
            case EOpInverse:
                return "inverse";
    
            case EOpAny:
                return "any";
            case EOpAll:
                return "all";
            case EOpLogicalNotComponentWise:
                return "not";
    
            case EOpKill:
                return "kill";
            case EOpReturn:
                return "return";
            case EOpBreak:
                return "break";
            case EOpContinue:
                return "continue";
    
            case EOpConstructInt:
                return "int";
            case EOpConstructUInt:
                return "uint";
            case EOpConstructBool:
                return "bool";
            case EOpConstructFloat:
                return "float";
            case EOpConstructVec2:
                return "vec2";
            case EOpConstructVec3:
                return "vec3";
            case EOpConstructVec4:
                return "vec4";
            case EOpConstructBVec2:
                return "bvec2";
            case EOpConstructBVec3:
                return "bvec3";
            case EOpConstructBVec4:
                return "bvec4";
            case EOpConstructIVec2:
                return "ivec2";
            case EOpConstructIVec3:
                return "ivec3";
            case EOpConstructIVec4:
                return "ivec4";
            case EOpConstructUVec2:
                return "uvec2";
            case EOpConstructUVec3:
                return "uvec3";
            case EOpConstructUVec4:
                return "uvec4";
            case EOpConstructMat2:
                return "mat2";
            case EOpConstructMat2x3:
                return "mat2x3";
            case EOpConstructMat2x4:
                return "mat2x4";
            case EOpConstructMat3x2:
                return "mat3x2";
            case EOpConstructMat3:
                return "mat3";
            case EOpConstructMat3x4:
                return "mat3x4";
            case EOpConstructMat4x2:
                return "mat4x2";
            case EOpConstructMat4x3:
                return "mat4x3";
            case EOpConstructMat4:
                return "mat4";
            // Note: EOpConstructStruct can't be handled here
    
            case EOpAssign:
                return "=";
            case EOpInitialize:
                return "=";
            case EOpAddAssign:
                return "+=";
            case EOpSubAssign:
                return "-=";
    
            // Fall-through.
            case EOpMulAssign:
            case EOpVectorTimesMatrixAssign:
            case EOpVectorTimesScalarAssign:
            case EOpMatrixTimesScalarAssign:
            case EOpMatrixTimesMatrixAssign:
                return "*=";
    
            case EOpDivAssign:
                return "/=";
            case EOpIModAssign:
                return "%=";
            case EOpBitShiftLeftAssign:
                return "<<=";
            case EOpBitShiftRightAssign:
                return ">>=";
            case EOpBitwiseAndAssign:
                return "&=";
            case EOpBitwiseXorAssign:
                return "^=";
            case EOpBitwiseOrAssign:
                return "|=";
            case EOpBarrier:
                return "barrier";
            case EOpMemoryBarrier:
                return "memoryBarrier";
            case EOpMemoryBarrierAtomicCounter:
                return "memoryBarrierAtomicCounter";
            case EOpMemoryBarrierBuffer:
                return "memoryBarrierBuffer";
            case EOpMemoryBarrierImage:
                return "memoryBarrierImage";
            case EOpMemoryBarrierShared:
                return "memoryBarrierShared";
            case EOpGroupMemoryBarrier:
                return "groupMemoryBarrier";
            default:
                break;
        }
        return "";
    }
    
    bool IsAssignment(TOperator op)
    {
        switch (op)
        {
            case EOpPostIncrement:
            case EOpPostDecrement:
            case EOpPreIncrement:
            case EOpPreDecrement:
            case EOpAssign:
            case EOpAddAssign:
            case EOpSubAssign:
            case EOpMulAssign:
            case EOpVectorTimesMatrixAssign:
            case EOpVectorTimesScalarAssign:
            case EOpMatrixTimesScalarAssign:
            case EOpMatrixTimesMatrixAssign:
            case EOpDivAssign:
            case EOpIModAssign:
            case EOpBitShiftLeftAssign:
            case EOpBitShiftRightAssign:
            case EOpBitwiseAndAssign:
            case EOpBitwiseXorAssign:
            case EOpBitwiseOrAssign:
                return true;
            default:
                return false;
        }
    }