// 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 <fuchsia/sysmem/cpp/fidl.h>
#include <fuchsia/ui/composition/cpp/fidl.h>
#include <lib/ui/scenic/cpp/resources.h>
#include <lib/ui/scenic/cpp/session.h>

#include <unordered_map>

#include "flutter/fml/macros.h"

#include "software_surface.h"

namespace flutter_runner {

class SoftwareSurfaceProducer final : public SurfaceProducer {
 public:
  // Only keep 12 surfaces at a time.
  static constexpr int kMaxSurfaces = 12;
  // If a surface doesn't get used for 3 or more generations, we discard it.
  static constexpr int kMaxSurfaceAge = 3;

  explicit SoftwareSurfaceProducer(scenic::Session* scenic_session);
  ~SoftwareSurfaceProducer() override;

  bool IsValid() const { return valid_; }

  // |SurfaceProducer|
  GrDirectContext* gr_context() const override { return nullptr; }

  // |SurfaceProducer|
  std::unique_ptr<SurfaceProducerSurface> ProduceOffscreenSurface(
      const SkISize& size) override;

  // |SurfaceProducer|
  std::unique_ptr<SurfaceProducerSurface> ProduceSurface(
      const SkISize& size) override;

  // |SurfaceProducer|
  void SubmitSurfaces(
      std::vector<std::unique_ptr<SurfaceProducerSurface>> surfaces) override;

 private:
  void SubmitSurface(std::unique_ptr<SurfaceProducerSurface> surface);
  std::unique_ptr<SoftwareSurface> CreateSurface(const SkISize& size);
  void RecycleSurface(std::unique_ptr<SoftwareSurface> surface);

  void RecyclePendingSurface(uintptr_t surface_key);

  void AgeAndCollectOldBuffers();

  void TraceStats();

  scenic::Session* scenic_session_;  // Legacy gfx API endpoint.
  fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_;
  fuchsia::ui::composition::AllocatorPtr flatland_allocator_;

  // These surfaces are available for re-use.
  std::vector<std::unique_ptr<SoftwareSurface>> available_surfaces_;
  // These surfaces have been written to, but scenic is not finished reading
  // from them yet.
  std::unordered_map<uintptr_t, std::unique_ptr<SoftwareSurface>>
      pending_surfaces_;

  size_t trace_surfaces_created_ = 0;
  size_t trace_surfaces_reused_ = 0;

  bool valid_ = false;

  FML_DISALLOW_COPY_AND_ASSIGN(SoftwareSurfaceProducer);
};

}  // namespace flutter_runner
