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

#ifdef ANGLE_ENABLE_ESSL
#include "compiler/translator/TranslatorESSL.h"
#endif

#ifdef ANGLE_ENABLE_GLSL
#include "compiler/translator/TranslatorGLSL.h"
#endif

#ifdef ANGLE_ENABLE_HLSL
#include "compiler/translator/TranslatorHLSL.h"
#endif // ANGLE_ENABLE_HLSL

//
// This function must be provided to create the actual
// compile object used by higher level code.  It returns
// a subclass of TCompiler.
//
TCompiler* ConstructCompiler(
    sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
{
    switch (output) {
      case SH_ESSL_OUTPUT:
#ifdef ANGLE_ENABLE_ESSL
        return new TranslatorESSL(type, spec);
#else
        // This compiler is not supported in this
        // configuration. Return NULL per the ShConstructCompiler API.
        return nullptr;
#endif // ANGLE_ENABLE_ESSL
      case SH_GLSL_130_OUTPUT:
      case SH_GLSL_140_OUTPUT:
      case SH_GLSL_150_CORE_OUTPUT:
      case SH_GLSL_330_CORE_OUTPUT:
      case SH_GLSL_400_CORE_OUTPUT:
      case SH_GLSL_410_CORE_OUTPUT:
      case SH_GLSL_420_CORE_OUTPUT:
      case SH_GLSL_430_CORE_OUTPUT:
      case SH_GLSL_440_CORE_OUTPUT:
      case SH_GLSL_450_CORE_OUTPUT:
      case SH_GLSL_COMPATIBILITY_OUTPUT:
#ifdef ANGLE_ENABLE_GLSL
        return new TranslatorGLSL(type, spec, output);
#else
        // This compiler is not supported in this
        // configuration. Return NULL per the ShConstructCompiler API.
        return nullptr;
#endif // ANGLE_ENABLE_GLSL
      case SH_HLSL_3_0_OUTPUT:
      case SH_HLSL_4_1_OUTPUT:
      case SH_HLSL_4_0_FL9_3_OUTPUT:
#ifdef ANGLE_ENABLE_HLSL
        return new TranslatorHLSL(type, spec, output);
#else
        // This compiler is not supported in this
        // configuration. Return NULL per the ShConstructCompiler API.
        return nullptr;
#endif // ANGLE_ENABLE_HLSL
      default:
        // Unknown format. Return NULL per the ShConstructCompiler API.
        return nullptr;
    }
}

//
// Delete the compiler made by ConstructCompiler
//
void DeleteCompiler(TCompiler* compiler)
{
    delete compiler;
}
