driver_gen.cpp revision cd8ad33289b74243e21a776a5a9170c845d990c4
1/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// WARNING: This file is generated. See ../README.md for instructions.
18
19#include <string.h>
20
21#include <algorithm>
22
23#include <log/log.h>
24
25#include "driver.h"
26
27namespace vulkan {
28namespace driver {
29
30namespace {
31
32// clang-format off
33
34VKAPI_ATTR VkResult checkedCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) {
35    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
36        return CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
37    } else {
38        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkCreateSwapchainKHR not executed.");
39        return VK_SUCCESS;
40    }
41}
42
43VKAPI_ATTR void checkedDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) {
44    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
45        DestroySwapchainKHR(device, swapchain, pAllocator);
46    } else {
47        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkDestroySwapchainKHR not executed.");
48    }
49}
50
51VKAPI_ATTR VkResult checkedGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) {
52    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
53        return GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
54    } else {
55        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkGetSwapchainImagesKHR not executed.");
56        return VK_SUCCESS;
57    }
58}
59
60VKAPI_ATTR VkResult checkedAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex) {
61    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
62        return AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
63    } else {
64        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkAcquireNextImageKHR not executed.");
65        return VK_SUCCESS;
66    }
67}
68
69VKAPI_ATTR VkResult checkedQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) {
70    if (GetData(queue).hook_extensions[ProcHook::KHR_swapchain]) {
71        return QueuePresentKHR(queue, pPresentInfo);
72    } else {
73        Logger(queue).Err(queue, "VK_KHR_swapchain not enabled. vkQueuePresentKHR not executed.");
74        return VK_SUCCESS;
75    }
76}
77
78VKAPI_ATTR VkResult checkedGetDeviceGroupPresentCapabilitiesKHR(VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
79    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
80        return GetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities);
81    } else {
82        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkGetDeviceGroupPresentCapabilitiesKHR not executed.");
83        return VK_SUCCESS;
84    }
85}
86
87VKAPI_ATTR VkResult checkedGetDeviceGroupSurfacePresentModesKHR(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes) {
88    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
89        return GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
90    } else {
91        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkGetDeviceGroupSurfacePresentModesKHR not executed.");
92        return VK_SUCCESS;
93    }
94}
95
96VKAPI_ATTR VkResult checkedAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex) {
97    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
98        return AcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
99    } else {
100        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkAcquireNextImage2KHR not executed.");
101        return VK_SUCCESS;
102    }
103}
104
105VKAPI_ATTR VkResult checkedGetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) {
106    if (GetData(device).hook_extensions[ProcHook::GOOGLE_display_timing]) {
107        return GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
108    } else {
109        Logger(device).Err(device, "VK_GOOGLE_display_timing not enabled. vkGetRefreshCycleDurationGOOGLE not executed.");
110        return VK_SUCCESS;
111    }
112}
113
114VKAPI_ATTR VkResult checkedGetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) {
115    if (GetData(device).hook_extensions[ProcHook::GOOGLE_display_timing]) {
116        return GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
117    } else {
118        Logger(device).Err(device, "VK_GOOGLE_display_timing not enabled. vkGetPastPresentationTimingGOOGLE not executed.");
119        return VK_SUCCESS;
120    }
121}
122
123VKAPI_ATTR void checkedSetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata) {
124    if (GetData(device).hook_extensions[ProcHook::EXT_hdr_metadata]) {
125        SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
126    } else {
127        Logger(device).Err(device, "VK_EXT_hdr_metadata not enabled. vkSetHdrMetadataEXT not executed.");
128    }
129}
130
131VKAPI_ATTR VkResult checkedGetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR swapchain) {
132    if (GetData(device).hook_extensions[ProcHook::KHR_shared_presentable_image]) {
133        return GetSwapchainStatusKHR(device, swapchain);
134    } else {
135        Logger(device).Err(device, "VK_KHR_shared_presentable_image not enabled. vkGetSwapchainStatusKHR not executed.");
136        return VK_SUCCESS;
137    }
138}
139
140// clang-format on
141
142const ProcHook g_proc_hooks[] = {
143    // clang-format off
144    {
145        "vkAcquireImageANDROID",
146        ProcHook::DEVICE,
147        ProcHook::ANDROID_native_buffer,
148        nullptr,
149        nullptr,
150    },
151    {
152        "vkAcquireNextImage2KHR",
153        ProcHook::DEVICE,
154        ProcHook::KHR_swapchain,
155        reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImage2KHR),
156        reinterpret_cast<PFN_vkVoidFunction>(checkedAcquireNextImage2KHR),
157    },
158    {
159        "vkAcquireNextImageKHR",
160        ProcHook::DEVICE,
161        ProcHook::KHR_swapchain,
162        reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR),
163        reinterpret_cast<PFN_vkVoidFunction>(checkedAcquireNextImageKHR),
164    },
165    {
166        "vkAllocateCommandBuffers",
167        ProcHook::DEVICE,
168        ProcHook::EXTENSION_CORE,
169        reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers),
170        nullptr,
171    },
172    {
173        "vkCreateAndroidSurfaceKHR",
174        ProcHook::INSTANCE,
175        ProcHook::KHR_android_surface,
176        reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR),
177        nullptr,
178    },
179    {
180        "vkCreateDebugReportCallbackEXT",
181        ProcHook::INSTANCE,
182        ProcHook::EXT_debug_report,
183        reinterpret_cast<PFN_vkVoidFunction>(CreateDebugReportCallbackEXT),
184        nullptr,
185    },
186    {
187        "vkCreateDevice",
188        ProcHook::INSTANCE,
189        ProcHook::EXTENSION_CORE,
190        reinterpret_cast<PFN_vkVoidFunction>(CreateDevice),
191        nullptr,
192    },
193    {
194        "vkCreateInstance",
195        ProcHook::GLOBAL,
196        ProcHook::EXTENSION_CORE,
197        reinterpret_cast<PFN_vkVoidFunction>(CreateInstance),
198        nullptr,
199    },
200    {
201        "vkCreateSwapchainKHR",
202        ProcHook::DEVICE,
203        ProcHook::KHR_swapchain,
204        reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR),
205        reinterpret_cast<PFN_vkVoidFunction>(checkedCreateSwapchainKHR),
206    },
207    {
208        "vkDebugReportMessageEXT",
209        ProcHook::INSTANCE,
210        ProcHook::EXT_debug_report,
211        reinterpret_cast<PFN_vkVoidFunction>(DebugReportMessageEXT),
212        nullptr,
213    },
214    {
215        "vkDestroyDebugReportCallbackEXT",
216        ProcHook::INSTANCE,
217        ProcHook::EXT_debug_report,
218        reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugReportCallbackEXT),
219        nullptr,
220    },
221    {
222        "vkDestroyDevice",
223        ProcHook::DEVICE,
224        ProcHook::EXTENSION_CORE,
225        reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice),
226        nullptr,
227    },
228    {
229        "vkDestroyInstance",
230        ProcHook::INSTANCE,
231        ProcHook::EXTENSION_CORE,
232        reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance),
233        nullptr,
234    },
235    {
236        "vkDestroySurfaceKHR",
237        ProcHook::INSTANCE,
238        ProcHook::KHR_surface,
239        reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR),
240        nullptr,
241    },
242    {
243        "vkDestroySwapchainKHR",
244        ProcHook::DEVICE,
245        ProcHook::KHR_swapchain,
246        reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR),
247        reinterpret_cast<PFN_vkVoidFunction>(checkedDestroySwapchainKHR),
248    },
249    {
250        "vkEnumerateDeviceExtensionProperties",
251        ProcHook::INSTANCE,
252        ProcHook::EXTENSION_CORE,
253        reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
254        nullptr,
255    },
256    {
257        "vkEnumerateInstanceExtensionProperties",
258        ProcHook::GLOBAL,
259        ProcHook::EXTENSION_CORE,
260        reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties),
261        nullptr,
262    },
263    {
264        "vkEnumeratePhysicalDeviceGroups",
265        ProcHook::INSTANCE,
266        ProcHook::EXTENSION_CORE,
267        reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDeviceGroups),
268        nullptr,
269    },
270    {
271        "vkEnumeratePhysicalDevices",
272        ProcHook::INSTANCE,
273        ProcHook::EXTENSION_CORE,
274        reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices),
275        nullptr,
276    },
277    {
278        "vkGetDeviceGroupPresentCapabilitiesKHR",
279        ProcHook::DEVICE,
280        ProcHook::KHR_swapchain,
281        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceGroupPresentCapabilitiesKHR),
282        reinterpret_cast<PFN_vkVoidFunction>(checkedGetDeviceGroupPresentCapabilitiesKHR),
283    },
284    {
285        "vkGetDeviceGroupSurfacePresentModesKHR",
286        ProcHook::DEVICE,
287        ProcHook::KHR_swapchain,
288        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceGroupSurfacePresentModesKHR),
289        reinterpret_cast<PFN_vkVoidFunction>(checkedGetDeviceGroupSurfacePresentModesKHR),
290    },
291    {
292        "vkGetDeviceProcAddr",
293        ProcHook::DEVICE,
294        ProcHook::EXTENSION_CORE,
295        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr),
296        nullptr,
297    },
298    {
299        "vkGetDeviceQueue",
300        ProcHook::DEVICE,
301        ProcHook::EXTENSION_CORE,
302        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue),
303        nullptr,
304    },
305    {
306        "vkGetDeviceQueue2",
307        ProcHook::DEVICE,
308        ProcHook::EXTENSION_CORE,
309        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue2),
310        nullptr,
311    },
312    {
313        "vkGetInstanceProcAddr",
314        ProcHook::INSTANCE,
315        ProcHook::EXTENSION_CORE,
316        reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr),
317        nullptr,
318    },
319    {
320        "vkGetPastPresentationTimingGOOGLE",
321        ProcHook::DEVICE,
322        ProcHook::GOOGLE_display_timing,
323        reinterpret_cast<PFN_vkVoidFunction>(GetPastPresentationTimingGOOGLE),
324        reinterpret_cast<PFN_vkVoidFunction>(checkedGetPastPresentationTimingGOOGLE),
325    },
326    {
327        "vkGetPhysicalDevicePresentRectanglesKHR",
328        ProcHook::INSTANCE,
329        ProcHook::KHR_swapchain,
330        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDevicePresentRectanglesKHR),
331        nullptr,
332    },
333    {
334        "vkGetPhysicalDeviceSurfaceCapabilities2KHR",
335        ProcHook::INSTANCE,
336        ProcHook::KHR_get_surface_capabilities2,
337        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilities2KHR),
338        nullptr,
339    },
340    {
341        "vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
342        ProcHook::INSTANCE,
343        ProcHook::KHR_surface,
344        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR),
345        nullptr,
346    },
347    {
348        "vkGetPhysicalDeviceSurfaceFormats2KHR",
349        ProcHook::INSTANCE,
350        ProcHook::KHR_get_surface_capabilities2,
351        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormats2KHR),
352        nullptr,
353    },
354    {
355        "vkGetPhysicalDeviceSurfaceFormatsKHR",
356        ProcHook::INSTANCE,
357        ProcHook::KHR_surface,
358        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR),
359        nullptr,
360    },
361    {
362        "vkGetPhysicalDeviceSurfacePresentModesKHR",
363        ProcHook::INSTANCE,
364        ProcHook::KHR_surface,
365        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR),
366        nullptr,
367    },
368    {
369        "vkGetPhysicalDeviceSurfaceSupportKHR",
370        ProcHook::INSTANCE,
371        ProcHook::KHR_surface,
372        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR),
373        nullptr,
374    },
375    {
376        "vkGetRefreshCycleDurationGOOGLE",
377        ProcHook::DEVICE,
378        ProcHook::GOOGLE_display_timing,
379        reinterpret_cast<PFN_vkVoidFunction>(GetRefreshCycleDurationGOOGLE),
380        reinterpret_cast<PFN_vkVoidFunction>(checkedGetRefreshCycleDurationGOOGLE),
381    },
382    {
383        "vkGetSwapchainGrallocUsage2ANDROID",
384        ProcHook::DEVICE,
385        ProcHook::ANDROID_native_buffer,
386        nullptr,
387        nullptr,
388    },
389    {
390        "vkGetSwapchainGrallocUsageANDROID",
391        ProcHook::DEVICE,
392        ProcHook::ANDROID_native_buffer,
393        nullptr,
394        nullptr,
395    },
396    {
397        "vkGetSwapchainImagesKHR",
398        ProcHook::DEVICE,
399        ProcHook::KHR_swapchain,
400        reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR),
401        reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainImagesKHR),
402    },
403    {
404        "vkGetSwapchainStatusKHR",
405        ProcHook::DEVICE,
406        ProcHook::KHR_shared_presentable_image,
407        reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainStatusKHR),
408        reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainStatusKHR),
409    },
410    {
411        "vkQueuePresentKHR",
412        ProcHook::DEVICE,
413        ProcHook::KHR_swapchain,
414        reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR),
415        reinterpret_cast<PFN_vkVoidFunction>(checkedQueuePresentKHR),
416    },
417    {
418        "vkQueueSignalReleaseImageANDROID",
419        ProcHook::DEVICE,
420        ProcHook::ANDROID_native_buffer,
421        nullptr,
422        nullptr,
423    },
424    {
425        "vkSetHdrMetadataEXT",
426        ProcHook::DEVICE,
427        ProcHook::EXT_hdr_metadata,
428        reinterpret_cast<PFN_vkVoidFunction>(SetHdrMetadataEXT),
429        reinterpret_cast<PFN_vkVoidFunction>(checkedSetHdrMetadataEXT),
430    },
431    // clang-format on
432};
433
434}  // namespace
435
436const ProcHook* GetProcHook(const char* name) {
437    const auto& begin = g_proc_hooks;
438    const auto& end =
439        g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
440    const auto hook = std::lower_bound(
441        begin, end, name,
442        [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
443    return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
444}
445
446ProcHook::Extension GetProcHookExtension(const char* name) {
447    // clang-format off
448    if (strcmp(name, "VK_ANDROID_native_buffer") == 0) return ProcHook::ANDROID_native_buffer;
449    if (strcmp(name, "VK_EXT_debug_report") == 0) return ProcHook::EXT_debug_report;
450    if (strcmp(name, "VK_EXT_hdr_metadata") == 0) return ProcHook::EXT_hdr_metadata;
451    if (strcmp(name, "VK_EXT_swapchain_colorspace") == 0) return ProcHook::EXT_swapchain_colorspace;
452    if (strcmp(name, "VK_GOOGLE_display_timing") == 0) return ProcHook::GOOGLE_display_timing;
453    if (strcmp(name, "VK_KHR_android_surface") == 0) return ProcHook::KHR_android_surface;
454    if (strcmp(name, "VK_KHR_incremental_present") == 0) return ProcHook::KHR_incremental_present;
455    if (strcmp(name, "VK_KHR_shared_presentable_image") == 0) return ProcHook::KHR_shared_presentable_image;
456    if (strcmp(name, "VK_KHR_surface") == 0) return ProcHook::KHR_surface;
457    if (strcmp(name, "VK_KHR_swapchain") == 0) return ProcHook::KHR_swapchain;
458    if (strcmp(name, "VK_KHR_get_surface_capabilities2") == 0) return ProcHook::KHR_get_surface_capabilities2;
459    if (strcmp(name, "VK_KHR_get_physical_device_properties2") == 0) return ProcHook::KHR_get_physical_device_properties2;
460    // clang-format on
461    return ProcHook::EXTENSION_UNKNOWN;
462}
463
464#define UNLIKELY(expr) __builtin_expect((expr), 0)
465
466#define INIT_PROC(required, obj, proc)                                 \
467    do {                                                               \
468        data.driver.proc =                                             \
469            reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
470        if (UNLIKELY(required && !data.driver.proc)) {                 \
471            ALOGE("missing " #obj " proc: vk" #proc);                  \
472            success = false;                                           \
473        }                                                              \
474    } while (0)
475
476#define INIT_PROC_EXT(ext, required, obj, proc) \
477    do {                                        \
478        if (extensions[ProcHook::ext])          \
479            INIT_PROC(required, obj, proc);     \
480    } while (0)
481
482bool InitDriverTable(VkInstance instance,
483                     PFN_vkGetInstanceProcAddr get_proc,
484                     const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
485    auto& data = GetData(instance);
486    bool success = true;
487
488    // clang-format off
489    INIT_PROC(true, instance, DestroyInstance);
490    INIT_PROC(true, instance, EnumeratePhysicalDevices);
491    INIT_PROC(true, instance, GetInstanceProcAddr);
492    INIT_PROC(true, instance, GetPhysicalDeviceProperties);
493    INIT_PROC(true, instance, CreateDevice);
494    INIT_PROC(true, instance, EnumerateDeviceExtensionProperties);
495    INIT_PROC(false, instance, EnumeratePhysicalDeviceGroups);
496    INIT_PROC_EXT(EXT_debug_report, true, instance, CreateDebugReportCallbackEXT);
497    INIT_PROC_EXT(EXT_debug_report, true, instance, DestroyDebugReportCallbackEXT);
498    INIT_PROC_EXT(EXT_debug_report, true, instance, DebugReportMessageEXT);
499    INIT_PROC_EXT(KHR_get_physical_device_properties2, true, instance, GetPhysicalDeviceProperties2KHR);
500    // clang-format on
501
502    return success;
503}
504
505bool InitDriverTable(VkDevice dev,
506                     PFN_vkGetDeviceProcAddr get_proc,
507                     const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
508    auto& data = GetData(dev);
509    bool success = true;
510
511    // clang-format off
512    INIT_PROC(true, dev, GetDeviceProcAddr);
513    INIT_PROC(true, dev, DestroyDevice);
514    INIT_PROC(true, dev, GetDeviceQueue);
515    INIT_PROC(true, dev, CreateImage);
516    INIT_PROC(true, dev, DestroyImage);
517    INIT_PROC(true, dev, AllocateCommandBuffers);
518    INIT_PROC(false, dev, GetDeviceQueue2);
519    INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsageANDROID);
520    INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsage2ANDROID);
521    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, AcquireImageANDROID);
522    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, QueueSignalReleaseImageANDROID);
523    // clang-format on
524
525    return success;
526}
527
528}  // namespace driver
529}  // namespace vulkan
530
531// clang-format on
532