//
// Copyright (c) 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.
//
// ExtensionGLSL.cpp: Implements the TExtensionGLSL class that tracks GLSL extension requirements
// of shaders.

#include "compiler/translator/ExtensionGLSL.h"

#include "compiler/translator/VersionGLSL.h"

namespace sh
{

TExtensionGLSL::TExtensionGLSL(ShShaderOutput output)
    : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output))
{}

const std::set<std::string> &TExtensionGLSL::getEnabledExtensions() const
{
    return mEnabledExtensions;
}

const std::set<std::string> &TExtensionGLSL::getRequiredExtensions() const
{
    return mRequiredExtensions;
}

bool TExtensionGLSL::visitUnary(Visit, TIntermUnary *node)
{
    checkOperator(node);

    return true;
}

bool TExtensionGLSL::visitAggregate(Visit, TIntermAggregate *node)
{
    checkOperator(node);

    return true;
}

void TExtensionGLSL::checkOperator(TIntermOperator *node)
{
    if (mTargetVersion < GLSL_VERSION_130)
    {
        return;
    }

    switch (node->getOp())
    {
        case EOpAbs:
            break;

        case EOpSign:
            break;

        case EOpMix:
            break;

        case EOpFloatBitsToInt:
        case EOpFloatBitsToUint:
        case EOpIntBitsToFloat:
        case EOpUintBitsToFloat:
            if (mTargetVersion < GLSL_VERSION_330)
            {
                // Bit conversion functions cannot be emulated.
                mRequiredExtensions.insert("GL_ARB_shader_bit_encoding");
            }
            break;

        case EOpPackSnorm2x16:
        case EOpPackHalf2x16:
        case EOpUnpackSnorm2x16:
        case EOpUnpackHalf2x16:
            if (mTargetVersion < GLSL_VERSION_420)
            {
                mEnabledExtensions.insert("GL_ARB_shading_language_packing");

                if (mTargetVersion < GLSL_VERSION_330)
                {
                    // floatBitsToUint and uintBitsToFloat are needed to emulate
                    // packHalf2x16 and unpackHalf2x16 respectively and cannot be
                    // emulated themselves.
                    mRequiredExtensions.insert("GL_ARB_shader_bit_encoding");
                }
            }
            break;

        case EOpPackUnorm2x16:
        case EOpUnpackUnorm2x16:
            if (mTargetVersion < GLSL_VERSION_410)
            {
                mEnabledExtensions.insert("GL_ARB_shading_language_packing");
            }
            break;

        default:
            break;
    }
}

}  // namespace sh
