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

#ifndef DAWNNATIVE_VERTEX_FORMAT_UTILS_H_
#define DAWNNATIVE_VERTEX_FORMAT_UTILS_H_

#include <array>

#include <dawn/webgpu_cpp.h>

// TODO(dawn:695): Remove the dawncpp_headers CMake dependency when VertexFormatUtils is deleted,
// assuming no other dependencies have been added in other project files.

namespace dawn {

    static constexpr std::array<wgpu::VertexFormat, 30> kAllVertexFormats = {
        wgpu::VertexFormat::Uint8x2,   wgpu::VertexFormat::Uint8x4,   wgpu::VertexFormat::Sint8x2,
        wgpu::VertexFormat::Sint8x4,   wgpu::VertexFormat::Unorm8x2,  wgpu::VertexFormat::Unorm8x4,
        wgpu::VertexFormat::Snorm8x2,  wgpu::VertexFormat::Snorm8x4,  wgpu::VertexFormat::Uint16x2,
        wgpu::VertexFormat::Uint16x4,  wgpu::VertexFormat::Unorm16x2, wgpu::VertexFormat::Unorm16x4,
        wgpu::VertexFormat::Sint16x2,  wgpu::VertexFormat::Sint16x4,  wgpu::VertexFormat::Snorm16x2,
        wgpu::VertexFormat::Snorm16x4, wgpu::VertexFormat::Float16x2, wgpu::VertexFormat::Float16x4,
        wgpu::VertexFormat::Float32,   wgpu::VertexFormat::Float32x2, wgpu::VertexFormat::Float32x3,
        wgpu::VertexFormat::Float32x4, wgpu::VertexFormat::Uint32,    wgpu::VertexFormat::Uint32x2,
        wgpu::VertexFormat::Uint32x3,  wgpu::VertexFormat::Uint32x4,  wgpu::VertexFormat::Sint32,
        wgpu::VertexFormat::Sint32x2,  wgpu::VertexFormat::Sint32x3,  wgpu::VertexFormat::Sint32x4,
    };

    static constexpr std::array<wgpu::VertexFormat, 30> kAllDeprecatedVertexFormats = {
        wgpu::VertexFormat::UChar2,      wgpu::VertexFormat::UChar4,
        wgpu::VertexFormat::Char2,       wgpu::VertexFormat::Char4,
        wgpu::VertexFormat::UChar2Norm,  wgpu::VertexFormat::UChar4Norm,
        wgpu::VertexFormat::Char2Norm,   wgpu::VertexFormat::Char4Norm,
        wgpu::VertexFormat::UShort2,     wgpu::VertexFormat::UShort4,
        wgpu::VertexFormat::UShort2Norm, wgpu::VertexFormat::UShort4Norm,
        wgpu::VertexFormat::Short2,      wgpu::VertexFormat::Short4,
        wgpu::VertexFormat::Short2Norm,  wgpu::VertexFormat::Short4Norm,
        wgpu::VertexFormat::Half2,       wgpu::VertexFormat::Half4,
        wgpu::VertexFormat::Float,       wgpu::VertexFormat::Float2,
        wgpu::VertexFormat::Float3,      wgpu::VertexFormat::Float4,
        wgpu::VertexFormat::UInt,        wgpu::VertexFormat::UInt2,
        wgpu::VertexFormat::UInt3,       wgpu::VertexFormat::UInt4,
        wgpu::VertexFormat::Int,         wgpu::VertexFormat::Int2,
        wgpu::VertexFormat::Int3,        wgpu::VertexFormat::Int4,
    };

    bool IsDeprecatedVertexFormat(wgpu::VertexFormat format);
    wgpu::VertexFormat NormalizeVertexFormat(wgpu::VertexFormat format);
    uint32_t VertexFormatNumComponents(wgpu::VertexFormat format);
    size_t VertexFormatComponentSize(wgpu::VertexFormat format);
    size_t VertexFormatSize(wgpu::VertexFormat format);

    const char* GetWGSLVertexFormatType(wgpu::VertexFormat textureFormat);

}  // namespace dawn

#endif