driver_gen.cpp revision 5948b3eae87af490b7cec36d043b5a9bca6de8c0
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#include <algorithm>
21#include <log/log.h>
22
23#include "driver.h"
24
25namespace vulkan {
26namespace driver {
27
28namespace {
29
30// clang-format off
31
32VKAPI_ATTR VkResult checkedCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) {
33    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
34        return CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
35    } else {
36        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkCreateSwapchainKHR not executed.");
37        return VK_SUCCESS;
38    }
39}
40
41VKAPI_ATTR void checkedDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) {
42    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
43        DestroySwapchainKHR(device, swapchain, pAllocator);
44    } else {
45        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkDestroySwapchainKHR not executed.");
46    }
47}
48
49VKAPI_ATTR VkResult checkedGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) {
50    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
51        return GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
52    } else {
53        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkGetSwapchainImagesKHR not executed.");
54        return VK_SUCCESS;
55    }
56}
57
58VKAPI_ATTR VkResult checkedAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex) {
59    if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
60        return AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
61    } else {
62        Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkAcquireNextImageKHR not executed.");
63        return VK_SUCCESS;
64    }
65}
66
67VKAPI_ATTR VkResult checkedQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) {
68    if (GetData(queue).hook_extensions[ProcHook::KHR_swapchain]) {
69        return QueuePresentKHR(queue, pPresentInfo);
70    } else {
71        Logger(queue).Err(queue, "VK_KHR_swapchain not enabled. vkQueuePresentKHR not executed.");
72        return VK_SUCCESS;
73    }
74}
75
76// clang-format on
77
78const ProcHook g_proc_hooks[] = {
79    // clang-format off
80    {
81        "vkAcquireImageANDROID",
82        ProcHook::DEVICE,
83        ProcHook::ANDROID_native_buffer,
84        nullptr,
85        nullptr,
86    },
87    {
88        "vkAcquireNextImageKHR",
89        ProcHook::DEVICE,
90        ProcHook::KHR_swapchain,
91        reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR),
92        reinterpret_cast<PFN_vkVoidFunction>(checkedAcquireNextImageKHR),
93    },
94    {
95        "vkAllocateCommandBuffers",
96        ProcHook::DEVICE,
97        ProcHook::EXTENSION_CORE,
98        reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers),
99        nullptr,
100    },
101    {
102        "vkCreateAndroidSurfaceKHR",
103        ProcHook::INSTANCE,
104        ProcHook::KHR_android_surface,
105        reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR),
106        nullptr,
107    },
108    {
109        "vkCreateDebugReportCallbackEXT",
110        ProcHook::INSTANCE,
111        ProcHook::EXT_debug_report,
112        reinterpret_cast<PFN_vkVoidFunction>(CreateDebugReportCallbackEXT),
113        nullptr,
114    },
115    {
116        "vkCreateDevice",
117        ProcHook::INSTANCE,
118        ProcHook::EXTENSION_CORE,
119        reinterpret_cast<PFN_vkVoidFunction>(CreateDevice),
120        nullptr,
121    },
122    {
123        "vkCreateInstance",
124        ProcHook::GLOBAL,
125        ProcHook::EXTENSION_CORE,
126        reinterpret_cast<PFN_vkVoidFunction>(CreateInstance),
127        nullptr,
128    },
129    {
130        "vkCreateSwapchainKHR",
131        ProcHook::DEVICE,
132        ProcHook::KHR_swapchain,
133        reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR),
134        reinterpret_cast<PFN_vkVoidFunction>(checkedCreateSwapchainKHR),
135    },
136    {
137        "vkDebugReportMessageEXT",
138        ProcHook::INSTANCE,
139        ProcHook::EXT_debug_report,
140        reinterpret_cast<PFN_vkVoidFunction>(DebugReportMessageEXT),
141        nullptr,
142    },
143    {
144        "vkDestroyDebugReportCallbackEXT",
145        ProcHook::INSTANCE,
146        ProcHook::EXT_debug_report,
147        reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugReportCallbackEXT),
148        nullptr,
149    },
150    {
151        "vkDestroyDevice",
152        ProcHook::DEVICE,
153        ProcHook::EXTENSION_CORE,
154        reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice),
155        nullptr,
156    },
157    {
158        "vkDestroyInstance",
159        ProcHook::INSTANCE,
160        ProcHook::EXTENSION_CORE,
161        reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance),
162        nullptr,
163    },
164    {
165        "vkDestroySurfaceKHR",
166        ProcHook::INSTANCE,
167        ProcHook::KHR_surface,
168        reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR),
169        nullptr,
170    },
171    {
172        "vkDestroySwapchainKHR",
173        ProcHook::DEVICE,
174        ProcHook::KHR_swapchain,
175        reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR),
176        reinterpret_cast<PFN_vkVoidFunction>(checkedDestroySwapchainKHR),
177    },
178    {
179        "vkEnumerateDeviceExtensionProperties",
180        ProcHook::INSTANCE,
181        ProcHook::EXTENSION_CORE,
182        reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
183        nullptr,
184    },
185    {
186        "vkEnumerateInstanceExtensionProperties",
187        ProcHook::GLOBAL,
188        ProcHook::EXTENSION_CORE,
189        reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties),
190        nullptr,
191    },
192    {
193        "vkEnumeratePhysicalDevices",
194        ProcHook::INSTANCE,
195        ProcHook::EXTENSION_CORE,
196        reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices),
197        nullptr,
198    },
199    {
200        "vkGetDeviceProcAddr",
201        ProcHook::DEVICE,
202        ProcHook::EXTENSION_CORE,
203        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr),
204        nullptr,
205    },
206    {
207        "vkGetDeviceQueue",
208        ProcHook::DEVICE,
209        ProcHook::EXTENSION_CORE,
210        reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue),
211        nullptr,
212    },
213    {
214        "vkGetInstanceProcAddr",
215        ProcHook::INSTANCE,
216        ProcHook::EXTENSION_CORE,
217        reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr),
218        nullptr,
219    },
220    {
221        "vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
222        ProcHook::INSTANCE,
223        ProcHook::KHR_surface,
224        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR),
225        nullptr,
226    },
227    {
228        "vkGetPhysicalDeviceSurfaceFormatsKHR",
229        ProcHook::INSTANCE,
230        ProcHook::KHR_surface,
231        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR),
232        nullptr,
233    },
234    {
235        "vkGetPhysicalDeviceSurfacePresentModesKHR",
236        ProcHook::INSTANCE,
237        ProcHook::KHR_surface,
238        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR),
239        nullptr,
240    },
241    {
242        "vkGetPhysicalDeviceSurfaceSupportKHR",
243        ProcHook::INSTANCE,
244        ProcHook::KHR_surface,
245        reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR),
246        nullptr,
247    },
248    {
249        "vkGetSwapchainGrallocUsage2ANDROID",
250        ProcHook::DEVICE,
251        ProcHook::ANDROID_native_buffer,
252        nullptr,
253        nullptr,
254    },
255    {
256        "vkGetSwapchainGrallocUsageANDROID",
257        ProcHook::DEVICE,
258        ProcHook::ANDROID_native_buffer,
259        nullptr,
260        nullptr,
261    },
262    {
263        "vkGetSwapchainImagesKHR",
264        ProcHook::DEVICE,
265        ProcHook::KHR_swapchain,
266        reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR),
267        reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainImagesKHR),
268    },
269    {
270        "vkQueuePresentKHR",
271        ProcHook::DEVICE,
272        ProcHook::KHR_swapchain,
273        reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR),
274        reinterpret_cast<PFN_vkVoidFunction>(checkedQueuePresentKHR),
275    },
276    {
277        "vkQueueSignalReleaseImageANDROID",
278        ProcHook::DEVICE,
279        ProcHook::ANDROID_native_buffer,
280        nullptr,
281        nullptr,
282    },
283    // clang-format on
284};
285
286}  // anonymous
287
288const ProcHook* GetProcHook(const char* name) {
289    const auto& begin = g_proc_hooks;
290    const auto& end =
291        g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
292    const auto hook = std::lower_bound(
293        begin, end, name,
294        [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
295    return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
296}
297
298ProcHook::Extension GetProcHookExtension(const char* name) {
299    // clang-format off
300    if (strcmp(name, "VK_ANDROID_native_buffer") == 0) return ProcHook::ANDROID_native_buffer;
301    if (strcmp(name, "VK_EXT_debug_report") == 0) return ProcHook::EXT_debug_report;
302    if (strcmp(name, "VK_KHR_android_surface") == 0) return ProcHook::KHR_android_surface;
303    if (strcmp(name, "VK_KHR_surface") == 0) return ProcHook::KHR_surface;
304    if (strcmp(name, "VK_KHR_swapchain") == 0) return ProcHook::KHR_swapchain;
305    // clang-format on
306    return ProcHook::EXTENSION_UNKNOWN;
307}
308
309#define UNLIKELY(expr) __builtin_expect((expr), 0)
310
311#define INIT_PROC(required, obj, proc)                                 \
312    do {                                                               \
313        data.driver.proc =                                             \
314            reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
315        if (UNLIKELY(required && !data.driver.proc)) {                 \
316            ALOGE("missing " #obj " proc: vk" #proc);                  \
317            success = false;                                           \
318        }                                                              \
319    } while (0)
320
321#define INIT_PROC_EXT(ext, required, obj, proc) \
322    do {                                        \
323        if (extensions[ProcHook::ext])          \
324            INIT_PROC(required, obj, proc);     \
325    } while (0)
326
327bool InitDriverTable(VkInstance instance,
328                     PFN_vkGetInstanceProcAddr get_proc,
329                     const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
330    auto& data = GetData(instance);
331    bool success = true;
332
333    // clang-format off
334    INIT_PROC(true, instance, DestroyInstance);
335    INIT_PROC(true, instance, EnumeratePhysicalDevices);
336    INIT_PROC(true, instance, GetInstanceProcAddr);
337    INIT_PROC(true, instance, CreateDevice);
338    INIT_PROC(true, instance, EnumerateDeviceExtensionProperties);
339    INIT_PROC_EXT(EXT_debug_report, true, instance, CreateDebugReportCallbackEXT);
340    INIT_PROC_EXT(EXT_debug_report, true, instance, DestroyDebugReportCallbackEXT);
341    INIT_PROC_EXT(EXT_debug_report, true, instance, DebugReportMessageEXT);
342    // clang-format on
343
344    return success;
345}
346
347bool InitDriverTable(VkDevice dev,
348                     PFN_vkGetDeviceProcAddr get_proc,
349                     const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
350    auto& data = GetData(dev);
351    bool success = true;
352
353    // clang-format off
354    INIT_PROC(true, dev, GetDeviceProcAddr);
355    INIT_PROC(true, dev, DestroyDevice);
356    INIT_PROC(true, dev, GetDeviceQueue);
357    INIT_PROC(true, dev, CreateImage);
358    INIT_PROC(true, dev, DestroyImage);
359    INIT_PROC(true, dev, AllocateCommandBuffers);
360    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, GetSwapchainGrallocUsageANDROID);
361    INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsage2ANDROID);
362    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, AcquireImageANDROID);
363    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, QueueSignalReleaseImageANDROID);
364    // clang-format on
365
366    return success;
367}
368
369}  // namespace driver
370}  // namespace vulkan
371
372// clang-format on
373