• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_VULKAN_VULKAN_HANDLE_H_
6 #define FLUTTER_VULKAN_VULKAN_HANDLE_H_
7 
8 #include <functional>
9 
10 #include "flutter/fml/logging.h"
11 #include "flutter/fml/macros.h"
12 #include "vulkan_interface.h"
13 
14 namespace vulkan {
15 
16 template <class T>
17 class VulkanHandle {
18  public:
19   using Handle = T;
20   using Disposer = std::function<void(Handle)>;
21 
VulkanHandle()22   VulkanHandle() : handle_(VK_NULL_HANDLE) {}
23 
24   VulkanHandle(Handle handle, Disposer disposer = nullptr)
handle_(handle)25       : handle_(handle), disposer_(disposer) {}
26 
VulkanHandle(VulkanHandle && other)27   VulkanHandle(VulkanHandle&& other)
28       : handle_(other.handle_), disposer_(other.disposer_) {
29     other.handle_ = VK_NULL_HANDLE;
30     other.disposer_ = nullptr;
31   }
32 
~VulkanHandle()33   ~VulkanHandle() { DisposeIfNecessary(); }
34 
35   VulkanHandle& operator=(VulkanHandle&& other) {
36     if (handle_ != other.handle_) {
37       DisposeIfNecessary();
38     }
39 
40     handle_ = other.handle_;
41     disposer_ = other.disposer_;
42 
43     other.handle_ = VK_NULL_HANDLE;
44     other.disposer_ = nullptr;
45 
46     return *this;
47   }
48 
49   operator bool() const { return handle_ != VK_NULL_HANDLE; }
50 
Handle()51   operator Handle() const { return handle_; }
52 
53   /// Relinquish responsibility of collecting the underlying handle when this
54   /// object is collected. It is the responsibility of the caller to ensure that
55   /// the lifetime of the handle extends past the lifetime of this object.
ReleaseOwnership()56   void ReleaseOwnership() { disposer_ = nullptr; }
57 
Reset()58   void Reset() { DisposeIfNecessary(); }
59 
60  private:
61   Handle handle_;
62   Disposer disposer_;
63 
DisposeIfNecessary()64   void DisposeIfNecessary() {
65     if (handle_ == VK_NULL_HANDLE) {
66       return;
67     }
68     if (disposer_) {
69       disposer_(handle_);
70     }
71     handle_ = VK_NULL_HANDLE;
72     disposer_ = nullptr;
73   }
74 
75   FML_DISALLOW_COPY_AND_ASSIGN(VulkanHandle);
76 };
77 
78 }  // namespace vulkan
79 
80 #endif  // FLUTTER_VULKAN_VULKAN_HANDLE_H_
81