// Copyright 2020 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 SRC_UI_EXAMPLES_FRAME_COMPRESSION_COMPUTE_VIEW_H_
#define SRC_UI_EXAMPLES_FRAME_COMPRESSION_COMPUTE_VIEW_H_

#include <fuchsia/sysmem/cpp/fidl.h>
#include <lib/inspect/cpp/inspect.h>
#include <lib/inspect/cpp/value_list.h>
#include <lib/inspect/cpp/vmo/types.h>

#include "base_view.h"
#include "src/lib/fxl/macros.h"
#include "src/ui/lib/escher/escher.h"
#include "src/ui/lib/escher/impl/descriptor_set_pool.h"
#include "src/ui/lib/escher/vk/texture.h"

namespace frame_compression {

// Generates compressed image data using Vulkan compute.
class ComputeView : public BaseView {
 public:
  ComputeView(scenic::ViewContext context, escher::EscherWeakPtr weak_escher, uint64_t modifier,
              uint32_t width, uint32_t height, uint32_t paint_count, FILE* png_fp,
              inspect::Node inspect_node);
  ~ComputeView() override;

 private:
  static constexpr uint32_t kNumScratchImages = 2u;

  struct Image {
    escher::SemaphorePtr acquire_semaphore;
    escher::SemaphorePtr release_semaphore;
    zx::event acquire_fence;
    zx::event release_fence;
    uint32_t image_id;
    escher::GpuMemPtr gpu_mem;
    escher::TexturePtr texture;
    escher::BufferPtr buffer;
    escher::BufferPtr host_buffer;
    uint32_t body_offset = 0;
    uint32_t base_y = 0;
    uint32_t width_in_tiles = 0;
    uint32_t height_in_tiles = 0;
    inspect::LazyNode inspect_node;
  };

  // |scenic::BaseView|
  void OnSceneInvalidated(fuchsia::images::PresentationInfo presentation_info) override;

  void RenderFrameFromColorOffset(const Image& image, uint32_t color_offset, uint32_t frame_number);

  void RenderFrameFromPng(Image& image, png_structp png, uint32_t frame_number);

  uint32_t GetNextScratchImageIndex();

  fit::promise<inspect::Inspector> PopulateStats() const;
  fit::promise<inspect::Inspector> PopulateImageStats(const Image& image);

  const escher::EscherWeakPtr escher_;
  const uint64_t modifier_;
  const uint32_t paint_count_;
  FILE* const png_fp_;
  escher::impl::DescriptorSetPool descriptor_set_pool_;
  fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_;
  Image images_[kNumImages];
  std::vector<png_bytep> row_pointers_;
  escher::ImagePtr scratch_image_;
  escher::GpuMemPtr scratch_gpu_mem_;
  vk::Buffer scratch_buffer_;
  vk::PipelineLayout pipeline_layout_;
  vk::Pipeline pipeline_;
  inspect::LazyNode inspect_node_;

  FXL_DISALLOW_COPY_AND_ASSIGN(ComputeView);
};

}  // namespace frame_compression

#endif  // SRC_UI_EXAMPLES_FRAME_COMPRESSION_COMPUTE_VIEW_H_
