// Copyright 2017 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 LIB_ESCHER_RESOURCES_RESOURCE_H_
#define LIB_ESCHER_RESOURCES_RESOURCE_H_

#include "lib/escher/base/ownable.h"
#include "lib/escher/base/owner.h"
#include "lib/escher/forward_declarations.h"
#include "lib/escher/resources/resource_type_info.h"
#include "lib/escher/vk/vulkan_context.h"

namespace escher {

namespace impl {
class CommandBuffer;
}  // namespace impl

class ResourceManager;

// Base class for any resource that must be kept alive until all CommandBuffers
// that reference it have finished executing.
class Resource : public Ownable<Resource, ResourceTypeInfo> {
 public:
  static const ResourceTypeInfo kTypeInfo;
  const ResourceTypeInfo& type_info() const override { return kTypeInfo; }

  // Return the sequence number of the last CommandBuffer that this resource is
  // referenced by.
  uint64_t sequence_number() const { return sequence_number_; }

  // Convenient wrapper around superclass implementation of owner(), since we
  // know that our owner (if any) is always a ResourceManager.
  ResourceManager* owner() const;

  // Return our ResourceManager's VulkanContext.
  const VulkanContext& vulkan_context() const;
  vk::Device vk_device() const { return vulkan_context().device; }
  Escher* escher() { return escher_; }

  // Return a unique ID, not shared with any other Resource.
  uint64_t uid() const { return uid_; }

 protected:
  explicit Resource(ResourceManager* owner);

  // Keep the resource alive until all CommandBuffers up to the specified
  // sequence number have finished executing.
  void KeepAlive(uint64_t seq_num) {
    sequence_number_ = seq_num > sequence_number_ ? seq_num : sequence_number_;
  }

  // Support CommandBuffer::KeepAlive().
  friend class impl::CommandBuffer;

 private:
  // Each resource gets a unique id.
  static uint64_t GetUniqueId();

  Escher* const escher_;
  const uint64_t uid_;
  uint64_t sequence_number_ = 0;

  FXL_DISALLOW_COPY_AND_ASSIGN(Resource);
};

typedef fxl::RefPtr<Resource> ResourcePtr;

}  // namespace escher

#endif  // LIB_ESCHER_RESOURCES_RESOURCE_H_
