// 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.

#include "src/ast/stage_decoration.h"
#include "src/writer/msl/test_helper.h"

namespace tint {
namespace writer {
namespace msl {
namespace {

using MslGeneratorImplTest = TestHelper;

TEST_F(MslGeneratorImplTest, Generate) {
  Func("my_func", ast::VariableList{}, ty.void_(), ast::StatementList{},
       ast::DecorationList{
           Stage(ast::PipelineStage::kCompute),
           WorkgroupSize(1),
       });

  GeneratorImpl& gen = Build();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
kernel void my_func() {
  return;
}

)");
}

struct MslBuiltinData {
  ast::Builtin builtin;
  const char* attribute_name;
};
inline std::ostream& operator<<(std::ostream& out, MslBuiltinData data) {
  out << data.builtin;
  return out;
}
using MslBuiltinConversionTest = TestParamHelper<MslBuiltinData>;
TEST_P(MslBuiltinConversionTest, Emit) {
  auto params = GetParam();

  GeneratorImpl& gen = Build();

  EXPECT_EQ(gen.builtin_to_attribute(params.builtin),
            std::string(params.attribute_name));
}
INSTANTIATE_TEST_SUITE_P(
    MslGeneratorImplTest,
    MslBuiltinConversionTest,
    testing::Values(MslBuiltinData{ast::Builtin::kPosition, "position"},
                    MslBuiltinData{ast::Builtin::kVertexIndex, "vertex_id"},
                    MslBuiltinData{ast::Builtin::kInstanceIndex, "instance_id"},
                    MslBuiltinData{ast::Builtin::kFrontFacing, "front_facing"},
                    MslBuiltinData{ast::Builtin::kFragDepth, "depth(any)"},
                    MslBuiltinData{ast::Builtin::kLocalInvocationId,
                                   "thread_position_in_threadgroup"},
                    MslBuiltinData{ast::Builtin::kLocalInvocationIndex,
                                   "thread_index_in_threadgroup"},
                    MslBuiltinData{ast::Builtin::kGlobalInvocationId,
                                   "thread_position_in_grid"},
                    MslBuiltinData{ast::Builtin::kWorkgroupId,
                                   "threadgroup_position_in_grid"},
                    MslBuiltinData{ast::Builtin::kNumWorkgroups,
                                   "threadgroups_per_grid"},
                    MslBuiltinData{ast::Builtin::kSampleIndex, "sample_id"},
                    MslBuiltinData{ast::Builtin::kSampleMask, "sample_mask"},
                    MslBuiltinData{ast::Builtin::kPointSize, "point_size"}));

TEST_F(MslGeneratorImplTest, HasInvariantAttribute_True) {
  auto* out = Structure(
      "Out", {Member("pos", ty.vec4<f32>(),
                     {Builtin(ast::Builtin::kPosition), Invariant()})});
  Func("vert_main", ast::VariableList{}, ty.Of(out),
       {Return(Construct(ty.Of(out)))}, {Stage(ast::PipelineStage::kVertex)});

  GeneratorImpl& gen = Build();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_TRUE(gen.HasInvariant());
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct Out {
  float4 pos [[position]] [[invariant]];
};

vertex Out vert_main() {
  return {};
}

)");
}

TEST_F(MslGeneratorImplTest, HasInvariantAttribute_False) {
  auto* out = Structure("Out", {Member("pos", ty.vec4<f32>(),
                                       {Builtin(ast::Builtin::kPosition)})});
  Func("vert_main", ast::VariableList{}, ty.Of(out),
       {Return(Construct(ty.Of(out)))}, {Stage(ast::PipelineStage::kVertex)});

  GeneratorImpl& gen = Build();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_FALSE(gen.HasInvariant());
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct Out {
  float4 pos [[position]];
};

vertex Out vert_main() {
  return {};
}

)");
}

TEST_F(MslGeneratorImplTest, WorkgroupMatrix) {
  Global("m", ty.mat2x2<f32>(), ast::StorageClass::kWorkgroup);
  Func("comp_main", ast::VariableList{}, ty.void_(),
       {Decl(Const("x", nullptr, Expr("m")))},
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});

  GeneratorImpl& gen = SanitizeAndBuild();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct tint_symbol_3 {
  float2x2 m;
};

void comp_main_inner(uint local_invocation_index, threadgroup float2x2* const tint_symbol) {
  {
    *(tint_symbol) = float2x2();
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  float2x2 const x = *(tint_symbol);
}

kernel void comp_main(threadgroup tint_symbol_3* tint_symbol_2 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  comp_main_inner(local_invocation_index, &((*(tint_symbol_2)).m));
  return;
}

)");

  auto allocations = gen.DynamicWorkgroupAllocations();
  ASSERT_TRUE(allocations.count("comp_main"));
  ASSERT_EQ(allocations["comp_main"].size(), 1u);
  EXPECT_EQ(allocations["comp_main"][0], 2u * 2u * sizeof(float));
}

TEST_F(MslGeneratorImplTest, WorkgroupMatrixInArray) {
  Global("m", ty.array(ty.mat2x2<f32>(), 4), ast::StorageClass::kWorkgroup);
  Func("comp_main", ast::VariableList{}, ty.void_(),
       {Decl(Const("x", nullptr, Expr("m")))},
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});

  GeneratorImpl& gen = SanitizeAndBuild();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  float2x2 arr[4];
};
struct tint_symbol_3 {
  tint_array_wrapper m;
};

void comp_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper* const tint_symbol) {
  for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) {
    uint const i = idx;
    (*(tint_symbol)).arr[i] = float2x2();
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  tint_array_wrapper const x = *(tint_symbol);
}

kernel void comp_main(threadgroup tint_symbol_3* tint_symbol_2 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  comp_main_inner(local_invocation_index, &((*(tint_symbol_2)).m));
  return;
}

)");

  auto allocations = gen.DynamicWorkgroupAllocations();
  ASSERT_TRUE(allocations.count("comp_main"));
  ASSERT_EQ(allocations["comp_main"].size(), 1u);
  EXPECT_EQ(allocations["comp_main"][0], 4u * 2u * 2u * sizeof(float));
}

TEST_F(MslGeneratorImplTest, WorkgroupMatrixInStruct) {
  Structure("S1", {
                      Member("m1", ty.mat2x2<f32>()),
                      Member("m2", ty.mat4x4<f32>()),
                  });
  Structure("S2", {
                      Member("s", ty.type_name("S1")),
                  });
  Global("s", ty.type_name("S2"), ast::StorageClass::kWorkgroup);
  Func("comp_main", ast::VariableList{}, ty.void_(),
       {Decl(Const("x", nullptr, Expr("s")))},
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});

  GeneratorImpl& gen = SanitizeAndBuild();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct S1 {
  float2x2 m1;
  float4x4 m2;
};
struct S2 {
  S1 s;
};
struct tint_symbol_4 {
  S2 s;
};

void comp_main_inner(uint local_invocation_index, threadgroup S2* const tint_symbol_1) {
  {
    S2 const tint_symbol = {};
    *(tint_symbol_1) = tint_symbol;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  S2 const x = *(tint_symbol_1);
}

kernel void comp_main(threadgroup tint_symbol_4* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  comp_main_inner(local_invocation_index, &((*(tint_symbol_3)).s));
  return;
}

)");

  auto allocations = gen.DynamicWorkgroupAllocations();
  ASSERT_TRUE(allocations.count("comp_main"));
  ASSERT_EQ(allocations["comp_main"].size(), 1u);
  EXPECT_EQ(allocations["comp_main"][0],
            (2 * 2 * sizeof(float)) + (4u * 4u * sizeof(float)));
}

TEST_F(MslGeneratorImplTest, WorkgroupMatrix_Multiples) {
  Global("m1", ty.mat2x2<f32>(), ast::StorageClass::kWorkgroup);
  Global("m2", ty.mat2x3<f32>(), ast::StorageClass::kWorkgroup);
  Global("m3", ty.mat2x4<f32>(), ast::StorageClass::kWorkgroup);
  Global("m4", ty.mat3x2<f32>(), ast::StorageClass::kWorkgroup);
  Global("m5", ty.mat3x3<f32>(), ast::StorageClass::kWorkgroup);
  Global("m6", ty.mat3x4<f32>(), ast::StorageClass::kWorkgroup);
  Global("m7", ty.mat4x2<f32>(), ast::StorageClass::kWorkgroup);
  Global("m8", ty.mat4x3<f32>(), ast::StorageClass::kWorkgroup);
  Global("m9", ty.mat4x4<f32>(), ast::StorageClass::kWorkgroup);
  Func("main1", ast::VariableList{}, ty.void_(),
       {
           Decl(Const("a1", nullptr, Expr("m1"))),
           Decl(Const("a2", nullptr, Expr("m2"))),
           Decl(Const("a3", nullptr, Expr("m3"))),
       },
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});
  Func("main2", ast::VariableList{}, ty.void_(),
       {
           Decl(Const("a1", nullptr, Expr("m4"))),
           Decl(Const("a2", nullptr, Expr("m5"))),
           Decl(Const("a3", nullptr, Expr("m6"))),
       },
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});
  Func("main3", ast::VariableList{}, ty.void_(),
       {
           Decl(Const("a1", nullptr, Expr("m7"))),
           Decl(Const("a2", nullptr, Expr("m8"))),
           Decl(Const("a3", nullptr, Expr("m9"))),
       },
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});
  Func("main4_no_usages", ast::VariableList{}, ty.void_(), {},
       {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});

  GeneratorImpl& gen = SanitizeAndBuild();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>

using namespace metal;
struct tint_symbol_7 {
  float2x2 m1;
  float2x3 m2;
  float2x4 m3;
};
struct tint_symbol_15 {
  float3x2 m4;
  float3x3 m5;
  float3x4 m6;
};
struct tint_symbol_23 {
  float4x2 m7;
  float4x3 m8;
  float4x4 m9;
};

void main1_inner(uint local_invocation_index, threadgroup float2x2* const tint_symbol, threadgroup float2x3* const tint_symbol_1, threadgroup float2x4* const tint_symbol_2) {
  {
    *(tint_symbol) = float2x2();
    *(tint_symbol_1) = float2x3();
    *(tint_symbol_2) = float2x4();
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  float2x2 const a1 = *(tint_symbol);
  float2x3 const a2 = *(tint_symbol_1);
  float2x4 const a3 = *(tint_symbol_2);
}

kernel void main1(threadgroup tint_symbol_7* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  main1_inner(local_invocation_index, &((*(tint_symbol_4)).m1), &((*(tint_symbol_4)).m2), &((*(tint_symbol_4)).m3));
  return;
}

void main2_inner(uint local_invocation_index_1, threadgroup float3x2* const tint_symbol_8, threadgroup float3x3* const tint_symbol_9, threadgroup float3x4* const tint_symbol_10) {
  {
    *(tint_symbol_8) = float3x2();
    *(tint_symbol_9) = float3x3();
    *(tint_symbol_10) = float3x4();
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  float3x2 const a1 = *(tint_symbol_8);
  float3x3 const a2 = *(tint_symbol_9);
  float3x4 const a3 = *(tint_symbol_10);
}

kernel void main2(threadgroup tint_symbol_15* tint_symbol_12 [[threadgroup(0)]], uint local_invocation_index_1 [[thread_index_in_threadgroup]]) {
  main2_inner(local_invocation_index_1, &((*(tint_symbol_12)).m4), &((*(tint_symbol_12)).m5), &((*(tint_symbol_12)).m6));
  return;
}

void main3_inner(uint local_invocation_index_2, threadgroup float4x2* const tint_symbol_16, threadgroup float4x3* const tint_symbol_17, threadgroup float4x4* const tint_symbol_18) {
  {
    *(tint_symbol_16) = float4x2();
    *(tint_symbol_17) = float4x3();
    *(tint_symbol_18) = float4x4();
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  float4x2 const a1 = *(tint_symbol_16);
  float4x3 const a2 = *(tint_symbol_17);
  float4x4 const a3 = *(tint_symbol_18);
}

kernel void main3(threadgroup tint_symbol_23* tint_symbol_20 [[threadgroup(0)]], uint local_invocation_index_2 [[thread_index_in_threadgroup]]) {
  main3_inner(local_invocation_index_2, &((*(tint_symbol_20)).m7), &((*(tint_symbol_20)).m8), &((*(tint_symbol_20)).m9));
  return;
}

kernel void main4_no_usages() {
  return;
}

)");

  auto allocations = gen.DynamicWorkgroupAllocations();
  ASSERT_TRUE(allocations.count("main1"));
  ASSERT_TRUE(allocations.count("main2"));
  ASSERT_TRUE(allocations.count("main3"));
  EXPECT_EQ(allocations.count("main4_no_usages"), 0u);
  ASSERT_EQ(allocations["main1"].size(), 1u);
  EXPECT_EQ(allocations["main1"][0], 20u * sizeof(float));
  ASSERT_EQ(allocations["main2"].size(), 1u);
  EXPECT_EQ(allocations["main2"][0], 32u * sizeof(float));
  ASSERT_EQ(allocations["main3"].size(), 1u);
  EXPECT_EQ(allocations["main3"][0], 40u * sizeof(float));
}

}  // namespace
}  // namespace msl
}  // namespace writer
}  // namespace tint
