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

#ifndef SRC_TINT_INSPECTOR_RESOURCE_BINDING_H_
#define SRC_TINT_INSPECTOR_RESOURCE_BINDING_H_

#include <cstdint>

#include "src/tint/ast/storage_texture.h"
#include "src/tint/ast/texture.h"

namespace tint {
namespace inspector {

/// Container for information about how a resource is bound
struct ResourceBinding {
  /// The dimensionality of a texture
  enum class TextureDimension {
    /// Invalid texture
    kNone = -1,
    /// 1 dimensional texture
    k1d,
    /// 2 dimensional texture
    k2d,
    /// 2 dimensional array texture
    k2dArray,
    /// 3 dimensional texture
    k3d,
    /// cube texture
    kCube,
    /// cube array texture
    kCubeArray,
  };

  /// Component type of the texture's data. Same as the Sampled Type parameter
  /// in SPIR-V OpTypeImage.
  enum class SampledKind { kUnknown = -1, kFloat, kUInt, kSInt };

  /// Enumerator of texel image formats
  enum class TexelFormat {
    kNone = -1,

    kRgba8Unorm,
    kRgba8Snorm,
    kRgba8Uint,
    kRgba8Sint,
    kRgba16Uint,
    kRgba16Sint,
    kRgba16Float,
    kR32Uint,
    kR32Sint,
    kR32Float,
    kRg32Uint,
    kRg32Sint,
    kRg32Float,
    kRgba32Uint,
    kRgba32Sint,
    kRgba32Float,
  };

  /// kXXX maps to entries returned by GetXXXResourceBindings call.
  enum class ResourceType {
    kUniformBuffer,
    kStorageBuffer,
    kReadOnlyStorageBuffer,
    kSampler,
    kComparisonSampler,
    kSampledTexture,
    kMultisampledTexture,
    kWriteOnlyStorageTexture,
    kDepthTexture,
    kDepthMultisampledTexture,
    kExternalTexture
  };

  /// Type of resource that is bound.
  ResourceType resource_type;
  /// Bind group the binding belongs
  uint32_t bind_group;
  /// Identifier to identify this binding within the bind group
  uint32_t binding;
  /// Size for this binding, in bytes, if defined.
  uint64_t size;
  /// Size for this binding without trailing structure padding, in bytes, if
  /// defined.
  uint64_t size_no_padding;
  /// Dimensionality of this binding, if defined.
  TextureDimension dim;
  /// Kind of data being sampled, if defined.
  SampledKind sampled_kind;
  /// Format of data, if defined.
  TexelFormat image_format;
};

/// Convert from internal ast::TextureDimension to public
/// ResourceBinding::TextureDimension
/// @param type_dim internal value to convert from
/// @returns the publicly visible equivalent
ResourceBinding::TextureDimension
TypeTextureDimensionToResourceBindingTextureDimension(
    const ast::TextureDimension& type_dim);

/// Infer ResourceBinding::SampledKind for a given sem::Type
/// @param base_type internal type to infer from
/// @returns the publicly visible equivalent
ResourceBinding::SampledKind BaseTypeToSampledKind(const sem::Type* base_type);

/// Convert from internal ast::TexelFormat to public
/// ResourceBinding::TexelFormat
/// @param image_format internal value to convert from
/// @returns the publicly visible equivalent
ResourceBinding::TexelFormat TypeTexelFormatToResourceBindingTexelFormat(
    const ast::TexelFormat& image_format);

}  // namespace inspector
}  // namespace tint

#endif  // SRC_TINT_INSPECTOR_RESOURCE_BINDING_H_
