// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "impeller/renderer/backend/vulkan/vertex_descriptor_vk.h"

namespace impeller {

vk::Format ToVertexDescriptorFormat(const ShaderStageIOSlot& input) {
  if (input.columns != 1) {
    // All matrix types are unsupported as vertex inputs.
    return vk::Format::eUndefined;
  }

  switch (input.type) {
    case ShaderType::kFloat: {
      if (input.bit_width == 8 * sizeof(float)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR32Sfloat;
          case 2:
            return vk::Format::eR32G32Sfloat;
          case 3:
            return vk::Format::eR32G32B32Sfloat;
          case 4:
            return vk::Format::eR32G32B32A32Sfloat;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kHalfFloat: {
      if (input.bit_width == 8 * sizeof(float) / 2) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR16Sfloat;
          case 2:
            return vk::Format::eR16G16Sfloat;
          case 3:
            return vk::Format::eR16G16B16Sfloat;
          case 4:
            return vk::Format::eR16G16B16A16Sfloat;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kDouble: {
      // Unsupported.
      return vk::Format::eUndefined;
    }
    case ShaderType::kBoolean: {
      if (input.bit_width == 8 * sizeof(bool) && input.vec_size == 1) {
        return vk::Format::eR8Uint;
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kSignedByte: {
      if (input.bit_width == 8 * sizeof(char)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR8Sint;
          case 2:
            return vk::Format::eR8G8Sint;
          case 3:
            return vk::Format::eR8G8B8Sint;
          case 4:
            return vk::Format::eR8G8B8A8Sint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kUnsignedByte: {
      if (input.bit_width == 8 * sizeof(char)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR8Uint;
          case 2:
            return vk::Format::eR8G8Uint;
          case 3:
            return vk::Format::eR8G8B8Uint;
          case 4:
            return vk::Format::eR8G8B8A8Uint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kSignedShort: {
      if (input.bit_width == 8 * sizeof(short)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR16Sint;
          case 2:
            return vk::Format::eR16G16Sint;
          case 3:
            return vk::Format::eR16G16B16Sint;
          case 4:
            return vk::Format::eR16G16B16A16Sint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kUnsignedShort: {
      if (input.bit_width == 8 * sizeof(ushort)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR16Uint;
          case 2:
            return vk::Format::eR16G16Uint;
          case 3:
            return vk::Format::eR16G16B16Uint;
          case 4:
            return vk::Format::eR16G16B16A16Uint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kSignedInt: {
      if (input.bit_width == 8 * sizeof(int32_t)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR32Sint;
          case 2:
            return vk::Format::eR32G32Sint;
          case 3:
            return vk::Format::eR32G32B32Sint;
          case 4:
            return vk::Format::eR32G32B32A32Sint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kUnsignedInt: {
      if (input.bit_width == 8 * sizeof(uint32_t)) {
        switch (input.vec_size) {
          case 1:
            return vk::Format::eR32Uint;
          case 2:
            return vk::Format::eR32G32Uint;
          case 3:
            return vk::Format::eR32G32B32Uint;
          case 4:
            return vk::Format::eR32G32B32A32Uint;
        }
      }
      return vk::Format::eUndefined;
    }
    case ShaderType::kSignedInt64: {
      // Unsupported.
      return vk::Format::eUndefined;
    }
    case ShaderType::kUnsignedInt64: {
      // Unsupported.
      return vk::Format::eUndefined;
    }
    case ShaderType::kAtomicCounter:
    case ShaderType::kStruct:
    case ShaderType::kImage:
    case ShaderType::kSampledImage:
    case ShaderType::kUnknown:
    case ShaderType::kVoid:
    case ShaderType::kSampler:
      return vk::Format::eUndefined;
  }
}

}  // namespace impeller
