blob: 29351a189e119bbb2435195485092a7ce90efd48 [file] [log] [blame]
Chia-I Wueb7db122016-03-24 09:11:06 +08001/*
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"
Chia-I Wueb7db122016-03-24 09:11:06 +080024
25namespace vulkan {
26namespace driver {
27
28namespace {
29
30// clang-format off
31
Chia-I Wueb7db122016-03-24 09:11:06 +080032VKAPI_ATTR VkResult checkedCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) {
Chia-I Wu36cc00a2016-04-13 16:52:06 +080033 if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
34 return CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
35 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +080036 Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkCreateSwapchainKHR not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +080037 return VK_SUCCESS;
38 }
Chia-I Wueb7db122016-03-24 09:11:06 +080039}
40
41VKAPI_ATTR void checkedDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) {
Chia-I Wu36cc00a2016-04-13 16:52:06 +080042 if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
43 DestroySwapchainKHR(device, swapchain, pAllocator);
44 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +080045 Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkDestroySwapchainKHR not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +080046 }
Chia-I Wueb7db122016-03-24 09:11:06 +080047}
48
49VKAPI_ATTR VkResult checkedGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) {
Chia-I Wu36cc00a2016-04-13 16:52:06 +080050 if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
51 return GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
52 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +080053 Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkGetSwapchainImagesKHR not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +080054 return VK_SUCCESS;
55 }
Chia-I Wueb7db122016-03-24 09:11:06 +080056}
57
58VKAPI_ATTR VkResult checkedAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex) {
Chia-I Wu36cc00a2016-04-13 16:52:06 +080059 if (GetData(device).hook_extensions[ProcHook::KHR_swapchain]) {
60 return AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
61 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +080062 Logger(device).Err(device, "VK_KHR_swapchain not enabled. vkAcquireNextImageKHR not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +080063 return VK_SUCCESS;
64 }
Chia-I Wueb7db122016-03-24 09:11:06 +080065}
66
67VKAPI_ATTR VkResult checkedQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) {
Chia-I Wu36cc00a2016-04-13 16:52:06 +080068 if (GetData(queue).hook_extensions[ProcHook::KHR_swapchain]) {
69 return QueuePresentKHR(queue, pPresentInfo);
70 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +080071 Logger(queue).Err(queue, "VK_KHR_swapchain not enabled. vkQueuePresentKHR not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +080072 return VK_SUCCESS;
73 }
Chia-I Wueb7db122016-03-24 09:11:06 +080074}
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,
Chia-I Wueb7db122016-03-24 09:11:06 +080086 },
87 {
88 "vkAcquireNextImageKHR",
89 ProcHook::DEVICE,
90 ProcHook::KHR_swapchain,
Chia-I Wu62262232016-03-26 07:06:44 +080091 reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +080092 reinterpret_cast<PFN_vkVoidFunction>(checkedAcquireNextImageKHR),
93 },
94 {
95 "vkAllocateCommandBuffers",
96 ProcHook::DEVICE,
97 ProcHook::EXTENSION_CORE,
Chia-I Wu6a58a8a2016-03-24 16:29:51 +080098 reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers),
Chia-I Wueb7db122016-03-24 09:11:06 +080099 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800100 },
101 {
102 "vkCreateAndroidSurfaceKHR",
103 ProcHook::INSTANCE,
104 ProcHook::KHR_android_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800105 reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800106 nullptr,
107 },
108 {
109 "vkCreateDebugReportCallbackEXT",
110 ProcHook::INSTANCE,
111 ProcHook::EXT_debug_report,
Chia-I Wu62262232016-03-26 07:06:44 +0800112 reinterpret_cast<PFN_vkVoidFunction>(CreateDebugReportCallbackEXT),
Chia-I Wueb7db122016-03-24 09:11:06 +0800113 nullptr,
114 },
115 {
116 "vkCreateDevice",
117 ProcHook::INSTANCE,
118 ProcHook::EXTENSION_CORE,
Chia-I Wu4901db72016-03-24 16:38:58 +0800119 reinterpret_cast<PFN_vkVoidFunction>(CreateDevice),
Chia-I Wueb7db122016-03-24 09:11:06 +0800120 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800121 },
122 {
123 "vkCreateInstance",
124 ProcHook::GLOBAL,
125 ProcHook::EXTENSION_CORE,
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800126 reinterpret_cast<PFN_vkVoidFunction>(CreateInstance),
Chia-I Wueb7db122016-03-24 09:11:06 +0800127 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800128 },
129 {
130 "vkCreateSwapchainKHR",
131 ProcHook::DEVICE,
132 ProcHook::KHR_swapchain,
Chia-I Wu62262232016-03-26 07:06:44 +0800133 reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800134 reinterpret_cast<PFN_vkVoidFunction>(checkedCreateSwapchainKHR),
135 },
136 {
137 "vkDebugReportMessageEXT",
138 ProcHook::INSTANCE,
139 ProcHook::EXT_debug_report,
Chia-I Wu62262232016-03-26 07:06:44 +0800140 reinterpret_cast<PFN_vkVoidFunction>(DebugReportMessageEXT),
Chia-I Wueb7db122016-03-24 09:11:06 +0800141 nullptr,
142 },
143 {
144 "vkDestroyDebugReportCallbackEXT",
145 ProcHook::INSTANCE,
146 ProcHook::EXT_debug_report,
Chia-I Wu62262232016-03-26 07:06:44 +0800147 reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugReportCallbackEXT),
Chia-I Wueb7db122016-03-24 09:11:06 +0800148 nullptr,
149 },
150 {
151 "vkDestroyDevice",
152 ProcHook::DEVICE,
153 ProcHook::EXTENSION_CORE,
Chia-I Wu4901db72016-03-24 16:38:58 +0800154 reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice),
Chia-I Wueb7db122016-03-24 09:11:06 +0800155 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800156 },
157 {
158 "vkDestroyInstance",
159 ProcHook::INSTANCE,
160 ProcHook::EXTENSION_CORE,
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800161 reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance),
Chia-I Wueb7db122016-03-24 09:11:06 +0800162 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800163 },
164 {
165 "vkDestroySurfaceKHR",
166 ProcHook::INSTANCE,
167 ProcHook::KHR_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800168 reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800169 nullptr,
170 },
171 {
172 "vkDestroySwapchainKHR",
173 ProcHook::DEVICE,
174 ProcHook::KHR_swapchain,
Chia-I Wu62262232016-03-26 07:06:44 +0800175 reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800176 reinterpret_cast<PFN_vkVoidFunction>(checkedDestroySwapchainKHR),
177 },
178 {
179 "vkEnumerateDeviceExtensionProperties",
180 ProcHook::INSTANCE,
181 ProcHook::EXTENSION_CORE,
Chia-I Wu01cf3052016-03-24 16:16:21 +0800182 reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
Chia-I Wueb7db122016-03-24 09:11:06 +0800183 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800184 },
185 {
186 "vkEnumerateInstanceExtensionProperties",
187 ProcHook::GLOBAL,
188 ProcHook::EXTENSION_CORE,
189 reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties),
190 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800191 },
192 {
193 "vkEnumeratePhysicalDevices",
194 ProcHook::INSTANCE,
195 ProcHook::EXTENSION_CORE,
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800196 reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices),
Chia-I Wueb7db122016-03-24 09:11:06 +0800197 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800198 },
199 {
200 "vkGetDeviceProcAddr",
201 ProcHook::DEVICE,
202 ProcHook::EXTENSION_CORE,
203 reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr),
204 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800205 },
206 {
207 "vkGetDeviceQueue",
208 ProcHook::DEVICE,
209 ProcHook::EXTENSION_CORE,
Chia-I Wuba0be412016-03-24 16:24:40 +0800210 reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue),
Chia-I Wueb7db122016-03-24 09:11:06 +0800211 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800212 },
213 {
214 "vkGetInstanceProcAddr",
215 ProcHook::INSTANCE,
216 ProcHook::EXTENSION_CORE,
217 reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr),
218 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800219 },
220 {
221 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
222 ProcHook::INSTANCE,
223 ProcHook::KHR_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800224 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800225 nullptr,
226 },
227 {
228 "vkGetPhysicalDeviceSurfaceFormatsKHR",
229 ProcHook::INSTANCE,
230 ProcHook::KHR_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800231 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800232 nullptr,
233 },
234 {
235 "vkGetPhysicalDeviceSurfacePresentModesKHR",
236 ProcHook::INSTANCE,
237 ProcHook::KHR_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800238 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800239 nullptr,
240 },
241 {
242 "vkGetPhysicalDeviceSurfaceSupportKHR",
243 ProcHook::INSTANCE,
244 ProcHook::KHR_surface,
Chia-I Wu62262232016-03-26 07:06:44 +0800245 reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800246 nullptr,
247 },
248 {
249 "vkGetSwapchainGrallocUsageANDROID",
250 ProcHook::DEVICE,
251 ProcHook::ANDROID_native_buffer,
252 nullptr,
253 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800254 },
255 {
256 "vkGetSwapchainImagesKHR",
257 ProcHook::DEVICE,
258 ProcHook::KHR_swapchain,
Chia-I Wu62262232016-03-26 07:06:44 +0800259 reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800260 reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainImagesKHR),
261 },
262 {
263 "vkQueuePresentKHR",
264 ProcHook::DEVICE,
265 ProcHook::KHR_swapchain,
Chia-I Wu62262232016-03-26 07:06:44 +0800266 reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR),
Chia-I Wueb7db122016-03-24 09:11:06 +0800267 reinterpret_cast<PFN_vkVoidFunction>(checkedQueuePresentKHR),
268 },
269 {
270 "vkQueueSignalReleaseImageANDROID",
271 ProcHook::DEVICE,
272 ProcHook::ANDROID_native_buffer,
273 nullptr,
274 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800275 },
276 // clang-format on
277};
278
279} // anonymous
280
281const ProcHook* GetProcHook(const char* name) {
282 const auto& begin = g_proc_hooks;
283 const auto& end =
284 g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
285 const auto hook = std::lower_bound(
286 begin, end, name,
287 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
288 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
289}
290
291ProcHook::Extension GetProcHookExtension(const char* name) {
292 // clang-format off
293 if (strcmp(name, "VK_ANDROID_native_buffer") == 0) return ProcHook::ANDROID_native_buffer;
294 if (strcmp(name, "VK_EXT_debug_report") == 0) return ProcHook::EXT_debug_report;
295 if (strcmp(name, "VK_KHR_android_surface") == 0) return ProcHook::KHR_android_surface;
296 if (strcmp(name, "VK_KHR_surface") == 0) return ProcHook::KHR_surface;
297 if (strcmp(name, "VK_KHR_swapchain") == 0) return ProcHook::KHR_swapchain;
298 // clang-format on
299 return ProcHook::EXTENSION_UNKNOWN;
300}
301
Chia-I Wucc5e2762016-03-24 13:01:16 +0800302#define UNLIKELY(expr) __builtin_expect((expr), 0)
303
304#define INIT_PROC(obj, proc) \
305 do { \
306 data.driver.proc = \
307 reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
308 if (UNLIKELY(!data.driver.proc)) { \
309 ALOGE("missing " #obj " proc: vk" #proc); \
310 success = false; \
311 } \
312 } while (0)
313
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800314#define INIT_PROC_EXT(ext, obj, proc) \
315 do { \
316 if (extensions[ProcHook::ext]) \
317 INIT_PROC(obj, proc); \
Chia-I Wucc5e2762016-03-24 13:01:16 +0800318 } while (0)
319
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800320bool InitDriverTable(VkInstance instance,
321 PFN_vkGetInstanceProcAddr get_proc,
322 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
Chia-I Wucc5e2762016-03-24 13:01:16 +0800323 auto& data = GetData(instance);
324 bool success = true;
325
326 // clang-format off
327 INIT_PROC(instance, DestroyInstance);
328 INIT_PROC(instance, EnumeratePhysicalDevices);
329 INIT_PROC(instance, GetInstanceProcAddr);
330 INIT_PROC(instance, CreateDevice);
Chia-I Wu4901db72016-03-24 16:38:58 +0800331 INIT_PROC(instance, EnumerateDeviceLayerProperties);
Chia-I Wucc5e2762016-03-24 13:01:16 +0800332 INIT_PROC(instance, EnumerateDeviceExtensionProperties);
333 INIT_PROC_EXT(EXT_debug_report, instance, CreateDebugReportCallbackEXT);
334 INIT_PROC_EXT(EXT_debug_report, instance, DestroyDebugReportCallbackEXT);
335 INIT_PROC_EXT(EXT_debug_report, instance, DebugReportMessageEXT);
336 // clang-format on
337
338 return success;
339}
340
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800341bool InitDriverTable(VkDevice dev,
342 PFN_vkGetDeviceProcAddr get_proc,
343 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
Chia-I Wucc5e2762016-03-24 13:01:16 +0800344 auto& data = GetData(dev);
345 bool success = true;
346
347 // clang-format off
348 INIT_PROC(dev, GetDeviceProcAddr);
349 INIT_PROC(dev, DestroyDevice);
350 INIT_PROC(dev, GetDeviceQueue);
351 INIT_PROC(dev, CreateImage);
352 INIT_PROC(dev, DestroyImage);
353 INIT_PROC(dev, AllocateCommandBuffers);
354 INIT_PROC_EXT(ANDROID_native_buffer, dev, GetSwapchainGrallocUsageANDROID);
355 INIT_PROC_EXT(ANDROID_native_buffer, dev, AcquireImageANDROID);
356 INIT_PROC_EXT(ANDROID_native_buffer, dev, QueueSignalReleaseImageANDROID);
357 // clang-format on
358
359 return success;
360}
361
Chia-I Wueb7db122016-03-24 09:11:06 +0800362} // namespace driver
363} // namespace vulkan
364
365// clang-format on