• 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 #include "flutter/fml/macros.h"
9 #include "flutter/fml/memory/ref_counted.h"
10 #include "flutter/fml/memory/ref_ptr.h"
11 #include "flutter/vulkan/vulkan_handle.h"
12 #include "flutter/vulkan/vulkan_interface.h"
13 #include "third_party/skia/include/core/SkRefCnt.h"
14 #include "third_party/skia/include/gpu/vk/GrVkBackendContext.h"
15 
16 namespace vulkan {
17 
18 class VulkanProcTable : public fml::RefCountedThreadSafe<VulkanProcTable> {
19   FML_FRIEND_REF_COUNTED_THREAD_SAFE(VulkanProcTable);
20   FML_FRIEND_MAKE_REF_COUNTED(VulkanProcTable);
21 
22  public:
23   template <class T>
24   class Proc {
25    public:
26     using Proto = T;
27 
proc_(proc)28     Proc(T proc = nullptr) : proc_(proc) {}
29 
~Proc()30     ~Proc() { proc_ = nullptr; }
31 
32     Proc operator=(T proc) {
33       proc_ = proc;
34       return *this;
35     }
36 
37     Proc operator=(PFN_vkVoidFunction proc) {
38       proc_ = reinterpret_cast<Proto>(proc);
39       return *this;
40     }
41 
42     operator bool() const { return proc_ != nullptr; }
43 
T()44     operator T() const { return proc_; }
45 
46    private:
47     T proc_;
48   };
49 
50   bool HasAcquiredMandatoryProcAddresses() const;
51 
52   bool IsValid() const;
53 
54   bool AreInstanceProcsSetup() const;
55 
56   bool AreDeviceProcsSetup() const;
57 
58   bool SetupInstanceProcAddresses(const VulkanHandle<VkInstance>& instance);
59 
60   bool SetupDeviceProcAddresses(const VulkanHandle<VkDevice>& device);
61 
62   GrVkGetProc CreateSkiaGetProc() const;
63 
64 #define DEFINE_PROC(name) Proc<PFN_vk##name> name;
65 
66   DEFINE_PROC(AcquireNextImageKHR);
67   DEFINE_PROC(AllocateCommandBuffers);
68   DEFINE_PROC(AllocateMemory);
69   DEFINE_PROC(BeginCommandBuffer);
70   DEFINE_PROC(BindImageMemory);
71   DEFINE_PROC(CmdPipelineBarrier);
72   DEFINE_PROC(CreateCommandPool);
73   DEFINE_PROC(CreateDebugReportCallbackEXT);
74   DEFINE_PROC(CreateDevice);
75   DEFINE_PROC(CreateFence);
76   DEFINE_PROC(CreateImage);
77   DEFINE_PROC(CreateInstance);
78   DEFINE_PROC(CreateSemaphore);
79   DEFINE_PROC(CreateSwapchainKHR);
80   DEFINE_PROC(DestroyCommandPool);
81   DEFINE_PROC(DestroyDebugReportCallbackEXT);
82   DEFINE_PROC(DestroyDevice);
83   DEFINE_PROC(DestroyFence);
84   DEFINE_PROC(DestroyImage);
85   DEFINE_PROC(DestroyInstance);
86   DEFINE_PROC(DestroySemaphore);
87   DEFINE_PROC(DestroySurfaceKHR);
88   DEFINE_PROC(DestroySwapchainKHR);
89   DEFINE_PROC(DeviceWaitIdle);
90   DEFINE_PROC(EndCommandBuffer);
91   DEFINE_PROC(EnumerateDeviceLayerProperties);
92   DEFINE_PROC(EnumerateInstanceExtensionProperties);
93   DEFINE_PROC(EnumerateInstanceLayerProperties);
94   DEFINE_PROC(EnumeratePhysicalDevices);
95   DEFINE_PROC(FreeCommandBuffers);
96   DEFINE_PROC(FreeMemory);
97   DEFINE_PROC(GetDeviceProcAddr);
98   DEFINE_PROC(GetDeviceQueue);
99   DEFINE_PROC(GetImageMemoryRequirements);
100   DEFINE_PROC(GetInstanceProcAddr);
101   DEFINE_PROC(GetPhysicalDeviceFeatures);
102   DEFINE_PROC(GetPhysicalDeviceQueueFamilyProperties);
103   DEFINE_PROC(QueueSubmit);
104   DEFINE_PROC(QueueWaitIdle);
105   DEFINE_PROC(ResetCommandBuffer);
106   DEFINE_PROC(ResetFences);
107   DEFINE_PROC(WaitForFences);
108 #if OS_ANDROID
109   DEFINE_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
110   DEFINE_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
111   DEFINE_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
112   DEFINE_PROC(GetPhysicalDeviceSurfaceSupportKHR);
113   DEFINE_PROC(GetSwapchainImagesKHR);
114   DEFINE_PROC(QueuePresentKHR);
115   DEFINE_PROC(CreateAndroidSurfaceKHR);
116 #endif  // OS_ANDROID
117 #if OS_FUCHSIA
118   DEFINE_PROC(GetMemoryZirconHandleFUCHSIA);
119   DEFINE_PROC(ImportSemaphoreZirconHandleFUCHSIA);
120 #endif  // OS_FUCHSIA
121 
122 #undef DEFINE_PROC
123 
124  private:
125   void* handle_;
126   bool acquired_mandatory_proc_addresses_;
127   VulkanHandle<VkInstance> instance_;
128   VulkanHandle<VkDevice> device_;
129 
130   VulkanProcTable();
131   ~VulkanProcTable();
132   bool OpenLibraryHandle();
133   bool SetupLoaderProcAddresses();
134   bool CloseLibraryHandle();
135   PFN_vkVoidFunction AcquireProc(
136       const char* proc_name,
137       const VulkanHandle<VkInstance>& instance) const;
138   PFN_vkVoidFunction AcquireProc(const char* proc_name,
139                                  const VulkanHandle<VkDevice>& device) const;
140 
141   FML_DISALLOW_COPY_AND_ASSIGN(VulkanProcTable);
142 };
143 
144 }  // namespace vulkan
145 
146 #endif  // FLUTTER_VULKAN_VULKAN_PROC_TABLE_H_
147