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

#pragma once

#include "flutter/fml/logging.h"
#include "flutter/fml/macros.h"
#include "impeller/base/strings.h"
#include "impeller/base/validation.h"
#include "impeller/renderer/compute_pipeline_descriptor.h"
#include "impeller/renderer/context.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/shader_library.h"
#include "impeller/renderer/vertex_descriptor.h"

namespace impeller {

//------------------------------------------------------------------------------
/// @brief      An optional (but highly recommended) utility for creating
///             pipelines from reflected shader information.
///
/// @tparam     Compute_Shader   The reflected compute shader information. Found
///                              in a generated header file called
///                              <shader_name>.comp.h.
///
template <class ComputeShader_>
struct ComputePipelineBuilder {
 public:
  using ComputeShader = ComputeShader_;

  //----------------------------------------------------------------------------
  /// @brief      Create a default pipeline descriptor using the combination
  ///             reflected shader information. The descriptor can be configured
  ///             further before a pipeline state object is created using it.
  ///
  /// @param[in]  context  The context
  ///
  /// @return     If the combination of reflected shader information is
  ///             compatible and the requisite functions can be found in the
  ///             context, a pipeline descriptor.
  ///
  static std::optional<ComputePipelineDescriptor> MakeDefaultPipelineDescriptor(
      const Context& context) {
    ComputePipelineDescriptor desc;
    if (InitializePipelineDescriptorDefaults(context, desc)) {
      return {std::move(desc)};
    } else {
      return std::nullopt;
    }
  }

  [[nodiscard]] static bool InitializePipelineDescriptorDefaults(
      const Context& context,
      ComputePipelineDescriptor& desc) {
    // Setup debug instrumentation.
    desc.SetLabel(SPrintF("%s Pipeline", ComputeShader::kLabel.data()));

    // Resolve pipeline entrypoints.
    {
      auto compute_function = context.GetShaderLibrary()->GetFunction(
          ComputeShader::kEntrypointName, ShaderStage::kCompute);

      if (!compute_function) {
        VALIDATION_LOG << "Could not resolve compute pipeline entrypoint '"
                       << ComputeShader::kEntrypointName
                       << "' for pipeline named '" << ComputeShader::kLabel
                       << "'.";
        return false;
      }

      desc.SetStageEntrypoint(std::move(compute_function));
    }
    return true;
  }
};

}  // namespace impeller
