• 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_PROC_TABLE_H_
6 #define FLUTTER_VULKAN_VULKAN_PROC_TABLE_H_
7 
8 #ifdef RS_ENABLE_VK
9 #include "flutter/vulkan/vulkan_handle.h"
10 #include "flutter/vulkan/vulkan_interface.h"
11 #include "third_party/skia/include/core/SkRefCnt.h"
12 #include "third_party/skia/include/gpu/vk/GrVkBackendContext.h"
13 
14 namespace vulkan {
15 
16 class VulkanProcTable {
17  public:
18   template <class T>
19   class Proc {
20    public:
21     using Proto = T;
22 
proc_(proc)23     Proc(T proc = nullptr) : proc_(proc) {}
24 
~Proc()25     ~Proc() { proc_ = nullptr; }
26 
27     Proc operator=(T proc) {
28       proc_ = proc;
29       return *this;
30     }
31 
32     Proc operator=(PFN_vkVoidFunction proc) {
33       proc_ = reinterpret_cast<Proto>(proc);
34       return *this;
35     }
36 
37     operator bool() const { return proc_ != nullptr; }
38 
T()39     operator T() const { return proc_; }
40 
41    private:
42     T proc_;
43   };
44 
45   VulkanProcTable();
46 
47   ~VulkanProcTable();
48 
49   bool HasAcquiredMandatoryProcAddresses() const;
50 
51   bool IsValid() const;
52 
53   bool AreInstanceProcsSetup() const;
54 
55   bool AreDeviceProcsSetup() const;
56 
57   bool SetupInstanceProcAddresses(const VulkanHandle<VkInstance>& instance);
58 
59   bool SetupDeviceProcAddresses(const VulkanHandle<VkDevice>& device);
60 
61   GrVkGetProc CreateSkiaGetProc() const;
62 
63 #define DEFINE_PROC(name) Proc<PFN_vk##name> name
64 
65   DEFINE_PROC(AcquireNextImageKHR);
66   DEFINE_PROC(AllocateCommandBuffers);
67   DEFINE_PROC(AllocateMemory);
68   DEFINE_PROC(BeginCommandBuffer);
69   DEFINE_PROC(BindImageMemory);
70   DEFINE_PROC(CmdPipelineBarrier);
71   DEFINE_PROC(CreateCommandPool);
72   DEFINE_PROC(CreateDebugReportCallbackEXT);
73   DEFINE_PROC(CreateDevice);
74   DEFINE_PROC(CreateFence);
75   DEFINE_PROC(CreateImage);
76   DEFINE_PROC(CreateInstance);
77   DEFINE_PROC(CreateSemaphore);
78   DEFINE_PROC(CreateSwapchainKHR);
79   DEFINE_PROC(DestroyCommandPool);
80   DEFINE_PROC(DestroyDebugReportCallbackEXT);
81   DEFINE_PROC(DestroyDevice);
82   DEFINE_PROC(DestroyFence);
83   DEFINE_PROC(DestroyImage);
84   DEFINE_PROC(DestroyInstance);
85   DEFINE_PROC(DestroySemaphore);
86   DEFINE_PROC(DestroySurfaceKHR);
87   DEFINE_PROC(DestroySwapchainKHR);
88   DEFINE_PROC(DeviceWaitIdle);
89   DEFINE_PROC(EndCommandBuffer);
90   DEFINE_PROC(EnumerateDeviceLayerProperties);
91   DEFINE_PROC(EnumerateInstanceExtensionProperties);
92   DEFINE_PROC(EnumerateInstanceLayerProperties);
93   DEFINE_PROC(EnumeratePhysicalDevices);
94   DEFINE_PROC(FreeCommandBuffers);
95   DEFINE_PROC(FreeMemory);
96   DEFINE_PROC(GetDeviceProcAddr);
97   DEFINE_PROC(GetDeviceQueue);
98   DEFINE_PROC(GetImageMemoryRequirements);
99   DEFINE_PROC(GetInstanceProcAddr);
100   DEFINE_PROC(GetPhysicalDeviceFeatures);
101   DEFINE_PROC(GetPhysicalDeviceQueueFamilyProperties);
102   DEFINE_PROC(QueueSubmit);
103   DEFINE_PROC(QueueWaitIdle);
104   DEFINE_PROC(ResetCommandBuffer);
105   DEFINE_PROC(ResetFences);
106   DEFINE_PROC(WaitForFences);
107   DEFINE_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
108   DEFINE_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
109   DEFINE_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
110   DEFINE_PROC(GetPhysicalDeviceSurfaceSupportKHR);
111   DEFINE_PROC(GetSwapchainImagesKHR);
112   DEFINE_PROC(QueuePresentKHR);
113   DEFINE_PROC(CreateOHOSSurfaceOpenHarmony);
114 
115 #undef DEFINE_PROC
116 
117  private:
118   void* handle_;
119   bool acquired_mandatory_proc_addresses_;
120   VulkanHandle<VkInstance> instance_;
121   VulkanHandle<VkDevice> device_;
122 
123   bool OpenLibraryHandle();
124   bool SetupLoaderProcAddresses();
125   bool CloseLibraryHandle();
126   PFN_vkVoidFunction AcquireProc(
127       const char* proc_name,
128       const VulkanHandle<VkInstance>& instance) const;
129   PFN_vkVoidFunction AcquireProc(const char* proc_name,
130                                  const VulkanHandle<VkDevice>& device) const;
131 };
132 #else
133 #include "flutter/fml/macros.h"
134 #include "flutter/fml/memory/ref_counted.h"
135 #include "flutter/fml/memory/ref_ptr.h"
136 #include "flutter/vulkan/vulkan_handle.h"
137 #include "flutter/vulkan/vulkan_interface.h"
138 #include "third_party/skia/include/core/SkRefCnt.h"
139 #include "third_party/skia/include/gpu/vk/GrVkBackendContext.h"
140 
141 namespace vulkan {
142 
143 class VulkanProcTable : public fml::RefCountedThreadSafe<VulkanProcTable> {
144   FML_FRIEND_REF_COUNTED_THREAD_SAFE(VulkanProcTable);
145   FML_FRIEND_MAKE_REF_COUNTED(VulkanProcTable);
146 
147  public:
148   template <class T>
149   class Proc {
150    public:
151     using Proto = T;
152 
153     Proc(T proc = nullptr) : proc_(proc) {}
154 
155     ~Proc() { proc_ = nullptr; }
156 
157     Proc operator=(T proc) {
158       proc_ = proc;
159       return *this;
160     }
161 
162     Proc operator=(PFN_vkVoidFunction proc) {
163       proc_ = reinterpret_cast<Proto>(proc);
164       return *this;
165     }
166 
167     operator bool() const { return proc_ != nullptr; }
168 
169     operator T() const { return proc_; }
170 
171    private:
172     T proc_;
173   };
174 
175   bool HasAcquiredMandatoryProcAddresses() const;
176 
177   bool IsValid() const;
178 
179   bool AreInstanceProcsSetup() const;
180 
181   bool AreDeviceProcsSetup() const;
182 
183   bool SetupInstanceProcAddresses(const VulkanHandle<VkInstance>& instance);
184 
185   bool SetupDeviceProcAddresses(const VulkanHandle<VkDevice>& device);
186 
187   GrVkGetProc CreateSkiaGetProc() const;
188 
189 #define DEFINE_PROC(name) Proc<PFN_vk##name> name;
190 
191   DEFINE_PROC(AcquireNextImageKHR);
192   DEFINE_PROC(AllocateCommandBuffers);
193   DEFINE_PROC(AllocateMemory);
194   DEFINE_PROC(BeginCommandBuffer);
195   DEFINE_PROC(BindImageMemory);
196   DEFINE_PROC(CmdPipelineBarrier);
197   DEFINE_PROC(CreateCommandPool);
198   DEFINE_PROC(CreateDebugReportCallbackEXT);
199   DEFINE_PROC(CreateDevice);
200   DEFINE_PROC(CreateFence);
201   DEFINE_PROC(CreateImage);
202   DEFINE_PROC(CreateInstance);
203   DEFINE_PROC(CreateSemaphore);
204   DEFINE_PROC(CreateSwapchainKHR);
205   DEFINE_PROC(DestroyCommandPool);
206   DEFINE_PROC(DestroyDebugReportCallbackEXT);
207   DEFINE_PROC(DestroyDevice);
208   DEFINE_PROC(DestroyFence);
209   DEFINE_PROC(DestroyImage);
210   DEFINE_PROC(DestroyInstance);
211   DEFINE_PROC(DestroySemaphore);
212   DEFINE_PROC(DestroySurfaceKHR);
213   DEFINE_PROC(DestroySwapchainKHR);
214   DEFINE_PROC(DeviceWaitIdle);
215   DEFINE_PROC(EndCommandBuffer);
216   DEFINE_PROC(EnumerateDeviceLayerProperties);
217   DEFINE_PROC(EnumerateInstanceExtensionProperties);
218   DEFINE_PROC(EnumerateInstanceLayerProperties);
219   DEFINE_PROC(EnumeratePhysicalDevices);
220   DEFINE_PROC(FreeCommandBuffers);
221   DEFINE_PROC(FreeMemory);
222   DEFINE_PROC(GetDeviceProcAddr);
223   DEFINE_PROC(GetDeviceQueue);
224   DEFINE_PROC(GetImageMemoryRequirements);
225   DEFINE_PROC(GetInstanceProcAddr);
226   DEFINE_PROC(GetPhysicalDeviceFeatures);
227   DEFINE_PROC(GetPhysicalDeviceQueueFamilyProperties);
228   DEFINE_PROC(QueueSubmit);
229   DEFINE_PROC(QueueWaitIdle);
230   DEFINE_PROC(ResetCommandBuffer);
231   DEFINE_PROC(ResetFences);
232   DEFINE_PROC(WaitForFences);
233 #if OS_ANDROID
234   DEFINE_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
235   DEFINE_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
236   DEFINE_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
237   DEFINE_PROC(GetPhysicalDeviceSurfaceSupportKHR);
238   DEFINE_PROC(GetSwapchainImagesKHR);
239   DEFINE_PROC(QueuePresentKHR);
240   DEFINE_PROC(CreateAndroidSurfaceKHR);
241 #endif  // OS_ANDROID
242 #if OS_FUCHSIA
243   DEFINE_PROC(GetMemoryZirconHandleFUCHSIA);
244   DEFINE_PROC(ImportSemaphoreZirconHandleFUCHSIA);
245 #endif  // OS_FUCHSIA
246 
247 #undef DEFINE_PROC
248 
249  private:
250   void* handle_;
251   bool acquired_mandatory_proc_addresses_;
252   VulkanHandle<VkInstance> instance_;
253   VulkanHandle<VkDevice> device_;
254 
255   VulkanProcTable();
256   ~VulkanProcTable();
257   bool OpenLibraryHandle();
258   bool SetupLoaderProcAddresses();
259   bool CloseLibraryHandle();
260   PFN_vkVoidFunction AcquireProc(
261       const char* proc_name,
262       const VulkanHandle<VkInstance>& instance) const;
263   PFN_vkVoidFunction AcquireProc(const char* proc_name,
264                                  const VulkanHandle<VkDevice>& device) const;
265 
266   FML_DISALLOW_COPY_AND_ASSIGN(VulkanProcTable);
267 };
268 #endif  // RS_ENABLE_VK
269 }  // namespace vulkan
270 
271 #endif  // FLUTTER_VULKAN_VULKAN_PROC_TABLE_H_
272