// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IMAGE_PIPE_SURFACE_H
#define IMAGE_PIPE_SURFACE_H

#include <fuchsia/images/cpp/fidl.h>
#include <vulkan/vulkan.h>

#include <vector>

namespace image_pipe_swapchain {

struct SupportedImageProperties {
  std::vector<VkSurfaceFormatKHR> formats;
};

// An abstract surface that must implement AddImage, RemoveImage, and PresentImage.
// These methods are defined as per the ImagePipe fidl interface (see image_pipe.fidl).
class ImagePipeSurface {
 public:
  ImagePipeSurface() {
    std::vector<VkSurfaceFormatKHR> formats(
        {{VK_FORMAT_B8G8R8A8_UNORM, VK_COLORSPACE_SRGB_NONLINEAR_KHR}});
    supported_image_properties_ = {formats};
  }

  virtual ~ImagePipeSurface() = default;

  SupportedImageProperties& supported_image_properties() {
    return supported_image_properties_;
  }

  virtual bool CanPresentPendingImage() { return true; }
  virtual bool UseScanoutExtension() { return false; }

  virtual bool GetSize(uint32_t* width_out, uint32_t* height_out) {
    return false;
  }

  uint32_t next_image_id() {
    if (++next_image_id_ == 0) {
      ++next_image_id_;
    }
    return next_image_id_;
  }

  virtual void AddImage(uint32_t image_id,
                        fuchsia::images::ImageInfo image_info, zx::vmo buffer,
                        uint64_t size_bytes) = 0;
  virtual void RemoveImage(uint32_t image_id) = 0;
  virtual void PresentImage(uint32_t image_id,
                            std::vector<zx::event> acquire_fences,
                            std::vector<zx::event> release_fences) = 0;

 private:
  SupportedImageProperties supported_image_properties_;
  uint32_t next_image_id_ = UINT32_MAX - 1;  // Exercise rollover
};

}  // namespace image_pipe_swapchain

#endif  // IMAGE_PIPE_SURFACE_H
