// Copyright 2021 The Dawn 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 <algorithm>
#include <array>
#include <functional>
#include <string>
#include <vector>

#include "dawn/common/Math.h"
#include "dawn/tests/DawnTest.h"
#include "dawn/utils/WGPUHelpers.h"

namespace {

// Helper for replacing all occurrences of substr in str with replacement
std::string ReplaceAll(std::string str, const std::string& substr, const std::string& replacement) {
    size_t pos = 0;
    while ((pos = str.find(substr, pos)) != std::string::npos) {
        str.replace(pos, substr.length(), replacement);
        pos += replacement.length();
    }
    return str;
}

// DataMatcherCallback is the callback function by DataMatcher.
// It is called for each contiguous sequence of bytes that should be checked
// for equality.
// offset and size are in units of bytes.
using DataMatcherCallback = std::function<void(uint32_t offset, uint32_t size)>;

// DataMatcher is a function pointer to a data matching function.
// size is the total number of bytes being considered for matching.
// The callback may be called once or multiple times, and may only consider
// part of the interval [0, size)
using DataMatcher = void (*)(uint32_t size, DataMatcherCallback);

// FullDataMatcher is a DataMatcher that calls callback with the interval
// [0, size)
void FullDataMatcher(uint32_t size, DataMatcherCallback callback) {
    callback(0, size);
}

// StridedDataMatcher is a DataMatcher that calls callback with the strided
// intervals of length BYTES_TO_MATCH, skipping BYTES_TO_SKIP.
// For example: StridedDataMatcher<2, 4>(18, callback) will call callback
// with the intervals: [0, 2), [6, 8), [12, 14)
template <int BYTES_TO_MATCH, int BYTES_TO_SKIP>
void StridedDataMatcher(uint32_t size, DataMatcherCallback callback) {
    uint32_t offset = 0;
    while (offset < size) {
        callback(offset, BYTES_TO_MATCH);
        offset += BYTES_TO_MATCH + BYTES_TO_SKIP;
    }
}

// Align returns the WGSL decoration for an explicit structure field alignment
std::string AlignDeco(uint32_t value) {
    return "@align(" + std::to_string(value) + ") ";
}

}  // namespace

// Field holds test parameters for ComputeLayoutMemoryBufferTests.Fields
struct Field {
    const char* type;  // Type of the field
    uint32_t align;    // Alignment of the type in bytes
    uint32_t size;     // Natural size of the type in bytes

    uint32_t padded_size = 0;                // Decorated (extended) size of the type in bytes
    DataMatcher matcher = &FullDataMatcher;  // The matching method
    bool storage_buffer_only = false;        // This should only be used for storage buffer tests

    // Sets the padded_size to value.
    // Returns this Field so calls can be chained.
    Field& PaddedSize(uint32_t value) {
        padded_size = value;
        return *this;
    }

    // Sets the matcher to a StridedDataMatcher<BYTES_TO_MATCH, BYTES_TO_SKIP>.
    // Returns this Field so calls can be chained.
    template <int BYTES_TO_MATCH, int BYTES_TO_SKIP>
    Field& Strided() {
        matcher = &StridedDataMatcher<BYTES_TO_MATCH, BYTES_TO_SKIP>;
        return *this;
    }

    // Marks that this should only be used for storage buffer tests.
    // Returns this Field so calls can be chained.
    Field& StorageBufferOnly() {
        storage_buffer_only = true;
        return *this;
    }
};

// StorageClass is an enumerator of storage classes used by ComputeLayoutMemoryBufferTests.Fields
enum class StorageClass {
    Uniform,
    Storage,
};

std::ostream& operator<<(std::ostream& o, StorageClass storageClass) {
    switch (storageClass) {
        case StorageClass::Uniform:
            o << "uniform";
            break;
        case StorageClass::Storage:
            o << "storage";
            break;
    }
    return o;
}

std::ostream& operator<<(std::ostream& o, Field field) {
    o << "@align(" << field.align << ") @size("
      << (field.padded_size > 0 ? field.padded_size : field.size) << ") " << field.type;
    return o;
}

DAWN_TEST_PARAM_STRUCT(ComputeLayoutMemoryBufferTestParams, StorageClass, Field);

class ComputeLayoutMemoryBufferTests
    : public DawnTestWithParams<ComputeLayoutMemoryBufferTestParams> {
    void SetUp() override { DawnTestBase::SetUp(); }
};

TEST_P(ComputeLayoutMemoryBufferTests, Fields) {
    // Sentinel value markers codes used to check that the start and end of
    // structures are correctly aligned. Each of these codes are distinct and
    // are not likely to be confused with data.
    constexpr uint32_t kDataHeaderCode = 0xa0b0c0a0u;
    constexpr uint32_t kDataFooterCode = 0x40302010u;
    constexpr uint32_t kInputHeaderCode = 0x91827364u;
    constexpr uint32_t kInputFooterCode = 0x19283764u;

    // Byte codes used for field padding. The MSB is set for each of these.
    // The field data has the MSB 0.
    constexpr uint8_t kDataAlignPaddingCode = 0xfeu;
    constexpr uint8_t kFieldAlignPaddingCode = 0xfdu;
    constexpr uint8_t kFieldSizePaddingCode = 0xdcu;
    constexpr uint8_t kDataSizePaddingCode = 0xdbu;
    constexpr uint8_t kInputFooterAlignPaddingCode = 0xdau;
    constexpr uint8_t kInputTailPaddingCode = 0xd9u;

    // Status codes returned by the shader.
    constexpr uint32_t kStatusBadInputHeader = 100u;
    constexpr uint32_t kStatusBadInputFooter = 101u;
    constexpr uint32_t kStatusBadDataHeader = 102u;
    constexpr uint32_t kStatusBadDataFooter = 103u;
    constexpr uint32_t kStatusOk = 200u;

    const Field& field = GetParam().mField;

    const bool isUniform = GetParam().mStorageClass == StorageClass::Uniform;

    std::string shader = R"(
struct Data {
    header : u32,
    @align({field_align}) @size({field_size}) field : {field_type},
    footer : u32,
}

struct Input {
    header : u32,
    {data_align}data : Data,
    {footer_align}footer : u32,
}

struct Output {
    data : {field_type}
}

struct Status {
    code : u32
}

@group(0) @binding(0) var<{input_qualifiers}> input : Input;
@group(0) @binding(1) var<storage, read_write> output : Output;
@group(0) @binding(2) var<storage, read_write> status : Status;

@compute @workgroup_size(1,1,1)
fn main() {
    if (input.header != {input_header_code}u) {
        status.code = {status_bad_input_header}u;
    } else if (input.footer != {input_footer_code}u) {
        status.code = {status_bad_input_footer}u;
    } else if (input.data.header != {data_header_code}u) {
        status.code = {status_bad_data_header}u;
    } else if (input.data.footer != {data_footer_code}u) {
        status.code = {status_bad_data_footer}u;
    } else {
        status.code = {status_ok}u;
        output.data = input.data.field;
    }
})";

    // https://www.w3.org/TR/WGSL/#alignment-and-size
    // Structure size: roundUp(AlignOf(S), OffsetOf(S, L) + SizeOf(S, L))
    // https://www.w3.org/TR/WGSL/#storage-class-constraints
    // RequiredAlignOf(S, uniform): roundUp(16, max(AlignOf(T0), ..., AlignOf(TN)))
    uint32_t dataAlign = isUniform ? std::max(16u, field.align) : field.align;

    // https://www.w3.org/TR/WGSL/#structure-layout-rules
    // Note: When underlying the target is a Vulkan device, we assume the device does not support
    // the scalarBlockLayout feature. Therefore, a data value must not be placed in the padding at
    // the end of a structure or matrix, nor in the padding at the last element of an array.
    uint32_t footerAlign = isUniform ? 16 : 4;

    shader = ReplaceAll(shader, "{data_align}", isUniform ? AlignDeco(dataAlign) : "");
    shader = ReplaceAll(shader, "{field_align}", std::to_string(field.align));
    shader = ReplaceAll(shader, "{footer_align}", isUniform ? AlignDeco(footerAlign) : "");
    shader = ReplaceAll(shader, "{field_size}",
                        std::to_string(field.padded_size > 0 ? field.padded_size : field.size));
    shader = ReplaceAll(shader, "{field_type}", field.type);
    shader = ReplaceAll(shader, "{input_header_code}", std::to_string(kInputHeaderCode));
    shader = ReplaceAll(shader, "{input_footer_code}", std::to_string(kInputFooterCode));
    shader = ReplaceAll(shader, "{data_header_code}", std::to_string(kDataHeaderCode));
    shader = ReplaceAll(shader, "{data_footer_code}", std::to_string(kDataFooterCode));
    shader = ReplaceAll(shader, "{status_bad_input_header}", std::to_string(kStatusBadInputHeader));
    shader = ReplaceAll(shader, "{status_bad_input_footer}", std::to_string(kStatusBadInputFooter));
    shader = ReplaceAll(shader, "{status_bad_data_header}", std::to_string(kStatusBadDataHeader));
    shader = ReplaceAll(shader, "{status_bad_data_footer}", std::to_string(kStatusBadDataFooter));
    shader = ReplaceAll(shader, "{status_ok}", std::to_string(kStatusOk));
    shader = ReplaceAll(shader, "{input_qualifiers}",
                        isUniform ? "uniform"  //
                                  : "storage, read_write");

    // Set up shader and pipeline
    auto module = utils::CreateShaderModule(device, shader.c_str());

    wgpu::ComputePipelineDescriptor csDesc;
    csDesc.compute.module = module;
    csDesc.compute.entryPoint = "main";

    wgpu::ComputePipeline pipeline = device.CreateComputePipeline(&csDesc);

    // Build the input and expected data.
    std::vector<uint8_t> inputData;     // The whole SSBO data
    std::vector<uint8_t> expectedData;  // The expected data to be copied by the shader
    {
        auto PushU32 = [&inputData](uint32_t u32) {
            inputData.emplace_back((u32 >> 0) & 0xff);
            inputData.emplace_back((u32 >> 8) & 0xff);
            inputData.emplace_back((u32 >> 16) & 0xff);
            inputData.emplace_back((u32 >> 24) & 0xff);
        };
        auto AlignTo = [&inputData](uint32_t alignment, uint8_t code) {
            uint32_t target = Align(inputData.size(), alignment);
            uint32_t bytes = target - inputData.size();
            for (uint32_t i = 0; i < bytes; i++) {
                inputData.emplace_back(code);
            }
        };
        PushU32(kInputHeaderCode);                  // Input.header
        AlignTo(dataAlign, kDataAlignPaddingCode);  // Input.data
        {
            PushU32(kDataHeaderCode);                      // Input.data.header
            AlignTo(field.align, kFieldAlignPaddingCode);  // Input.data.field
            for (uint32_t i = 0; i < field.size; i++) {
                // The data has the MSB cleared to distinguish it from the
                // padding codes.
                uint8_t code = i & 0x7f;
                inputData.emplace_back(code);  // Input.data.field
                expectedData.emplace_back(code);
            }
            for (uint32_t i = field.size; i < field.padded_size; i++) {
                inputData.emplace_back(kFieldSizePaddingCode);  // Input.data.field padding
            }
            PushU32(kDataFooterCode);                    // Input.data.footer
            AlignTo(field.align, kDataSizePaddingCode);  // Input.data padding
        }
        AlignTo(footerAlign, kInputFooterAlignPaddingCode);  // Input.footer @align
        PushU32(kInputFooterCode);                           // Input.footer
        AlignTo(256, kInputTailPaddingCode);                 // Input padding
    }

    // Set up input storage buffer
    wgpu::Buffer inputBuf = utils::CreateBufferFromData(
        device, inputData.data(), inputData.size(),
        wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst |
            (isUniform ? wgpu::BufferUsage::Uniform : wgpu::BufferUsage::Storage));

    // Set up output storage buffer
    wgpu::BufferDescriptor outputDesc;
    outputDesc.size = field.size;
    outputDesc.usage =
        wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst;
    wgpu::Buffer outputBuf = device.CreateBuffer(&outputDesc);

    // Set up status storage buffer
    wgpu::BufferDescriptor statusDesc;
    statusDesc.size = 4u;
    statusDesc.usage =
        wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst;
    wgpu::Buffer statusBuf = device.CreateBuffer(&statusDesc);

    // Set up bind group and issue dispatch
    wgpu::BindGroup bindGroup = utils::MakeBindGroup(device, pipeline.GetBindGroupLayout(0),
                                                     {
                                                         {0, inputBuf},
                                                         {1, outputBuf},
                                                         {2, statusBuf},
                                                     });

    wgpu::CommandBuffer commands;
    {
        wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
        wgpu::ComputePassEncoder pass = encoder.BeginComputePass();
        pass.SetPipeline(pipeline);
        pass.SetBindGroup(0, bindGroup);
        pass.DispatchWorkgroups(1);
        pass.End();

        commands = encoder.Finish();
    }

    queue.Submit(1, &commands);

    // Check the status
    EXPECT_BUFFER_U32_EQ(kStatusOk, statusBuf, 0) << "status code error" << std::endl
                                                  << "Shader: " << shader;

    // Check the data
    field.matcher(field.size, [&](uint32_t offset, uint32_t size) {
        EXPECT_BUFFER_U8_RANGE_EQ(expectedData.data() + offset, outputBuf, offset, size)
            << "offset: " << offset;
    });
}

namespace {

auto GenerateParams() {
    auto params = MakeParamGenerator<ComputeLayoutMemoryBufferTestParams>(
        {
            D3D12Backend(), MetalBackend(), VulkanBackend(),
            // TODO(crbug.com/dawn/942)
            // There was a compiler error: Buffer block cannot be expressed as any of std430,
            // std140, scalar, even with enhanced layouts. You can try flattening this block to
            // support a more flexible layout.
            // OpenGLBackend(),
            // OpenGLESBackend(),
        },
        {StorageClass::Storage, StorageClass::Uniform},
        {
            // See https://www.w3.org/TR/WGSL/#alignment-and-size
            // Scalar types with no custom alignment or size
            Field{"i32", /* align */ 4, /* size */ 4},
            Field{"u32", /* align */ 4, /* size */ 4},
            Field{"f32", /* align */ 4, /* size */ 4},

            // Scalar types with custom alignment
            Field{"i32", /* align */ 16, /* size */ 4},
            Field{"u32", /* align */ 16, /* size */ 4},
            Field{"f32", /* align */ 16, /* size */ 4},

            // Scalar types with custom size
            Field{"i32", /* align */ 4, /* size */ 4}.PaddedSize(24),
            Field{"u32", /* align */ 4, /* size */ 4}.PaddedSize(24),
            Field{"f32", /* align */ 4, /* size */ 4}.PaddedSize(24),

            // Vector types with no custom alignment or size
            Field{"vec2<i32>", /* align */ 8, /* size */ 8},
            Field{"vec2<u32>", /* align */ 8, /* size */ 8},
            Field{"vec2<f32>", /* align */ 8, /* size */ 8},
            Field{"vec3<i32>", /* align */ 16, /* size */ 12},
            Field{"vec3<u32>", /* align */ 16, /* size */ 12},
            Field{"vec3<f32>", /* align */ 16, /* size */ 12},
            Field{"vec4<i32>", /* align */ 16, /* size */ 16},
            Field{"vec4<u32>", /* align */ 16, /* size */ 16},
            Field{"vec4<f32>", /* align */ 16, /* size */ 16},

            // Vector types with custom alignment
            Field{"vec2<i32>", /* align */ 32, /* size */ 8},
            Field{"vec2<u32>", /* align */ 32, /* size */ 8},
            Field{"vec2<f32>", /* align */ 32, /* size */ 8},
            Field{"vec3<i32>", /* align */ 32, /* size */ 12},
            Field{"vec3<u32>", /* align */ 32, /* size */ 12},
            Field{"vec3<f32>", /* align */ 32, /* size */ 12},
            Field{"vec4<i32>", /* align */ 32, /* size */ 16},
            Field{"vec4<u32>", /* align */ 32, /* size */ 16},
            Field{"vec4<f32>", /* align */ 32, /* size */ 16},

            // Vector types with custom size
            Field{"vec2<i32>", /* align */ 8, /* size */ 8}.PaddedSize(24),
            Field{"vec2<u32>", /* align */ 8, /* size */ 8}.PaddedSize(24),
            Field{"vec2<f32>", /* align */ 8, /* size */ 8}.PaddedSize(24),
            Field{"vec3<i32>", /* align */ 16, /* size */ 12}.PaddedSize(24),
            Field{"vec3<u32>", /* align */ 16, /* size */ 12}.PaddedSize(24),
            Field{"vec3<f32>", /* align */ 16, /* size */ 12}.PaddedSize(24),
            Field{"vec4<i32>", /* align */ 16, /* size */ 16}.PaddedSize(24),
            Field{"vec4<u32>", /* align */ 16, /* size */ 16}.PaddedSize(24),
            Field{"vec4<f32>", /* align */ 16, /* size */ 16}.PaddedSize(24),

            // Matrix types with no custom alignment or size
            Field{"mat2x2<f32>", /* align */ 8, /* size */ 16},
            Field{"mat3x2<f32>", /* align */ 8, /* size */ 24},
            Field{"mat4x2<f32>", /* align */ 8, /* size */ 32},
            Field{"mat2x3<f32>", /* align */ 16, /* size */ 32}.Strided<12, 4>(),
            Field{"mat3x3<f32>", /* align */ 16, /* size */ 48}.Strided<12, 4>(),
            Field{"mat4x3<f32>", /* align */ 16, /* size */ 64}.Strided<12, 4>(),
            Field{"mat2x4<f32>", /* align */ 16, /* size */ 32},
            Field{"mat3x4<f32>", /* align */ 16, /* size */ 48},
            Field{"mat4x4<f32>", /* align */ 16, /* size */ 64},

            // Matrix types with custom alignment
            Field{"mat2x2<f32>", /* align */ 32, /* size */ 16},
            Field{"mat3x2<f32>", /* align */ 32, /* size */ 24},
            Field{"mat4x2<f32>", /* align */ 32, /* size */ 32},
            Field{"mat2x3<f32>", /* align */ 32, /* size */ 32}.Strided<12, 4>(),
            Field{"mat3x3<f32>", /* align */ 32, /* size */ 48}.Strided<12, 4>(),
            Field{"mat4x3<f32>", /* align */ 32, /* size */ 64}.Strided<12, 4>(),
            Field{"mat2x4<f32>", /* align */ 32, /* size */ 32},
            Field{"mat3x4<f32>", /* align */ 32, /* size */ 48},
            Field{"mat4x4<f32>", /* align */ 32, /* size */ 64},

            // Matrix types with custom size
            Field{"mat2x2<f32>", /* align */ 8, /* size */ 16}.PaddedSize(128),
            Field{"mat3x2<f32>", /* align */ 8, /* size */ 24}.PaddedSize(128),
            Field{"mat4x2<f32>", /* align */ 8, /* size */ 32}.PaddedSize(128),
            Field{"mat2x3<f32>", /* align */ 16, /* size */ 32}.PaddedSize(128).Strided<12, 4>(),
            Field{"mat3x3<f32>", /* align */ 16, /* size */ 48}.PaddedSize(128).Strided<12, 4>(),
            Field{"mat4x3<f32>", /* align */ 16, /* size */ 64}.PaddedSize(128).Strided<12, 4>(),
            Field{"mat2x4<f32>", /* align */ 16, /* size */ 32}.PaddedSize(128),
            Field{"mat3x4<f32>", /* align */ 16, /* size */ 48}.PaddedSize(128),
            Field{"mat4x4<f32>", /* align */ 16, /* size */ 64}.PaddedSize(128),

            // Array types with no custom alignment or size.
            // Note: The use of StorageBufferOnly() is due to UBOs requiring 16 byte alignment
            // of array elements. See https://www.w3.org/TR/WGSL/#storage-class-constraints
            Field{"array<u32, 1>", /* align */ 4, /* size */ 4}.StorageBufferOnly(),
            Field{"array<u32, 2>", /* align */ 4, /* size */ 8}.StorageBufferOnly(),
            Field{"array<u32, 3>", /* align */ 4, /* size */ 12}.StorageBufferOnly(),
            Field{"array<u32, 4>", /* align */ 4, /* size */ 16}.StorageBufferOnly(),
            Field{"array<vec4<u32>, 1>", /* align */ 16, /* size */ 16},
            Field{"array<vec4<u32>, 2>", /* align */ 16, /* size */ 32},
            Field{"array<vec4<u32>, 3>", /* align */ 16, /* size */ 48},
            Field{"array<vec4<u32>, 4>", /* align */ 16, /* size */ 64},
            Field{"array<vec3<u32>, 4>", /* align */ 16, /* size */ 64}.Strided<12, 4>(),

            // Array types with custom alignment
            Field{"array<u32, 1>", /* align */ 32, /* size */ 4}.StorageBufferOnly(),
            Field{"array<u32, 2>", /* align */ 32, /* size */ 8}.StorageBufferOnly(),
            Field{"array<u32, 3>", /* align */ 32, /* size */ 12}.StorageBufferOnly(),
            Field{"array<u32, 4>", /* align */ 32, /* size */ 16}.StorageBufferOnly(),
            Field{"array<vec4<u32>, 1>", /* align */ 32, /* size */ 16},
            Field{"array<vec4<u32>, 2>", /* align */ 32, /* size */ 32},
            Field{"array<vec4<u32>, 3>", /* align */ 32, /* size */ 48},
            Field{"array<vec4<u32>, 4>", /* align */ 32, /* size */ 64},
            Field{"array<vec3<u32>, 4>", /* align */ 32, /* size */ 64}.Strided<12, 4>(),

            // Array types with custom size
            Field{"array<u32, 1>", /* align */ 4, /* size */ 4}.PaddedSize(128).StorageBufferOnly(),
            Field{"array<u32, 2>", /* align */ 4, /* size */ 8}.PaddedSize(128).StorageBufferOnly(),
            Field{"array<u32, 3>", /* align */ 4, /* size */ 12}
                .PaddedSize(128)
                .StorageBufferOnly(),
            Field{"array<u32, 4>", /* align */ 4, /* size */ 16}
                .PaddedSize(128)
                .StorageBufferOnly(),
            Field{"array<vec3<u32>, 4>", /* align */ 16, /* size */ 64}
                .PaddedSize(128)
                .Strided<12, 4>(),
        });

    std::vector<ComputeLayoutMemoryBufferTestParams> filtered;
    for (auto param : params) {
        if (param.mStorageClass != StorageClass::Storage && param.mField.storage_buffer_only) {
            continue;
        }
        filtered.emplace_back(param);
    }
    return filtered;
}

INSTANTIATE_TEST_SUITE_P(,
                         ComputeLayoutMemoryBufferTests,
                         ::testing::ValuesIn(GenerateParams()),
                         DawnTestBase::PrintToStringParamName("ComputeLayoutMemoryBufferTests"));
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ComputeLayoutMemoryBufferTests);

}  // namespace
