//
// Copyright (c) 2002-2010 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.
//

#ifndef COMPILER_VERSIONGLSL_H_
#define COMPILER_VERSIONGLSL_H_

#include "GLSLANG/ShaderLang.h"
#include "compiler/intermediate.h"

// Traverses the intermediate tree to return the minimum GLSL version
// required to legally access all built-in features used in the shader.
// GLSL 1.1 which is mandated by OpenGL 2.0 provides:
//   - #version and #extension to declare version and extensions.
//   - built-in functions refract, exp, and log.
//   - updated step() to compare x < edge instead of x <= edge.
// GLSL 1.2 which is mandated by OpenGL 2.1 provides:
//   - many changes to reduce differences when compared to the ES specification.
//   - invariant keyword and its support.
//   - c++ style name hiding rules.
//   - built-in variable gl_PointCoord for fragment shaders.
//   - matrix constructors taking matrix as argument.
//   - array as "out" function parameters
//
class TVersionGLSL : public TIntermTraverser {
public:
    TVersionGLSL(ShShaderType type);

    // Returns 120 if the following is used the shader:
    // - "invariant",
    // - "gl_PointCoord",
    // - matrix/matrix constructors
    // - array "out" parameters
    // Else 110 is returned.
    int getVersion() { return mVersion; }

    virtual void visitSymbol(TIntermSymbol*);
    virtual void visitConstantUnion(TIntermConstantUnion*);
    virtual bool visitBinary(Visit, TIntermBinary*);
    virtual bool visitUnary(Visit, TIntermUnary*);
    virtual bool visitSelection(Visit, TIntermSelection*);
    virtual bool visitAggregate(Visit, TIntermAggregate*);
    virtual bool visitLoop(Visit, TIntermLoop*);
    virtual bool visitBranch(Visit, TIntermBranch*);

protected:
    void updateVersion(int version);

private:
    ShShaderType mShaderType;
    int mVersion;
};

#endif  // COMPILER_VERSIONGLSL_H_
