//
// Copyright (c) 2016 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.
//
// TextureFunctionHLSL: Class for writing implementations of ESSL texture functions into HLSL
// output. Some of the implementations are straightforward and just call the HLSL equivalent of the
// ESSL texture function, others do more work to emulate ESSL texture sampling or size query
// behavior.
//

#ifndef COMPILER_TRANSLATOR_TEXTUREFUNCTIONHLSL_H_
#define COMPILER_TRANSLATOR_TEXTUREFUNCTIONHLSL_H_

#include <set>

#include "GLSLANG/ShaderLang.h"
#include "compiler/translator/BaseTypes.h"
#include "compiler/translator/Common.h"
#include "compiler/translator/InfoSink.h"

namespace sh
{

class TextureFunctionHLSL final : angle::NonCopyable
{
  public:
    struct TextureFunction
    {
        // See ESSL 3.00.6 section 8.8 for reference about what the different methods below do.
        enum Method
        {
            IMPLICIT,  // Mipmap LOD determined implicitly (standard lookup)
            BIAS,
            LOD,
            LOD0,
            LOD0BIAS,
            SIZE,  // textureSize()
            FETCH,
            GRAD,
            GATHER
        };

        ImmutableString name() const;

        bool operator<(const TextureFunction &rhs) const;

        const char *getReturnType() const;

        TBasicType sampler;
        int coords;
        bool proj;
        bool offset;
        Method method;
    };

    // Returns the name of the texture function implementation to call.
    // The name that's passed in is the name of the GLSL texture function that it should implement.
    ImmutableString useTextureFunction(const ImmutableString &name,
                                       TBasicType samplerType,
                                       int coords,
                                       size_t argumentCount,
                                       bool lod0,
                                       sh::GLenum shaderType);

    void textureFunctionHeader(TInfoSinkBase &out,
                               const ShShaderOutput outputType,
                               bool getDimensionsIgnoresBaseLevel);

  private:
    typedef std::set<TextureFunction> TextureFunctionSet;
    TextureFunctionSet mUsesTexture;
};

}  // namespace sh

#endif  // COMPILER_TRANSLATOR_TEXTUREFUNCTIONHLSL_H_
