// 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/tint/reader/spirv/enum_converter.h"

namespace tint {
namespace reader {
namespace spirv {

EnumConverter::EnumConverter(const FailStream& fs) : fail_stream_(fs) {}

EnumConverter::~EnumConverter() = default;

ast::PipelineStage EnumConverter::ToPipelineStage(SpvExecutionModel model) {
  switch (model) {
    case SpvExecutionModelVertex:
      return ast::PipelineStage::kVertex;
    case SpvExecutionModelFragment:
      return ast::PipelineStage::kFragment;
    case SpvExecutionModelGLCompute:
      return ast::PipelineStage::kCompute;
    default:
      break;
  }

  Fail() << "unknown SPIR-V execution model: " << uint32_t(model);
  return ast::PipelineStage::kNone;
}

ast::StorageClass EnumConverter::ToStorageClass(const SpvStorageClass sc) {
  switch (sc) {
    case SpvStorageClassInput:
      return ast::StorageClass::kInput;
    case SpvStorageClassOutput:
      return ast::StorageClass::kOutput;
    case SpvStorageClassUniform:
      return ast::StorageClass::kUniform;
    case SpvStorageClassWorkgroup:
      return ast::StorageClass::kWorkgroup;
    case SpvStorageClassUniformConstant:
      return ast::StorageClass::kNone;
    case SpvStorageClassStorageBuffer:
      return ast::StorageClass::kStorage;
    case SpvStorageClassPrivate:
      return ast::StorageClass::kPrivate;
    case SpvStorageClassFunction:
      return ast::StorageClass::kFunction;
    default:
      break;
  }

  Fail() << "unknown SPIR-V storage class: " << uint32_t(sc);
  return ast::StorageClass::kInvalid;
}

ast::Builtin EnumConverter::ToBuiltin(SpvBuiltIn b) {
  switch (b) {
    case SpvBuiltInPosition:
      return ast::Builtin::kPosition;
    case SpvBuiltInVertexIndex:
      return ast::Builtin::kVertexIndex;
    case SpvBuiltInInstanceIndex:
      return ast::Builtin::kInstanceIndex;
    case SpvBuiltInFrontFacing:
      return ast::Builtin::kFrontFacing;
    case SpvBuiltInFragCoord:
      return ast::Builtin::kPosition;
    case SpvBuiltInFragDepth:
      return ast::Builtin::kFragDepth;
    case SpvBuiltInLocalInvocationId:
      return ast::Builtin::kLocalInvocationId;
    case SpvBuiltInLocalInvocationIndex:
      return ast::Builtin::kLocalInvocationIndex;
    case SpvBuiltInGlobalInvocationId:
      return ast::Builtin::kGlobalInvocationId;
    case SpvBuiltInWorkgroupId:
      return ast::Builtin::kWorkgroupId;
    case SpvBuiltInSampleId:
      return ast::Builtin::kSampleIndex;
    case SpvBuiltInSampleMask:
      return ast::Builtin::kSampleMask;
    default:
      break;
  }

  Fail() << "unknown SPIR-V builtin: " << uint32_t(b);
  return ast::Builtin::kNone;
}

ast::TextureDimension EnumConverter::ToDim(SpvDim dim, bool arrayed) {
  if (arrayed) {
    switch (dim) {
      case SpvDim2D:
        return ast::TextureDimension::k2dArray;
      case SpvDimCube:
        return ast::TextureDimension::kCubeArray;
      default:
        break;
    }
    Fail() << "arrayed dimension must be 2D or Cube. Got " << int(dim);
    return ast::TextureDimension::kNone;
  }
  // Assume non-arrayed
  switch (dim) {
    case SpvDim1D:
      return ast::TextureDimension::k1d;
    case SpvDim2D:
      return ast::TextureDimension::k2d;
    case SpvDim3D:
      return ast::TextureDimension::k3d;
    case SpvDimCube:
      return ast::TextureDimension::kCube;
    default:
      break;
  }
  Fail() << "invalid dimension: " << int(dim);
  return ast::TextureDimension::kNone;
}

ast::TexelFormat EnumConverter::ToTexelFormat(SpvImageFormat fmt) {
  switch (fmt) {
    case SpvImageFormatUnknown:
      return ast::TexelFormat::kNone;

    // 8 bit channels
    case SpvImageFormatRgba8:
      return ast::TexelFormat::kRgba8Unorm;
    case SpvImageFormatRgba8Snorm:
      return ast::TexelFormat::kRgba8Snorm;
    case SpvImageFormatRgba8ui:
      return ast::TexelFormat::kRgba8Uint;
    case SpvImageFormatRgba8i:
      return ast::TexelFormat::kRgba8Sint;

    // 16 bit channels
    case SpvImageFormatRgba16ui:
      return ast::TexelFormat::kRgba16Uint;
    case SpvImageFormatRgba16i:
      return ast::TexelFormat::kRgba16Sint;
    case SpvImageFormatRgba16f:
      return ast::TexelFormat::kRgba16Float;

    // 32 bit channels
    case SpvImageFormatR32ui:
      return ast::TexelFormat::kR32Uint;
    case SpvImageFormatR32i:
      return ast::TexelFormat::kR32Sint;
    case SpvImageFormatR32f:
      return ast::TexelFormat::kR32Float;
    case SpvImageFormatRg32ui:
      return ast::TexelFormat::kRg32Uint;
    case SpvImageFormatRg32i:
      return ast::TexelFormat::kRg32Sint;
    case SpvImageFormatRg32f:
      return ast::TexelFormat::kRg32Float;
    case SpvImageFormatRgba32ui:
      return ast::TexelFormat::kRgba32Uint;
    case SpvImageFormatRgba32i:
      return ast::TexelFormat::kRgba32Sint;
    case SpvImageFormatRgba32f:
      return ast::TexelFormat::kRgba32Float;
    default:
      break;
  }
  Fail() << "invalid image format: " << int(fmt);
  return ast::TexelFormat::kNone;
}

}  // namespace spirv
}  // namespace reader
}  // namespace tint
