// Copyright 2022 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_TRANSFORM_COMBINE_SAMPLERS_H_
#define SRC_TRANSFORM_COMBINE_SAMPLERS_H_

#include <string>
#include <unordered_map>

#include "src/sem/sampler_texture_pair.h"
#include "src/transform/transform.h"

namespace tint {
namespace transform {

/// This transform converts all separate texture/sampler refences in a
/// program into combined texture/samplers. This is required for GLSL,
/// which does not support separate texture/samplers.
///
/// It utilizes the texture/sampler information collected by the
/// Resolver and stored on each sem::Function. For each function, all
/// separate texture/sampler parameters in the function signature are
/// removed. For each unique pair, if both texture and sampler are
/// global variables, the function passes the corresponding combined
/// global stored in global_combined_texture_samplers_ at the call
/// site. Otherwise, either the texture or sampler must be a function
/// parameter. In this case, a new parameter is added to the function
/// signature. All separate texture/sampler parameters are removed.
///
/// All texture intrinsic callsites are modified to pass the combined
/// texture/sampler as the first argument, and separate texture/sampler
/// arugments are removed.
///
/// Note that the sampler may be null, indicating that only a texture
/// reference was required (e.g., textureLoad). In this case, a
/// placeholder global sampler is used at the AST level. This will be
/// combined with the original texture to give a combined global, and
/// the placeholder removed (ignored) by the GLSL writer.
///
/// Note that the combined samplers are actually represented by a
/// Texture node at the AST level, since this contains all the
/// information needed to represent a combined sampler in GLSL
/// (dimensionality, component type, etc). The GLSL writer outputs such
/// (Tint) Textures as (GLSL) Samplers.
class CombineSamplers : public Castable<CombineSamplers, Transform> {
 public:
  /// A pair of binding points.
  using SamplerTexturePair = sem::SamplerTexturePair;

  /// A map from a sampler/texture pair to a named global.
  using BindingMap = std::unordered_map<SamplerTexturePair, std::string>;

  /// The client-provided mapping from separate texture and sampler binding
  /// points to combined sampler binding point.
  struct BindingInfo : public Castable<Data, transform::Data> {
    /// Constructor
    /// @param map the map of all (texture, sampler) -> (combined) pairs
    explicit BindingInfo(const BindingMap& map);

    /// Copy constructor
    /// @param other the other BindingInfo to copy
    BindingInfo(const BindingInfo& other);

    /// Destructor
    ~BindingInfo() override;

    /// A map of bindings from (texture, sampler) -> combined sampler.
    BindingMap binding_map;
  };

  /// Constructor
  CombineSamplers();

  /// Destructor
  ~CombineSamplers() override;

 protected:
  /// The PIMPL state for this transform
  struct State;

  /// Runs the transform using the CloneContext built for transforming a
  /// program. Run() is responsible for calling Clone() on the CloneContext.
  /// @param ctx the CloneContext primed with the input program and
  /// ProgramBuilder
  /// @param inputs optional extra transform-specific input data
  /// @param outputs optional extra transform-specific output data
  void Run(CloneContext& ctx,
           const DataMap& inputs,
           DataMap& outputs) const override;
};

}  // namespace transform
}  // namespace tint

#endif  // SRC_TRANSFORM_COMBINE_SAMPLERS_H_
