// 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_SCENIC_LIB_FLATLAND_RENDERER_BUFFER_COLLECTION_H_
#define SRC_UI_SCENIC_LIB_FLATLAND_RENDERER_BUFFER_COLLECTION_H_

#include <fuchsia/images/cpp/fidl.h>
#include <lib/fitx/result.h>
#include <lib/syslog/cpp/macros.h>

#include <memory>

namespace flatland {

using BufferCollectionHandle = fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>;

// |BufferCollectionInfo| stores the information regarding a BufferCollection.
// Instantiated via calls to |New| below.
class BufferCollectionInfo {
 public:
  // Creates a new |BufferCollectionInfo| instance. The return value is null if the buffer was
  // not created successfully. This function sets the server-side sysmem image constraints.
  //
  // TODO(fxbug.dev/48210): Make this an asynchronous call. This function is currently thread safe as
  // Allocator_Sync pointers are thread safe, but if this becomes async it may become unsafe.
  static fitx::result<fitx::failed, BufferCollectionInfo> New(
      fuchsia::sysmem::Allocator_Sync* sysmem_allocator,
      BufferCollectionHandle buffer_collection_token);

  // Creates a non-initialized instance of this class. Fully initialized instances must
  // be created via a call to |New|.
  BufferCollectionInfo() = default;

  // This BufferCollectionInfo may not be allocated due to the fact that it may not necessarily
  // have all constraints set from every client with a token. This function will return false if
  // that is the case and true if the buffer collection has actually been allocated. Additionally,
  // if this function returns true, the client will be able to access the sysmem information of
  // the collection via a call to GetSysmemInfo(). Once this function returns true, it won't ever
  // return |false| again.
  //
  // This function is thread-safe because |buffer_collection_ptr_|, which is a
  // SynchronousInterfacePtr, is thread-safe. This function will return false if the buffers are not
  // able to be constructed, for example if there are incompatible constraints that are set on the
  // server and client.
  bool BuffersAreAllocated();

  // Info describing |buffer_collection_ptr|. Do not call this until after verifying the allocation
  // status of the buffer collection with BuffersAreAllocated().
  const fuchsia::sysmem::BufferCollectionInfo_2& GetSysmemInfo() const {
    // DCHECK if the struct is uninitialized.
    FX_DCHECK(buffer_collection_info_.buffer_count >= 1);
    return buffer_collection_info_;
  }

 private:
  BufferCollectionInfo(fuchsia::sysmem::BufferCollectionSyncPtr buffer_collection_ptr)
      : buffer_collection_ptr_(std::move(buffer_collection_ptr)) {}

  fuchsia::sysmem::BufferCollectionSyncPtr buffer_collection_ptr_;
  fuchsia::sysmem::BufferCollectionInfo_2 buffer_collection_info_;
};

}  // namespace flatland

#endif  // SRC_UI_SCENIC_LIB_FLATLAND_RENDERER_BUFFER_COLLECTION_H_
