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

#include "flutter/fml/macros.h"
#include "impeller/base/backend_cast.h"
#include "impeller/renderer/pipeline.h"

namespace impeller {

class ComputePipelineMTL final
    : public Pipeline<ComputePipelineDescriptor>,
      public BackendCast<ComputePipelineMTL,
                         Pipeline<ComputePipelineDescriptor>> {
 public:
  // |Pipeline|
  ~ComputePipelineMTL() override;

  id<MTLComputePipelineState> GetMTLComputePipelineState() const;

 private:
  friend class PipelineLibraryMTL;

  id<MTLComputePipelineState> pipeline_state_;
  bool is_valid_ = false;

  ComputePipelineMTL(std::weak_ptr<PipelineLibrary> library,
                     ComputePipelineDescriptor desc,
                     id<MTLComputePipelineState> state);

  // |Pipeline|
  bool IsValid() const override;

  FML_DISALLOW_COPY_AND_ASSIGN(ComputePipelineMTL);
};

}  // namespace impeller
