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