Home | History | Annotate | Download | only in libvulkan
      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 
     27 namespace vulkan {
     28 namespace driver {
     29 
     30 namespace {
     31 
     32 // clang-format off
     33 
     34 VKAPI_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 
     43 VKAPI_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 
     51 VKAPI_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 
     60 VKAPI_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 
     69 VKAPI_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 
     78 VKAPI_ATTR VkResult checkedGetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) {
     79     if (GetData(device).hook_extensions[ProcHook::GOOGLE_display_timing]) {
     80         return GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
     81     } else {
     82         Logger(device).Err(device, "VK_GOOGLE_display_timing not enabled. vkGetRefreshCycleDurationGOOGLE not executed.");
     83         return VK_SUCCESS;
     84     }
     85 }
     86 
     87 VKAPI_ATTR VkResult checkedGetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) {
     88     if (GetData(device).hook_extensions[ProcHook::GOOGLE_display_timing]) {
     89         return GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
     90     } else {
     91         Logger(device).Err(device, "VK_GOOGLE_display_timing not enabled. vkGetPastPresentationTimingGOOGLE not executed.");
     92         return VK_SUCCESS;
     93     }
     94 }
     95 
     96 VKAPI_ATTR void checkedSetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata) {
     97     if (GetData(device).hook_extensions[ProcHook::EXT_hdr_metadata]) {
     98         SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
     99     } else {
    100         Logger(device).Err(device, "VK_EXT_hdr_metadata not enabled. vkSetHdrMetadataEXT not executed.");
    101     }
    102 }
    103 
    104 VKAPI_ATTR VkResult checkedGetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR swapchain) {
    105     if (GetData(device).hook_extensions[ProcHook::KHR_shared_presentable_image]) {
    106         return GetSwapchainStatusKHR(device, swapchain);
    107     } else {
    108         Logger(device).Err(device, "VK_KHR_shared_presentable_image not enabled. vkGetSwapchainStatusKHR not executed.");
    109         return VK_SUCCESS;
    110     }
    111 }
    112 
    113 // clang-format on
    114 
    115 const ProcHook g_proc_hooks[] = {
    116     // clang-format off
    117     {
    118         "vkAcquireImageANDROID",
    119         ProcHook::DEVICE,
    120         ProcHook::ANDROID_native_buffer,
    121         nullptr,
    122         nullptr,
    123     },
    124     {
    125         "vkAcquireNextImageKHR",
    126         ProcHook::DEVICE,
    127         ProcHook::KHR_swapchain,
    128         reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR),
    129         reinterpret_cast<PFN_vkVoidFunction>(checkedAcquireNextImageKHR),
    130     },
    131     {
    132         "vkAllocateCommandBuffers",
    133         ProcHook::DEVICE,
    134         ProcHook::EXTENSION_CORE,
    135         reinterpret_cast<PFN_vkVoidFunction>(AllocateCommandBuffers),
    136         nullptr,
    137     },
    138     {
    139         "vkCreateAndroidSurfaceKHR",
    140         ProcHook::INSTANCE,
    141         ProcHook::KHR_android_surface,
    142         reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR),
    143         nullptr,
    144     },
    145     {
    146         "vkCreateDebugReportCallbackEXT",
    147         ProcHook::INSTANCE,
    148         ProcHook::EXT_debug_report,
    149         reinterpret_cast<PFN_vkVoidFunction>(CreateDebugReportCallbackEXT),
    150         nullptr,
    151     },
    152     {
    153         "vkCreateDevice",
    154         ProcHook::INSTANCE,
    155         ProcHook::EXTENSION_CORE,
    156         reinterpret_cast<PFN_vkVoidFunction>(CreateDevice),
    157         nullptr,
    158     },
    159     {
    160         "vkCreateInstance",
    161         ProcHook::GLOBAL,
    162         ProcHook::EXTENSION_CORE,
    163         reinterpret_cast<PFN_vkVoidFunction>(CreateInstance),
    164         nullptr,
    165     },
    166     {
    167         "vkCreateSwapchainKHR",
    168         ProcHook::DEVICE,
    169         ProcHook::KHR_swapchain,
    170         reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR),
    171         reinterpret_cast<PFN_vkVoidFunction>(checkedCreateSwapchainKHR),
    172     },
    173     {
    174         "vkDebugReportMessageEXT",
    175         ProcHook::INSTANCE,
    176         ProcHook::EXT_debug_report,
    177         reinterpret_cast<PFN_vkVoidFunction>(DebugReportMessageEXT),
    178         nullptr,
    179     },
    180     {
    181         "vkDestroyDebugReportCallbackEXT",
    182         ProcHook::INSTANCE,
    183         ProcHook::EXT_debug_report,
    184         reinterpret_cast<PFN_vkVoidFunction>(DestroyDebugReportCallbackEXT),
    185         nullptr,
    186     },
    187     {
    188         "vkDestroyDevice",
    189         ProcHook::DEVICE,
    190         ProcHook::EXTENSION_CORE,
    191         reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice),
    192         nullptr,
    193     },
    194     {
    195         "vkDestroyInstance",
    196         ProcHook::INSTANCE,
    197         ProcHook::EXTENSION_CORE,
    198         reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance),
    199         nullptr,
    200     },
    201     {
    202         "vkDestroySurfaceKHR",
    203         ProcHook::INSTANCE,
    204         ProcHook::KHR_surface,
    205         reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR),
    206         nullptr,
    207     },
    208     {
    209         "vkDestroySwapchainKHR",
    210         ProcHook::DEVICE,
    211         ProcHook::KHR_swapchain,
    212         reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR),
    213         reinterpret_cast<PFN_vkVoidFunction>(checkedDestroySwapchainKHR),
    214     },
    215     {
    216         "vkEnumerateDeviceExtensionProperties",
    217         ProcHook::INSTANCE,
    218         ProcHook::EXTENSION_CORE,
    219         reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
    220         nullptr,
    221     },
    222     {
    223         "vkEnumerateInstanceExtensionProperties",
    224         ProcHook::GLOBAL,
    225         ProcHook::EXTENSION_CORE,
    226         reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties),
    227         nullptr,
    228     },
    229     {
    230         "vkEnumeratePhysicalDevices",
    231         ProcHook::INSTANCE,
    232         ProcHook::EXTENSION_CORE,
    233         reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices),
    234         nullptr,
    235     },
    236     {
    237         "vkGetDeviceProcAddr",
    238         ProcHook::DEVICE,
    239         ProcHook::EXTENSION_CORE,
    240         reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr),
    241         nullptr,
    242     },
    243     {
    244         "vkGetDeviceQueue",
    245         ProcHook::DEVICE,
    246         ProcHook::EXTENSION_CORE,
    247         reinterpret_cast<PFN_vkVoidFunction>(GetDeviceQueue),
    248         nullptr,
    249     },
    250     {
    251         "vkGetInstanceProcAddr",
    252         ProcHook::INSTANCE,
    253         ProcHook::EXTENSION_CORE,
    254         reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr),
    255         nullptr,
    256     },
    257     {
    258         "vkGetPastPresentationTimingGOOGLE",
    259         ProcHook::DEVICE,
    260         ProcHook::GOOGLE_display_timing,
    261         reinterpret_cast<PFN_vkVoidFunction>(GetPastPresentationTimingGOOGLE),
    262         reinterpret_cast<PFN_vkVoidFunction>(checkedGetPastPresentationTimingGOOGLE),
    263     },
    264     {
    265         "vkGetPhysicalDeviceSurfaceCapabilities2KHR",
    266         ProcHook::INSTANCE,
    267         ProcHook::KHR_get_surface_capabilities2,
    268         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilities2KHR),
    269         nullptr,
    270     },
    271     {
    272         "vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
    273         ProcHook::INSTANCE,
    274         ProcHook::KHR_surface,
    275         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR),
    276         nullptr,
    277     },
    278     {
    279         "vkGetPhysicalDeviceSurfaceFormats2KHR",
    280         ProcHook::INSTANCE,
    281         ProcHook::KHR_get_surface_capabilities2,
    282         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormats2KHR),
    283         nullptr,
    284     },
    285     {
    286         "vkGetPhysicalDeviceSurfaceFormatsKHR",
    287         ProcHook::INSTANCE,
    288         ProcHook::KHR_surface,
    289         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR),
    290         nullptr,
    291     },
    292     {
    293         "vkGetPhysicalDeviceSurfacePresentModesKHR",
    294         ProcHook::INSTANCE,
    295         ProcHook::KHR_surface,
    296         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR),
    297         nullptr,
    298     },
    299     {
    300         "vkGetPhysicalDeviceSurfaceSupportKHR",
    301         ProcHook::INSTANCE,
    302         ProcHook::KHR_surface,
    303         reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR),
    304         nullptr,
    305     },
    306     {
    307         "vkGetRefreshCycleDurationGOOGLE",
    308         ProcHook::DEVICE,
    309         ProcHook::GOOGLE_display_timing,
    310         reinterpret_cast<PFN_vkVoidFunction>(GetRefreshCycleDurationGOOGLE),
    311         reinterpret_cast<PFN_vkVoidFunction>(checkedGetRefreshCycleDurationGOOGLE),
    312     },
    313     {
    314         "vkGetSwapchainGrallocUsage2ANDROID",
    315         ProcHook::DEVICE,
    316         ProcHook::ANDROID_native_buffer,
    317         nullptr,
    318         nullptr,
    319     },
    320     {
    321         "vkGetSwapchainGrallocUsageANDROID",
    322         ProcHook::DEVICE,
    323         ProcHook::ANDROID_native_buffer,
    324         nullptr,
    325         nullptr,
    326     },
    327     {
    328         "vkGetSwapchainImagesKHR",
    329         ProcHook::DEVICE,
    330         ProcHook::KHR_swapchain,
    331         reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR),
    332         reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainImagesKHR),
    333     },
    334     {
    335         "vkGetSwapchainStatusKHR",
    336         ProcHook::DEVICE,
    337         ProcHook::KHR_shared_presentable_image,
    338         reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainStatusKHR),
    339         reinterpret_cast<PFN_vkVoidFunction>(checkedGetSwapchainStatusKHR),
    340     },
    341     {
    342         "vkQueuePresentKHR",
    343         ProcHook::DEVICE,
    344         ProcHook::KHR_swapchain,
    345         reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR),
    346         reinterpret_cast<PFN_vkVoidFunction>(checkedQueuePresentKHR),
    347     },
    348     {
    349         "vkQueueSignalReleaseImageANDROID",
    350         ProcHook::DEVICE,
    351         ProcHook::ANDROID_native_buffer,
    352         nullptr,
    353         nullptr,
    354     },
    355     {
    356         "vkSetHdrMetadataEXT",
    357         ProcHook::DEVICE,
    358         ProcHook::EXT_hdr_metadata,
    359         reinterpret_cast<PFN_vkVoidFunction>(SetHdrMetadataEXT),
    360         reinterpret_cast<PFN_vkVoidFunction>(checkedSetHdrMetadataEXT),
    361     },
    362     // clang-format on
    363 };
    364 
    365 }  // namespace
    366 
    367 const ProcHook* GetProcHook(const char* name) {
    368     const auto& begin = g_proc_hooks;
    369     const auto& end =
    370         g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
    371     const auto hook = std::lower_bound(
    372         begin, end, name,
    373         [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
    374     return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
    375 }
    376 
    377 ProcHook::Extension GetProcHookExtension(const char* name) {
    378     // clang-format off
    379     if (strcmp(name, "VK_ANDROID_native_buffer") == 0) return ProcHook::ANDROID_native_buffer;
    380     if (strcmp(name, "VK_EXT_debug_report") == 0) return ProcHook::EXT_debug_report;
    381     if (strcmp(name, "VK_EXT_hdr_metadata") == 0) return ProcHook::EXT_hdr_metadata;
    382     if (strcmp(name, "VK_EXT_swapchain_colorspace") == 0) return ProcHook::EXT_swapchain_colorspace;
    383     if (strcmp(name, "VK_GOOGLE_display_timing") == 0) return ProcHook::GOOGLE_display_timing;
    384     if (strcmp(name, "VK_KHR_android_surface") == 0) return ProcHook::KHR_android_surface;
    385     if (strcmp(name, "VK_KHR_incremental_present") == 0) return ProcHook::KHR_incremental_present;
    386     if (strcmp(name, "VK_KHR_shared_presentable_image") == 0) return ProcHook::KHR_shared_presentable_image;
    387     if (strcmp(name, "VK_KHR_surface") == 0) return ProcHook::KHR_surface;
    388     if (strcmp(name, "VK_KHR_swapchain") == 0) return ProcHook::KHR_swapchain;
    389     if (strcmp(name, "VK_KHR_get_surface_capabilities2") == 0) return ProcHook::KHR_get_surface_capabilities2;
    390     if (strcmp(name, "VK_KHR_get_physical_device_properties2") == 0) return ProcHook::KHR_get_physical_device_properties2;
    391     // clang-format on
    392     return ProcHook::EXTENSION_UNKNOWN;
    393 }
    394 
    395 #define UNLIKELY(expr) __builtin_expect((expr), 0)
    396 
    397 #define INIT_PROC(required, obj, proc)                                 \
    398     do {                                                               \
    399         data.driver.proc =                                             \
    400             reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
    401         if (UNLIKELY(required && !data.driver.proc)) {                 \
    402             ALOGE("missing " #obj " proc: vk" #proc);                  \
    403             success = false;                                           \
    404         }                                                              \
    405     } while (0)
    406 
    407 #define INIT_PROC_EXT(ext, required, obj, proc) \
    408     do {                                        \
    409         if (extensions[ProcHook::ext])          \
    410             INIT_PROC(required, obj, proc);     \
    411     } while (0)
    412 
    413 bool InitDriverTable(VkInstance instance,
    414                      PFN_vkGetInstanceProcAddr get_proc,
    415                      const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
    416     auto& data = GetData(instance);
    417     bool success = true;
    418 
    419     // clang-format off
    420     INIT_PROC(true, instance, DestroyInstance);
    421     INIT_PROC(true, instance, EnumeratePhysicalDevices);
    422     INIT_PROC(true, instance, GetInstanceProcAddr);
    423     INIT_PROC(true, instance, GetPhysicalDeviceProperties);
    424     INIT_PROC(true, instance, CreateDevice);
    425     INIT_PROC(true, instance, EnumerateDeviceExtensionProperties);
    426     INIT_PROC_EXT(EXT_debug_report, true, instance, CreateDebugReportCallbackEXT);
    427     INIT_PROC_EXT(EXT_debug_report, true, instance, DestroyDebugReportCallbackEXT);
    428     INIT_PROC_EXT(EXT_debug_report, true, instance, DebugReportMessageEXT);
    429     INIT_PROC_EXT(KHR_get_physical_device_properties2, true, instance, GetPhysicalDeviceProperties2KHR);
    430     // clang-format on
    431 
    432     return success;
    433 }
    434 
    435 bool InitDriverTable(VkDevice dev,
    436                      PFN_vkGetDeviceProcAddr get_proc,
    437                      const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
    438     auto& data = GetData(dev);
    439     bool success = true;
    440 
    441     // clang-format off
    442     INIT_PROC(true, dev, GetDeviceProcAddr);
    443     INIT_PROC(true, dev, DestroyDevice);
    444     INIT_PROC(true, dev, GetDeviceQueue);
    445     INIT_PROC(true, dev, CreateImage);
    446     INIT_PROC(true, dev, DestroyImage);
    447     INIT_PROC(true, dev, AllocateCommandBuffers);
    448     INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsageANDROID);
    449     INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsage2ANDROID);
    450     INIT_PROC_EXT(ANDROID_native_buffer, true, dev, AcquireImageANDROID);
    451     INIT_PROC_EXT(ANDROID_native_buffer, true, dev, QueueSignalReleaseImageANDROID);
    452     // clang-format on
    453 
    454     return success;
    455 }
    456 
    457 }  // namespace driver
    458 }  // namespace vulkan
    459 
    460 // clang-format on
    461