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

#include "flutter/fml/macros.h"
#include "impeller/renderer/backend/vulkan/swapchain_vk.h"
#include "impeller/renderer/backend/vulkan/vk.h"
#include "impeller/renderer/surface.h"
#include "vulkan/vulkan_handles.hpp"

namespace impeller {

struct SurfaceProducerCreateInfoVK {
  vk::Device device;
  vk::Queue graphics_queue;
  vk::Queue present_queue;
  SwapchainVK* swapchain;
};

class SurfaceSyncObjectsVK {
 public:
  vk::UniqueSemaphore image_available_semaphore;
  vk::UniqueSemaphore render_finished_semaphore;
  vk::UniqueFence in_flight_fence;

  static std::unique_ptr<SurfaceSyncObjectsVK> Create(vk::Device device);
};

class SurfaceProducerVK {
 public:
  static std::unique_ptr<SurfaceProducerVK> Create(
      std::weak_ptr<Context> context,
      const SurfaceProducerCreateInfoVK& create_info);

  SurfaceProducerVK(std::weak_ptr<Context> context,
                    const SurfaceProducerCreateInfoVK& create_info);

  ~SurfaceProducerVK();

  std::unique_ptr<Surface> AcquireSurface(size_t current_frame);

  // take ownership of the command buffer until present.
  bool QueueCommandBuffer(uint32_t frame_num, vk::UniqueCommandBuffer buffer);

  void StashRP(uint32_t frame_num, vk::UniqueRenderPass data) {
    stash_rp_[frame_num].push_back(std::move(data));
  }

 private:
  std::weak_ptr<Context> context_;

  bool SetupSyncObjects();

  bool Submit(uint32_t frame_num);

  bool Present(size_t frame_num, uint32_t image_index);

  const SurfaceProducerCreateInfoVK create_info_;

  // sync objects
  std::unique_ptr<SurfaceSyncObjectsVK> sync_objects_[kMaxFramesInFlight];
  std::vector<vk::UniqueCommandBuffer> command_buffers_[kMaxFramesInFlight];
  std::vector<vk::UniqueRenderPass> stash_rp_[kMaxFramesInFlight];

  FML_DISALLOW_COPY_AND_ASSIGN(SurfaceProducerVK);
};

}  // namespace impeller
