// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_AST_BUILTIN_TEXTURE_HELPER_TEST_H_
#define SRC_TINT_AST_BUILTIN_TEXTURE_HELPER_TEST_H_

#include <vector>

#include "src/tint/builtin/access.h"
#include "src/tint/builtin/texel_format.h"
#include "src/tint/program_builder.h"
#include "src/tint/type/storage_texture.h"
#include "src/tint/type/texture_dimension.h"

namespace tint::ast::builtin::test {

/// The name of the texture global variable used by the tests.
static constexpr const char* kTextureName = "Texture";

/// The name of the sampler global variable used by the tests.
static constexpr const char* kSamplerName = "Sampler";

enum class TextureKind { kRegular, kDepth, kDepthMultisampled, kMultisampled, kStorage };
enum class TextureDataType { kF32, kU32, kI32 };

std::ostream& operator<<(std::ostream& out, const TextureKind& kind);
std::ostream& operator<<(std::ostream& out, const TextureDataType& ty);

/// Non-exhaustive list of valid texture overloads
enum class ValidTextureOverload {
    kDimensions1d,
    kDimensions2d,
    kDimensions2dLevel,
    kDimensions2dArray,
    kDimensions2dArrayLevel,
    kDimensions3d,
    kDimensions3dLevel,
    kDimensionsCube,
    kDimensionsCubeLevel,
    kDimensionsCubeArray,
    kDimensionsCubeArrayLevel,
    kDimensionsMultisampled2d,
    kDimensionsDepth2d,
    kDimensionsDepth2dLevel,
    kDimensionsDepth2dArray,
    kDimensionsDepth2dArrayLevel,
    kDimensionsDepthCube,
    kDimensionsDepthCubeLevel,
    kDimensionsDepthCubeArray,
    kDimensionsDepthCubeArrayLevel,
    kDimensionsDepthMultisampled2d,
    kDimensionsStorageWO1d,
    kDimensionsStorageWO2d,
    kDimensionsStorageWO2dArray,
    kDimensionsStorageWO3d,
    kGather2dF32,
    kGather2dOffsetF32,
    kGather2dArrayF32,
    kGather2dArrayOffsetF32,
    kGatherCubeF32,
    kGatherCubeArrayF32,
    kGatherDepth2dF32,
    kGatherDepth2dOffsetF32,
    kGatherDepth2dArrayF32,
    kGatherDepth2dArrayOffsetF32,
    kGatherDepthCubeF32,
    kGatherDepthCubeArrayF32,
    kGatherCompareDepth2dF32,
    kGatherCompareDepth2dOffsetF32,
    kGatherCompareDepth2dArrayF32,
    kGatherCompareDepth2dArrayOffsetF32,
    kGatherCompareDepthCubeF32,
    kGatherCompareDepthCubeArrayF32,
    kNumLayers2dArray,
    kNumLayersCubeArray,
    kNumLayersDepth2dArray,
    kNumLayersDepthCubeArray,
    kNumLayersStorageWO2dArray,
    kNumLevels2d,
    kNumLevels2dArray,
    kNumLevels3d,
    kNumLevelsCube,
    kNumLevelsCubeArray,
    kNumLevelsDepth2d,
    kNumLevelsDepth2dArray,
    kNumLevelsDepthCube,
    kNumLevelsDepthCubeArray,
    kNumSamplesMultisampled2d,
    kNumSamplesDepthMultisampled2d,
    kSample1dF32,
    kSample2dF32,
    kSample2dOffsetF32,
    kSample2dArrayF32,
    kSample2dArrayOffsetF32,
    kSample3dF32,
    kSample3dOffsetF32,
    kSampleCubeF32,
    kSampleCubeArrayF32,
    kSampleDepth2dF32,
    kSampleDepth2dOffsetF32,
    kSampleDepth2dArrayF32,
    kSampleDepth2dArrayOffsetF32,
    kSampleDepthCubeF32,
    kSampleDepthCubeArrayF32,
    kSampleBias2dF32,
    kSampleBias2dOffsetF32,
    kSampleBias2dArrayF32,
    kSampleBias2dArrayOffsetF32,
    kSampleBias3dF32,
    kSampleBias3dOffsetF32,
    kSampleBiasCubeF32,
    kSampleBiasCubeArrayF32,
    kSampleLevel2dF32,
    kSampleLevel2dOffsetF32,
    kSampleLevel2dArrayF32,
    kSampleLevel2dArrayOffsetF32,
    kSampleLevel3dF32,
    kSampleLevel3dOffsetF32,
    kSampleLevelCubeF32,
    kSampleLevelCubeArrayF32,
    kSampleLevelDepth2dF32,
    kSampleLevelDepth2dOffsetF32,
    kSampleLevelDepth2dArrayF32,
    kSampleLevelDepth2dArrayOffsetF32,
    kSampleLevelDepthCubeF32,
    kSampleLevelDepthCubeArrayF32,
    kSampleGrad2dF32,
    kSampleGrad2dOffsetF32,
    kSampleGrad2dArrayF32,
    kSampleGrad2dArrayOffsetF32,
    kSampleGrad3dF32,
    kSampleGrad3dOffsetF32,
    kSampleGradCubeF32,
    kSampleGradCubeArrayF32,
    kSampleCompareDepth2dF32,
    kSampleCompareDepth2dOffsetF32,
    kSampleCompareDepth2dArrayF32,
    kSampleCompareDepth2dArrayOffsetF32,
    kSampleCompareDepthCubeF32,
    kSampleCompareDepthCubeArrayF32,
    kSampleCompareLevelDepth2dF32,
    kSampleCompareLevelDepth2dOffsetF32,
    kSampleCompareLevelDepth2dArrayF32,
    kSampleCompareLevelDepth2dArrayOffsetF32,
    kSampleCompareLevelDepthCubeF32,
    kSampleCompareLevelDepthCubeArrayF32,
    kLoad1dLevelF32,
    kLoad1dLevelU32,
    kLoad1dLevelI32,
    kLoad2dLevelF32,
    kLoad2dLevelU32,
    kLoad2dLevelI32,
    kLoad2dArrayLevelF32,
    kLoad2dArrayLevelU32,
    kLoad2dArrayLevelI32,
    kLoad3dLevelF32,
    kLoad3dLevelU32,
    kLoad3dLevelI32,
    kLoadMultisampled2dF32,
    kLoadMultisampled2dU32,
    kLoadMultisampled2dI32,
    kLoadDepth2dLevelF32,
    kLoadDepth2dArrayLevelF32,
    kLoadDepthMultisampled2dF32,
    kStoreWO1dRgba32float,       // Not permutated for all texel formats
    kStoreWO2dRgba32float,       // Not permutated for all texel formats
    kStoreWO2dArrayRgba32float,  // Not permutated for all texel formats
    kStoreWO3dRgba32float,       // Not permutated for all texel formats
};

/// @param texture_overload the ValidTextureOverload
/// @returns true if the ValidTextureOverload builtin returns no value.
bool ReturnsVoid(ValidTextureOverload texture_overload);

/// Describes a texture builtin overload
struct TextureOverloadCase {
    /// Args is a list of Expression used as arguments to the texture overload case.
    using Args = utils::Vector<const Expression*, 8>;

    /// Constructor for textureSample...() functions
    TextureOverloadCase(ValidTextureOverload,
                        const char*,
                        TextureKind,
                        type::SamplerKind,
                        type::TextureDimension,
                        TextureDataType,
                        const char*,
                        std::function<Args(ProgramBuilder*)>,
                        bool /* returns_value */);
    /// Constructor for textureLoad() functions with non-storage textures
    TextureOverloadCase(ValidTextureOverload,
                        const char*,
                        TextureKind,
                        type::TextureDimension,
                        TextureDataType,
                        const char*,
                        std::function<Args(ProgramBuilder*)>,
                        bool /* returns_value */);
    /// Constructor for textureLoad() with storage textures
    TextureOverloadCase(ValidTextureOverload,
                        const char*,
                        tint::builtin::Access,
                        tint::builtin::TexelFormat,
                        type::TextureDimension,
                        TextureDataType,
                        const char*,
                        std::function<Args(ProgramBuilder*)>,
                        bool /* returns_value */);
    /// Copy constructor
    TextureOverloadCase(const TextureOverloadCase&);
    /// Destructor
    ~TextureOverloadCase();

    /// @return a vector containing a large number (non-exhaustive) of valid
    /// texture overloads.
    static std::vector<TextureOverloadCase> ValidCases();

    /// @param builder the AST builder used for the test
    /// @returns the vector component type of the texture function return value
    Type BuildResultVectorComponentType(ProgramBuilder* builder) const;
    /// @param builder the AST builder used for the test
    /// @returns a variable holding the test texture, automatically registered as
    /// a global variable.
    const Variable* BuildTextureVariable(ProgramBuilder* builder) const;
    /// @param builder the AST builder used for the test
    /// @returns a Variable holding the test sampler, automatically registered as
    /// a global variable.
    const Variable* BuildSamplerVariable(ProgramBuilder* builder) const;

    /// The enumerator for this overload
    const ValidTextureOverload overload;
    /// A human readable description of the overload
    const char* const description;
    /// The texture kind for the texture parameter
    const TextureKind texture_kind;
    /// The sampler kind for the sampler parameter
    /// Used only when texture_kind is not kStorage
    type::SamplerKind const sampler_kind = type::SamplerKind::kSampler;
    /// The access control for the storage texture
    /// Used only when texture_kind is kStorage
    tint::builtin::Access const access = tint::builtin::Access::kReadWrite;
    /// The image format for the storage texture
    /// Used only when texture_kind is kStorage
    tint::builtin::TexelFormat const texel_format = tint::builtin::TexelFormat::kUndefined;
    /// The dimensions of the texture parameter
    type::TextureDimension const texture_dimension;
    /// The data type of the texture parameter
    const TextureDataType texture_data_type;
    /// Name of the function. e.g. `textureSample`, `textureSampleGrad`, etc
    const char* const function;
    /// A function that builds the AST arguments for the overload
    std::function<Args(ProgramBuilder*)> const args;
    /// True if the function returns a value
    const bool returns_value;
};

std::ostream& operator<<(std::ostream& out, const TextureOverloadCase& data);

}  // namespace tint::ast::builtin::test

#endif  // SRC_TINT_AST_BUILTIN_TEXTURE_HELPER_TEST_H_
