• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "vulkan_utils.h"
16 #include "logger_common.h"
17 #include <iostream>
18 #include <dlfcn.h>
19 
20 PFN_vkCreateInstance vkCreateInstance;
21 PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
22 PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
23 PFN_vkCreateDevice vkCreateDevice;
24 PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
25 PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
26 PFN_vkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2;
27 PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
28 PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
29 PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
30 PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
31 PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2;
32 PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
33 PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
34 PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
35 PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
36 PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
37 PFN_vkCreateShaderModule vkCreateShaderModule;
38 PFN_vkCreateBuffer vkCreateBuffer;
39 PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
40 PFN_vkMapMemory vkMapMemory;
41 PFN_vkUnmapMemory vkUnmapMemory;
42 PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
43 PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
44 PFN_vkBindBufferMemory vkBindBufferMemory;
45 PFN_vkDestroyBuffer vkDestroyBuffer;
46 PFN_vkAllocateMemory vkAllocateMemory;
47 PFN_vkBindImageMemory vkBindImageMemory;
48 PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
49 PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
50 PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
51 PFN_vkCmdCopyImage vkCmdCopyImage;
52 PFN_vkCmdBlitImage vkCmdBlitImage;
53 PFN_vkCmdClearAttachments vkCmdClearAttachments;
54 PFN_vkCreateSampler vkCreateSampler;
55 PFN_vkDestroySampler vkDestroySampler;
56 PFN_vkDestroyImage vkDestroyImage;
57 PFN_vkFreeMemory vkFreeMemory;
58 PFN_vkCreateRenderPass vkCreateRenderPass;
59 PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
60 PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
61 PFN_vkCmdNextSubpass vkCmdNextSubpass;
62 PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
63 PFN_vkCmdClearColorImage vkCmdClearColorImage;
64 PFN_vkCreateImage vkCreateImage;
65 PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
66 PFN_vkCreateImageView vkCreateImageView;
67 PFN_vkDestroyImageView vkDestroyImageView;
68 PFN_vkCreateSemaphore vkCreateSemaphore;
69 PFN_vkDestroySemaphore vkDestroySemaphore;
70 PFN_vkCreateFence vkCreateFence;
71 PFN_vkDestroyFence vkDestroyFence;
72 PFN_vkWaitForFences vkWaitForFences;
73 PFN_vkResetFences vkResetFences;
74 PFN_vkResetDescriptorPool vkResetDescriptorPool;
75 PFN_vkCreateCommandPool vkCreateCommandPool;
76 PFN_vkDestroyCommandPool vkDestroyCommandPool;
77 PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
78 PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
79 PFN_vkResetCommandBuffer vkResetCommandBuffer;
80 PFN_vkEndCommandBuffer vkEndCommandBuffer;
81 PFN_vkGetDeviceQueue vkGetDeviceQueue;
82 PFN_vkQueueSubmit vkQueueSubmit;
83 PFN_vkQueueWaitIdle vkQueueWaitIdle;
84 PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
85 PFN_vkCreateFramebuffer vkCreateFramebuffer;
86 PFN_vkCreatePipelineCache vkCreatePipelineCache;
87 PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
88 PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
89 PFN_vkCreateComputePipelines vkCreateComputePipelines;
90 PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
91 PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
92 PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
93 PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
94 PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
95 PFN_vkCmdBindPipeline vkCmdBindPipeline;
96 PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
97 PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
98 PFN_vkCmdSetViewport vkCmdSetViewport;
99 PFN_vkCmdSetScissor vkCmdSetScissor;
100 PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
101 PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
102 PFN_vkCmdPushConstants vkCmdPushConstants;
103 PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
104 PFN_vkCmdDraw vkCmdDraw;
105 PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
106 PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
107 PFN_vkCmdDispatch vkCmdDispatch;
108 PFN_vkDestroyPipeline vkDestroyPipeline;
109 PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
110 PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
111 PFN_vkDestroyDevice vkDestroyDevice;
112 PFN_vkDestroyInstance vkDestroyInstance;
113 PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
114 PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
115 PFN_vkDestroyRenderPass vkDestroyRenderPass;
116 PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
117 PFN_vkDestroyShaderModule vkDestroyShaderModule;
118 PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
119 PFN_vkCreateQueryPool vkCreateQueryPool;
120 PFN_vkDestroyQueryPool vkDestroyQueryPool;
121 PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
122 PFN_vkCmdBeginQuery vkCmdBeginQuery;
123 PFN_vkCmdEndQuery vkCmdEndQuery;
124 PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
125 PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
126 
127 PFN_vkCreateSurfaceOHOS vkCreateSurfaceOHOS;
128 PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
129 PFN_vkCmdFillBuffer vkCmdFillBuffer;
130 PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
131 PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
132 PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
133 PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
134 
135 PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
136 PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
137 PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
138 PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
139 PFN_vkQueuePresentKHR vkQueuePresentKHR;
140 PFN_vkGetMemoryNativeBufferOHOS vkGetMemoryNativeBufferOHOS;
141 PFN_vkGetNativeBufferPropertiesOHOS vkGetNativeBufferPropertiesOHOS;
142 
143 void *g_libVulkan;
144 
145 namespace vkExample {
146 namespace utils {
147     // Dynamically load Vulkan library and base function pointers
LoadVulkanLibrary()148     bool LoadVulkanLibrary()
149     {
150         // Load vulkan library
151         constexpr char* path = "libvulkan.so";
152         dlerror();
153         g_libVulkan = dlopen(path, RTLD_NOW | RTLD_LOCAL);
154         if (!g_libVulkan) {
155             LOGI("Failed to load vulkan library, %{public}s", dlerror());
156             return false;
157         }
158 
159         // // Load base function pointers
160         vkEnumerateInstanceExtensionProperties = reinterpret_cast<PFN_vkEnumerateInstanceExtensionProperties>(
161             dlsym(g_libVulkan, "vkEnumerateInstanceExtensionProperties"));
162         vkEnumerateInstanceLayerProperties = reinterpret_cast<PFN_vkEnumerateInstanceLayerProperties>(
163             dlsym(g_libVulkan, "vkEnumerateInstanceLayerProperties"));
164         vkCreateInstance = reinterpret_cast<PFN_vkCreateInstance>(dlsym(g_libVulkan, "vkCreateInstance"));
165         vkGetInstanceProcAddr =
166             reinterpret_cast<PFN_vkGetInstanceProcAddr>(dlsym(g_libVulkan, "vkGetInstanceProcAddr"));
167         vkGetDeviceProcAddr = reinterpret_cast<PFN_vkGetDeviceProcAddr>(dlsym(g_libVulkan, "vkGetDeviceProcAddr"));
168 
169         return true;
170     }
171 
FreeVulkanLibrary()172     void FreeVulkanLibrary()
173     {
174         dlclose(g_libVulkan);
175     }
176     // Load instance based Vulkan function pointers
LoadVulkanFunctions(VkInstance instance)177     void LoadVulkanFunctions(VkInstance instance)
178     {
179         vkEnumeratePhysicalDevices = reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(
180             vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices"));
181         vkGetPhysicalDeviceProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(
182             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties"));
183         vkGetPhysicalDeviceProperties2 = reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2>(
184             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2"));
185         vkEnumerateDeviceLayerProperties = reinterpret_cast<PFN_vkEnumerateDeviceLayerProperties>(
186             vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties"));
187         vkEnumerateDeviceExtensionProperties = reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(
188             vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties"));
189         vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueFamilyProperties>(
190             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties"));
191         vkGetPhysicalDeviceFeatures = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures>(
192             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures"));
193         vkGetPhysicalDeviceFeatures2 = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2>(
194             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2"));
195         vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(vkGetInstanceProcAddr(instance, "vkCreateDevice"));
196         vkGetPhysicalDeviceFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceFormatProperties>(
197             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties"));
198         vkGetPhysicalDeviceMemoryProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties>(
199             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties"));
200 
201         vkCmdPipelineBarrier =
202             reinterpret_cast<PFN_vkCmdPipelineBarrier>(vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier"));
203         vkCreateShaderModule =
204             reinterpret_cast<PFN_vkCreateShaderModule>(vkGetInstanceProcAddr(instance, "vkCreateShaderModule"));
205 
206         vkCreateBuffer = reinterpret_cast<PFN_vkCreateBuffer>(vkGetInstanceProcAddr(instance, "vkCreateBuffer"));
207         vkGetBufferMemoryRequirements = reinterpret_cast<PFN_vkGetBufferMemoryRequirements>(
208             vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements"));
209         vkMapMemory = reinterpret_cast<PFN_vkMapMemory>(vkGetInstanceProcAddr(instance, "vkMapMemory"));
210         vkUnmapMemory = reinterpret_cast<PFN_vkUnmapMemory>(vkGetInstanceProcAddr(instance, "vkUnmapMemory"));
211         vkFlushMappedMemoryRanges = reinterpret_cast<PFN_vkFlushMappedMemoryRanges>(
212             vkGetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges"));
213         vkInvalidateMappedMemoryRanges = reinterpret_cast<PFN_vkInvalidateMappedMemoryRanges>(
214             vkGetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges"));
215         vkBindBufferMemory =
216             reinterpret_cast<PFN_vkBindBufferMemory>(vkGetInstanceProcAddr(instance, "vkBindBufferMemory"));
217         vkDestroyBuffer = reinterpret_cast<PFN_vkDestroyBuffer>(vkGetInstanceProcAddr(instance, "vkDestroyBuffer"));
218 
219         vkAllocateMemory =
220             reinterpret_cast<PFN_vkAllocateMemory>(vkGetInstanceProcAddr(instance, "vkAllocateMemory"));
221         vkFreeMemory = reinterpret_cast<PFN_vkFreeMemory>(vkGetInstanceProcAddr(instance, "vkFreeMemory"));
222         vkCreateRenderPass =
223             reinterpret_cast<PFN_vkCreateRenderPass>(vkGetInstanceProcAddr(instance, "vkCreateRenderPass"));
224         vkCmdBeginRenderPass =
225             reinterpret_cast<PFN_vkCmdBeginRenderPass>(vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass"));
226         vkCmdEndRenderPass =
227             reinterpret_cast<PFN_vkCmdEndRenderPass>(vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass"));
228         vkCmdNextSubpass =
229             reinterpret_cast<PFN_vkCmdNextSubpass>(vkGetInstanceProcAddr(instance, "vkCmdNextSubpass"));
230         vkCmdExecuteCommands =
231             reinterpret_cast<PFN_vkCmdExecuteCommands>(vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands"));
232         vkCmdClearColorImage =
233             reinterpret_cast<PFN_vkCmdClearColorImage>(vkGetInstanceProcAddr(instance, "vkCmdClearColorImage"));
234 
235         vkCreateImage = reinterpret_cast<PFN_vkCreateImage>(vkGetInstanceProcAddr(instance, "vkCreateImage"));
236         vkGetImageMemoryRequirements = reinterpret_cast<PFN_vkGetImageMemoryRequirements>(
237             vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements"));
238         vkCreateImageView =
239             reinterpret_cast<PFN_vkCreateImageView>(vkGetInstanceProcAddr(instance, "vkCreateImageView"));
240         vkDestroyImageView =
241             reinterpret_cast<PFN_vkDestroyImageView>(vkGetInstanceProcAddr(instance, "vkDestroyImageView"));
242         vkBindImageMemory =
243             reinterpret_cast<PFN_vkBindImageMemory>(vkGetInstanceProcAddr(instance, "vkBindImageMemory"));
244         vkGetImageSubresourceLayout = reinterpret_cast<PFN_vkGetImageSubresourceLayout>(
245             vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout"));
246         vkCmdCopyImage = reinterpret_cast<PFN_vkCmdCopyImage>(vkGetInstanceProcAddr(instance, "vkCmdCopyImage"));
247         vkCmdBlitImage = reinterpret_cast<PFN_vkCmdBlitImage>(vkGetInstanceProcAddr(instance, "vkCmdBlitImage"));
248         vkDestroyImage = reinterpret_cast<PFN_vkDestroyImage>(vkGetInstanceProcAddr(instance, "vkDestroyImage"));
249 
250         vkCmdClearAttachments =
251             reinterpret_cast<PFN_vkCmdClearAttachments>(vkGetInstanceProcAddr(instance, "vkCmdClearAttachments"));
252 
253         vkCmdCopyBuffer = reinterpret_cast<PFN_vkCmdCopyBuffer>(vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer"));
254         vkCmdCopyBufferToImage =
255             reinterpret_cast<PFN_vkCmdCopyBufferToImage>(vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage"));
256 
257         vkCreateSampler = reinterpret_cast<PFN_vkCreateSampler>(vkGetInstanceProcAddr(instance, "vkCreateSampler"));
258         vkDestroySampler =
259             reinterpret_cast<PFN_vkDestroySampler>(vkGetInstanceProcAddr(instance, "vkDestroySampler"));
260         ;
261 
262         vkCreateSemaphore =
263             reinterpret_cast<PFN_vkCreateSemaphore>(vkGetInstanceProcAddr(instance, "vkCreateSemaphore"));
264         vkDestroySemaphore =
265             reinterpret_cast<PFN_vkDestroySemaphore>(vkGetInstanceProcAddr(instance, "vkDestroySemaphore"));
266 
267         vkCreateFence = reinterpret_cast<PFN_vkCreateFence>(vkGetInstanceProcAddr(instance, "vkCreateFence"));
268         vkDestroyFence = reinterpret_cast<PFN_vkDestroyFence>(vkGetInstanceProcAddr(instance, "vkDestroyFence"));
269         vkWaitForFences = reinterpret_cast<PFN_vkWaitForFences>(vkGetInstanceProcAddr(instance, "vkWaitForFences"));
270         vkResetFences = reinterpret_cast<PFN_vkResetFences>(vkGetInstanceProcAddr(instance, "vkResetFences"));
271         ;
272         vkResetDescriptorPool =
273             reinterpret_cast<PFN_vkResetDescriptorPool>(vkGetInstanceProcAddr(instance, "vkResetDescriptorPool"));
274 
275         vkCreateCommandPool =
276             reinterpret_cast<PFN_vkCreateCommandPool>(vkGetInstanceProcAddr(instance, "vkCreateCommandPool"));
277         vkDestroyCommandPool =
278             reinterpret_cast<PFN_vkDestroyCommandPool>(vkGetInstanceProcAddr(instance, "vkDestroyCommandPool"));
279         ;
280 
281         vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>(
282             vkGetInstanceProcAddr(instance, "vkAllocateCommandBuffers"));
283         vkBeginCommandBuffer =
284             reinterpret_cast<PFN_vkBeginCommandBuffer>(vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer"));
285         vkResetCommandBuffer =
286             reinterpret_cast<PFN_vkResetCommandBuffer>(vkGetInstanceProcAddr(instance, "vkResetCommandBuffer"));
287         vkEndCommandBuffer =
288             reinterpret_cast<PFN_vkEndCommandBuffer>(vkGetInstanceProcAddr(instance, "vkEndCommandBuffer"));
289 
290         vkGetDeviceQueue =
291             reinterpret_cast<PFN_vkGetDeviceQueue>(vkGetInstanceProcAddr(instance, "vkGetDeviceQueue"));
292         vkQueueSubmit = reinterpret_cast<PFN_vkQueueSubmit>(vkGetInstanceProcAddr(instance, "vkQueueSubmit"));
293         vkQueueWaitIdle = reinterpret_cast<PFN_vkQueueWaitIdle>(vkGetInstanceProcAddr(instance, "vkQueueWaitIdle"));
294 
295         vkDeviceWaitIdle =
296             reinterpret_cast<PFN_vkDeviceWaitIdle>(vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle"));
297 
298         vkCreateFramebuffer =
299             reinterpret_cast<PFN_vkCreateFramebuffer>(vkGetInstanceProcAddr(instance, "vkCreateFramebuffer"));
300 
301         vkCreatePipelineCache =
302             reinterpret_cast<PFN_vkCreatePipelineCache>(vkGetInstanceProcAddr(instance, "vkCreatePipelineCache"));
303         vkCreatePipelineLayout =
304             reinterpret_cast<PFN_vkCreatePipelineLayout>(vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout"));
305         vkCreateGraphicsPipelines = reinterpret_cast<PFN_vkCreateGraphicsPipelines>(
306             vkGetInstanceProcAddr(instance, "vkCreateGraphicsPipelines"));
307         vkCreateComputePipelines = reinterpret_cast<PFN_vkCreateComputePipelines>(
308             vkGetInstanceProcAddr(instance, "vkCreateComputePipelines"));
309 
310         vkCreateDescriptorPool =
311             reinterpret_cast<PFN_vkCreateDescriptorPool>(vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool"));
312         vkCreateDescriptorSetLayout = reinterpret_cast<PFN_vkCreateDescriptorSetLayout>(
313             vkGetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout"));
314 
315         vkAllocateDescriptorSets = reinterpret_cast<PFN_vkAllocateDescriptorSets>(
316             vkGetInstanceProcAddr(instance, "vkAllocateDescriptorSets"));
317         vkUpdateDescriptorSets =
318             reinterpret_cast<PFN_vkUpdateDescriptorSets>(vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets"));
319 
320         vkCmdBindDescriptorSets = reinterpret_cast<PFN_vkCmdBindDescriptorSets>(
321             vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets"));
322         vkCmdBindPipeline =
323             reinterpret_cast<PFN_vkCmdBindPipeline>(vkGetInstanceProcAddr(instance, "vkCmdBindPipeline"));
324         vkCmdBindVertexBuffers =
325             reinterpret_cast<PFN_vkCmdBindVertexBuffers>(vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers"));
326         vkCmdBindIndexBuffer =
327             reinterpret_cast<PFN_vkCmdBindIndexBuffer>(vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer"));
328 
329         vkCmdSetViewport =
330             reinterpret_cast<PFN_vkCmdSetViewport>(vkGetInstanceProcAddr(instance, "vkCmdSetViewport"));
331         vkCmdSetScissor = reinterpret_cast<PFN_vkCmdSetScissor>(vkGetInstanceProcAddr(instance, "vkCmdSetScissor"));
332         vkCmdSetLineWidth =
333             reinterpret_cast<PFN_vkCmdSetLineWidth>(vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth"));
334         vkCmdSetDepthBias =
335             reinterpret_cast<PFN_vkCmdSetDepthBias>(vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias"));
336         vkCmdPushConstants =
337             reinterpret_cast<PFN_vkCmdPushConstants>(vkGetInstanceProcAddr(instance, "vkCmdPushConstants"));
338         ;
339 
340         vkCmdDrawIndexed =
341             reinterpret_cast<PFN_vkCmdDrawIndexed>(vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed"));
342         vkCmdDraw = reinterpret_cast<PFN_vkCmdDraw>(vkGetInstanceProcAddr(instance, "vkCmdDraw"));
343         vkCmdDrawIndexedIndirect = reinterpret_cast<PFN_vkCmdDrawIndexedIndirect>(
344             vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect"));
345         vkCmdDrawIndirect =
346             reinterpret_cast<PFN_vkCmdDrawIndirect>(vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect"));
347         vkCmdDispatch = reinterpret_cast<PFN_vkCmdDispatch>(vkGetInstanceProcAddr(instance, "vkCmdDispatch"));
348 
349         vkDestroyPipeline =
350             reinterpret_cast<PFN_vkDestroyPipeline>(vkGetInstanceProcAddr(instance, "vkDestroyPipeline"));
351         vkDestroyPipelineLayout = reinterpret_cast<PFN_vkDestroyPipelineLayout>(
352             vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout"));
353         ;
354         vkDestroyDescriptorSetLayout = reinterpret_cast<PFN_vkDestroyDescriptorSetLayout>(
355             vkGetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout"));
356         vkDestroyDevice = reinterpret_cast<PFN_vkDestroyDevice>(vkGetInstanceProcAddr(instance, "vkDestroyDevice"));
357         vkDestroyInstance =
358             reinterpret_cast<PFN_vkDestroyInstance>(vkGetInstanceProcAddr(instance, "vkDestroyInstance"));
359         vkDestroyDescriptorPool = reinterpret_cast<PFN_vkDestroyDescriptorPool>(
360             vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool"));
361         vkFreeCommandBuffers =
362             reinterpret_cast<PFN_vkFreeCommandBuffers>(vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers"));
363         vkDestroyRenderPass =
364             reinterpret_cast<PFN_vkDestroyRenderPass>(vkGetInstanceProcAddr(instance, "vkDestroyRenderPass"));
365         vkDestroyFramebuffer =
366             reinterpret_cast<PFN_vkDestroyFramebuffer>(vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer"));
367         vkDestroyShaderModule =
368             reinterpret_cast<PFN_vkDestroyShaderModule>(vkGetInstanceProcAddr(instance, "vkDestroyShaderModule"));
369         vkDestroyPipelineCache =
370             reinterpret_cast<PFN_vkDestroyPipelineCache>(vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache"));
371 
372         vkCreateQueryPool =
373             reinterpret_cast<PFN_vkCreateQueryPool>(vkGetInstanceProcAddr(instance, "vkCreateQueryPool"));
374         vkDestroyQueryPool =
375             reinterpret_cast<PFN_vkDestroyQueryPool>(vkGetInstanceProcAddr(instance, "vkDestroyQueryPool"));
376         vkGetQueryPoolResults =
377             reinterpret_cast<PFN_vkGetQueryPoolResults>(vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults"));
378 
379         vkCmdBeginQuery = reinterpret_cast<PFN_vkCmdBeginQuery>(vkGetInstanceProcAddr(instance, "vkCmdBeginQuery"));
380         vkCmdEndQuery = reinterpret_cast<PFN_vkCmdEndQuery>(vkGetInstanceProcAddr(instance, "vkCmdEndQuery"));
381         vkCmdResetQueryPool =
382             reinterpret_cast<PFN_vkCmdResetQueryPool>(vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool"));
383         vkCmdCopyQueryPoolResults = reinterpret_cast<PFN_vkCmdCopyQueryPoolResults>(
384             vkGetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults"));
385 
386         vkCreateSurfaceOHOS =
387             reinterpret_cast<PFN_vkCreateSurfaceOHOS>(vkGetInstanceProcAddr(instance, "vkCreateSurfaceOHOS"));
388         vkDestroySurfaceKHR =
389             reinterpret_cast<PFN_vkDestroySurfaceKHR>(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"));
390 
391         vkCmdFillBuffer = reinterpret_cast<PFN_vkCmdFillBuffer>(vkGetInstanceProcAddr(instance, "vkCmdFillBuffer"));
392         vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceSupportKHR>(
393             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"));
394         vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR>(
395             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"));
396         vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR>(
397             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"));
398         vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR>(
399             vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"));
400     }
401 
LoadVulkanFunctions(VkDevice device)402     void LoadVulkanFunctions(VkDevice device)
403     {
404         vkCreateSwapchainKHR =
405             reinterpret_cast<PFN_vkCreateSwapchainKHR>(vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR"));
406         vkDestroySwapchainKHR =
407             reinterpret_cast<PFN_vkDestroySwapchainKHR>(vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR"));
408         vkGetSwapchainImagesKHR =
409             reinterpret_cast<PFN_vkGetSwapchainImagesKHR>(vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR"));
410         vkAcquireNextImageKHR =
411             reinterpret_cast<PFN_vkAcquireNextImageKHR>(vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR"));
412         vkQueuePresentKHR =
413             reinterpret_cast<PFN_vkQueuePresentKHR>(vkGetDeviceProcAddr(device, "vkQueuePresentKHR"));
414         vkGetMemoryNativeBufferOHOS = reinterpret_cast<PFN_vkGetMemoryNativeBufferOHOS>(
415             vkGetDeviceProcAddr(device, "vkGetMemoryNativeBufferOHOS"));
416         vkGetNativeBufferPropertiesOHOS = reinterpret_cast<PFN_vkGetNativeBufferPropertiesOHOS>(
417             vkGetDeviceProcAddr(device, "vkGetNativeBufferPropertiesOHOS"));
418     }
419 } // namespace utils
420 } // namespace vkExample
421