910e62b5创建于 1月15日历史提交
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This file is auto-generated from
// gpu/vulkan/generate_bindings.py
// It's formatted by clang-format using chromium coding style:
//    clang-format -i -style=chromium filename
// DO NOT EDIT!

#include "gpu/vulkan/vulkan_function_pointers.h"

#include "base/check_op.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/no_destructor.h"

namespace gpu {

namespace {
NOINLINE void LogGetProcError(const char* funcName) {
  LOG(WARNING) << "Failed to bind vulkan entrypoint: " << funcName;
}
}  // namespace

VulkanFunctionPointers* GetVulkanFunctionPointers() {
  static base::NoDestructor<VulkanFunctionPointers> vulkan_function_pointers;
  return vulkan_function_pointers.get();
}

VulkanFunctionPointers::VulkanFunctionPointers() = default;
VulkanFunctionPointers::~VulkanFunctionPointers() = default;

bool VulkanFunctionPointers::BindUnassociatedFunctionPointersFromLoaderLib(
    base::NativeLibrary lib) {
  base::AutoLock lock(write_lock_);
  loader_library_ = lib;

  // vkGetInstanceProcAddr must be handled specially since it gets its
  // function pointer through base::GetFunctionPointerFromNativeLibrary().
  // Other Vulkan functions don't do this.
  vkGetInstanceProcAddr = reinterpret_cast<PFN_vkGetInstanceProcAddr>(
      base::GetFunctionPointerFromNativeLibrary(loader_library_,
                                                "vkGetInstanceProcAddr"));
  if (!vkGetInstanceProcAddr) {
    LOG(WARNING) << "Failed to find vkGetInstanceProcAddr";
    return false;
  }
  return BindUnassociatedFunctionPointersCommon();
}

bool VulkanFunctionPointers::BindUnassociatedFunctionPointersFromGetProcAddr(
    PFN_vkGetInstanceProcAddr proc) {
  DCHECK(proc);
  DCHECK(!loader_library_);

  base::AutoLock lock(write_lock_);
  vkGetInstanceProcAddr = proc;
  return BindUnassociatedFunctionPointersCommon();
}

bool VulkanFunctionPointers::BindUnassociatedFunctionPointersCommon() {
  constexpr char kvkEnumerateInstanceVersion[] = "vkEnumerateInstanceVersion";
  vkEnumerateInstanceVersion = reinterpret_cast<PFN_vkEnumerateInstanceVersion>(
      vkGetInstanceProcAddr(nullptr, kvkEnumerateInstanceVersion));
  if (!vkEnumerateInstanceVersion) {
    LogGetProcError(kvkEnumerateInstanceVersion);
    return false;
  }

  constexpr char kvkCreateInstance[] = "vkCreateInstance";
  vkCreateInstance = reinterpret_cast<PFN_vkCreateInstance>(
      vkGetInstanceProcAddr(nullptr, kvkCreateInstance));
  if (!vkCreateInstance) {
    LogGetProcError(kvkCreateInstance);
    return false;
  }

  constexpr char kvkEnumerateInstanceExtensionProperties[] =
      "vkEnumerateInstanceExtensionProperties";
  vkEnumerateInstanceExtensionProperties =
      reinterpret_cast<PFN_vkEnumerateInstanceExtensionProperties>(
          vkGetInstanceProcAddr(nullptr,
                                kvkEnumerateInstanceExtensionProperties));
  if (!vkEnumerateInstanceExtensionProperties) {
    LogGetProcError(kvkEnumerateInstanceExtensionProperties);
    return false;
  }

  constexpr char kvkEnumerateInstanceLayerProperties[] =
      "vkEnumerateInstanceLayerProperties";
  vkEnumerateInstanceLayerProperties =
      reinterpret_cast<PFN_vkEnumerateInstanceLayerProperties>(
          vkGetInstanceProcAddr(nullptr, kvkEnumerateInstanceLayerProperties));
  if (!vkEnumerateInstanceLayerProperties) {
    LogGetProcError(kvkEnumerateInstanceLayerProperties);
    return false;
  }

  return true;
}

bool VulkanFunctionPointers::BindInstanceFunctionPointers(
    VkInstance vk_instance,
    uint32_t api_version,
    const gfx::ExtensionSet& enabled_extensions) {
  DCHECK_GE(api_version, kVulkanRequiredApiVersion);
  base::AutoLock lock(write_lock_);
  constexpr char kvkCreateDevice[] = "vkCreateDevice";
  vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(
      vkGetInstanceProcAddr(vk_instance, kvkCreateDevice));
  if (!vkCreateDevice) {
    LogGetProcError(kvkCreateDevice);
    return false;
  }

  constexpr char kvkDestroyInstance[] = "vkDestroyInstance";
  vkDestroyInstance = reinterpret_cast<PFN_vkDestroyInstance>(
      vkGetInstanceProcAddr(vk_instance, kvkDestroyInstance));
  if (!vkDestroyInstance) {
    LogGetProcError(kvkDestroyInstance);
    return false;
  }

  constexpr char kvkEnumerateDeviceExtensionProperties[] =
      "vkEnumerateDeviceExtensionProperties";
  vkEnumerateDeviceExtensionProperties =
      reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkEnumerateDeviceExtensionProperties));
  if (!vkEnumerateDeviceExtensionProperties) {
    LogGetProcError(kvkEnumerateDeviceExtensionProperties);
    return false;
  }

  constexpr char kvkEnumerateDeviceLayerProperties[] =
      "vkEnumerateDeviceLayerProperties";
  vkEnumerateDeviceLayerProperties =
      reinterpret_cast<PFN_vkEnumerateDeviceLayerProperties>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkEnumerateDeviceLayerProperties));
  if (!vkEnumerateDeviceLayerProperties) {
    LogGetProcError(kvkEnumerateDeviceLayerProperties);
    return false;
  }

  constexpr char kvkEnumeratePhysicalDevices[] = "vkEnumeratePhysicalDevices";
  vkEnumeratePhysicalDevices = reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(
      vkGetInstanceProcAddr(vk_instance, kvkEnumeratePhysicalDevices));
  if (!vkEnumeratePhysicalDevices) {
    LogGetProcError(kvkEnumeratePhysicalDevices);
    return false;
  }

  constexpr char kvkGetDeviceProcAddr[] = "vkGetDeviceProcAddr";
  vkGetDeviceProcAddr = reinterpret_cast<PFN_vkGetDeviceProcAddr>(
      vkGetInstanceProcAddr(vk_instance, kvkGetDeviceProcAddr));
  if (!vkGetDeviceProcAddr) {
    LogGetProcError(kvkGetDeviceProcAddr);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceExternalSemaphoreProperties[] =
      "vkGetPhysicalDeviceExternalSemaphoreProperties";
  vkGetPhysicalDeviceExternalSemaphoreProperties =
      reinterpret_cast<PFN_vkGetPhysicalDeviceExternalSemaphoreProperties>(
          vkGetInstanceProcAddr(
              vk_instance, kvkGetPhysicalDeviceExternalSemaphoreProperties));
  if (!vkGetPhysicalDeviceExternalSemaphoreProperties) {
    LogGetProcError(kvkGetPhysicalDeviceExternalSemaphoreProperties);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceFeatures2[] =
      "vkGetPhysicalDeviceFeatures2";
  vkGetPhysicalDeviceFeatures2 =
      reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2>(
          vkGetInstanceProcAddr(vk_instance, kvkGetPhysicalDeviceFeatures2));
  if (!vkGetPhysicalDeviceFeatures2) {
    LogGetProcError(kvkGetPhysicalDeviceFeatures2);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceFormatProperties[] =
      "vkGetPhysicalDeviceFormatProperties";
  vkGetPhysicalDeviceFormatProperties =
      reinterpret_cast<PFN_vkGetPhysicalDeviceFormatProperties>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceFormatProperties));
  if (!vkGetPhysicalDeviceFormatProperties) {
    LogGetProcError(kvkGetPhysicalDeviceFormatProperties);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceFormatProperties2[] =
      "vkGetPhysicalDeviceFormatProperties2";
  vkGetPhysicalDeviceFormatProperties2 =
      reinterpret_cast<PFN_vkGetPhysicalDeviceFormatProperties2>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceFormatProperties2));
  if (!vkGetPhysicalDeviceFormatProperties2) {
    LogGetProcError(kvkGetPhysicalDeviceFormatProperties2);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceImageFormatProperties2[] =
      "vkGetPhysicalDeviceImageFormatProperties2";
  vkGetPhysicalDeviceImageFormatProperties2 =
      reinterpret_cast<PFN_vkGetPhysicalDeviceImageFormatProperties2>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceImageFormatProperties2));
  if (!vkGetPhysicalDeviceImageFormatProperties2) {
    LogGetProcError(kvkGetPhysicalDeviceImageFormatProperties2);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceMemoryProperties[] =
      "vkGetPhysicalDeviceMemoryProperties";
  vkGetPhysicalDeviceMemoryProperties =
      reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceMemoryProperties));
  if (!vkGetPhysicalDeviceMemoryProperties) {
    LogGetProcError(kvkGetPhysicalDeviceMemoryProperties);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceMemoryProperties2[] =
      "vkGetPhysicalDeviceMemoryProperties2";
  vkGetPhysicalDeviceMemoryProperties2 =
      reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties2>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceMemoryProperties2));
  if (!vkGetPhysicalDeviceMemoryProperties2) {
    LogGetProcError(kvkGetPhysicalDeviceMemoryProperties2);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceProperties[] =
      "vkGetPhysicalDeviceProperties";
  vkGetPhysicalDeviceProperties =
      reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(
          vkGetInstanceProcAddr(vk_instance, kvkGetPhysicalDeviceProperties));
  if (!vkGetPhysicalDeviceProperties) {
    LogGetProcError(kvkGetPhysicalDeviceProperties);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceProperties2[] =
      "vkGetPhysicalDeviceProperties2";
  vkGetPhysicalDeviceProperties2 =
      reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2>(
          vkGetInstanceProcAddr(vk_instance, kvkGetPhysicalDeviceProperties2));
  if (!vkGetPhysicalDeviceProperties2) {
    LogGetProcError(kvkGetPhysicalDeviceProperties2);
    return false;
  }

  constexpr char kvkGetPhysicalDeviceQueueFamilyProperties[] =
      "vkGetPhysicalDeviceQueueFamilyProperties";
  vkGetPhysicalDeviceQueueFamilyProperties =
      reinterpret_cast<PFN_vkGetPhysicalDeviceQueueFamilyProperties>(
          vkGetInstanceProcAddr(vk_instance,
                                kvkGetPhysicalDeviceQueueFamilyProperties));
  if (!vkGetPhysicalDeviceQueueFamilyProperties) {
    LogGetProcError(kvkGetPhysicalDeviceQueueFamilyProperties);
    return false;
  }

#if DCHECK_IS_ON()
  if (gfx::HasExtension(enabled_extensions,
                        VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) {
    constexpr char kvkCreateDebugReportCallbackEXT[] =
        "vkCreateDebugReportCallbackEXT";
    vkCreateDebugReportCallbackEXT =
        reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkCreateDebugReportCallbackEXT));
    if (!vkCreateDebugReportCallbackEXT) {
      LogGetProcError(kvkCreateDebugReportCallbackEXT);
      return false;
    }

    constexpr char kvkDestroyDebugReportCallbackEXT[] =
        "vkDestroyDebugReportCallbackEXT";
    vkDestroyDebugReportCallbackEXT =
        reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkDestroyDebugReportCallbackEXT));
    if (!vkDestroyDebugReportCallbackEXT) {
      LogGetProcError(kvkDestroyDebugReportCallbackEXT);
      return false;
    }
  }
#endif  // DCHECK_IS_ON()

  if (gfx::HasExtension(enabled_extensions, VK_KHR_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkDestroySurfaceKHR[] = "vkDestroySurfaceKHR";
    vkDestroySurfaceKHR = reinterpret_cast<PFN_vkDestroySurfaceKHR>(
        vkGetInstanceProcAddr(vk_instance, kvkDestroySurfaceKHR));
    if (!vkDestroySurfaceKHR) {
      LogGetProcError(kvkDestroySurfaceKHR);
      return false;
    }

    constexpr char kvkGetPhysicalDeviceSurfaceCapabilitiesKHR[] =
        "vkGetPhysicalDeviceSurfaceCapabilitiesKHR";
    vkGetPhysicalDeviceSurfaceCapabilitiesKHR =
        reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkGetPhysicalDeviceSurfaceCapabilitiesKHR));
    if (!vkGetPhysicalDeviceSurfaceCapabilitiesKHR) {
      LogGetProcError(kvkGetPhysicalDeviceSurfaceCapabilitiesKHR);
      return false;
    }

    constexpr char kvkGetPhysicalDeviceSurfaceFormatsKHR[] =
        "vkGetPhysicalDeviceSurfaceFormatsKHR";
    vkGetPhysicalDeviceSurfaceFormatsKHR =
        reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkGetPhysicalDeviceSurfaceFormatsKHR));
    if (!vkGetPhysicalDeviceSurfaceFormatsKHR) {
      LogGetProcError(kvkGetPhysicalDeviceSurfaceFormatsKHR);
      return false;
    }

    constexpr char kvkGetPhysicalDeviceSurfaceSupportKHR[] =
        "vkGetPhysicalDeviceSurfaceSupportKHR";
    vkGetPhysicalDeviceSurfaceSupportKHR =
        reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceSupportKHR>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkGetPhysicalDeviceSurfaceSupportKHR));
    if (!vkGetPhysicalDeviceSurfaceSupportKHR) {
      LogGetProcError(kvkGetPhysicalDeviceSurfaceSupportKHR);
      return false;
    }
  }

  if (gfx::HasExtension(enabled_extensions,
                        VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkCreateHeadlessSurfaceEXT[] = "vkCreateHeadlessSurfaceEXT";
    vkCreateHeadlessSurfaceEXT =
        reinterpret_cast<PFN_vkCreateHeadlessSurfaceEXT>(
            vkGetInstanceProcAddr(vk_instance, kvkCreateHeadlessSurfaceEXT));
    if (!vkCreateHeadlessSurfaceEXT) {
      LogGetProcError(kvkCreateHeadlessSurfaceEXT);
      return false;
    }
  }

#if defined(USE_VULKAN_XCB)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_XCB_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkCreateXcbSurfaceKHR[] = "vkCreateXcbSurfaceKHR";
    vkCreateXcbSurfaceKHR = reinterpret_cast<PFN_vkCreateXcbSurfaceKHR>(
        vkGetInstanceProcAddr(vk_instance, kvkCreateXcbSurfaceKHR));
    if (!vkCreateXcbSurfaceKHR) {
      LogGetProcError(kvkCreateXcbSurfaceKHR);
      return false;
    }

    constexpr char kvkGetPhysicalDeviceXcbPresentationSupportKHR[] =
        "vkGetPhysicalDeviceXcbPresentationSupportKHR";
    vkGetPhysicalDeviceXcbPresentationSupportKHR =
        reinterpret_cast<PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR>(
            vkGetInstanceProcAddr(
                vk_instance, kvkGetPhysicalDeviceXcbPresentationSupportKHR));
    if (!vkGetPhysicalDeviceXcbPresentationSupportKHR) {
      LogGetProcError(kvkGetPhysicalDeviceXcbPresentationSupportKHR);
      return false;
    }
  }
#endif  // defined(USE_VULKAN_XCB)

#if BUILDFLAG(IS_WIN)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_WIN32_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkCreateWin32SurfaceKHR[] = "vkCreateWin32SurfaceKHR";
    vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(
        vkGetInstanceProcAddr(vk_instance, kvkCreateWin32SurfaceKHR));
    if (!vkCreateWin32SurfaceKHR) {
      LogGetProcError(kvkCreateWin32SurfaceKHR);
      return false;
    }

    constexpr char kvkGetPhysicalDeviceWin32PresentationSupportKHR[] =
        "vkGetPhysicalDeviceWin32PresentationSupportKHR";
    vkGetPhysicalDeviceWin32PresentationSupportKHR =
        reinterpret_cast<PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR>(
            vkGetInstanceProcAddr(
                vk_instance, kvkGetPhysicalDeviceWin32PresentationSupportKHR));
    if (!vkGetPhysicalDeviceWin32PresentationSupportKHR) {
      LogGetProcError(kvkGetPhysicalDeviceWin32PresentationSupportKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_ANDROID)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkCreateAndroidSurfaceKHR[] = "vkCreateAndroidSurfaceKHR";
    vkCreateAndroidSurfaceKHR = reinterpret_cast<PFN_vkCreateAndroidSurfaceKHR>(
        vkGetInstanceProcAddr(vk_instance, kvkCreateAndroidSurfaceKHR));
    if (!vkCreateAndroidSurfaceKHR) {
      LogGetProcError(kvkCreateAndroidSurfaceKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_FUCHSIA)
  if (gfx::HasExtension(enabled_extensions,
                        VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME)) {
    constexpr char kvkCreateImagePipeSurfaceFUCHSIA[] =
        "vkCreateImagePipeSurfaceFUCHSIA";
    vkCreateImagePipeSurfaceFUCHSIA =
        reinterpret_cast<PFN_vkCreateImagePipeSurfaceFUCHSIA>(
            vkGetInstanceProcAddr(vk_instance,
                                  kvkCreateImagePipeSurfaceFUCHSIA));
    if (!vkCreateImagePipeSurfaceFUCHSIA) {
      LogGetProcError(kvkCreateImagePipeSurfaceFUCHSIA);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_FUCHSIA)

  return true;
}

bool VulkanFunctionPointers::BindDeviceFunctionPointers(
    VkDevice vk_device,
    uint32_t api_version,
    const gfx::ExtensionSet& enabled_extensions) {
  DCHECK_GE(api_version, kVulkanRequiredApiVersion);
  base::AutoLock lock(write_lock_);
  // Device functions
  constexpr char kvkAllocateCommandBuffers[] = "vkAllocateCommandBuffers";
  vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>(
      vkGetDeviceProcAddr(vk_device, kvkAllocateCommandBuffers));
  if (!vkAllocateCommandBuffers) {
    LogGetProcError(kvkAllocateCommandBuffers);
    return false;
  }

  constexpr char kvkAllocateDescriptorSets[] = "vkAllocateDescriptorSets";
  vkAllocateDescriptorSets = reinterpret_cast<PFN_vkAllocateDescriptorSets>(
      vkGetDeviceProcAddr(vk_device, kvkAllocateDescriptorSets));
  if (!vkAllocateDescriptorSets) {
    LogGetProcError(kvkAllocateDescriptorSets);
    return false;
  }

  constexpr char kvkAllocateMemory[] = "vkAllocateMemory";
  vkAllocateMemory = reinterpret_cast<PFN_vkAllocateMemory>(
      vkGetDeviceProcAddr(vk_device, kvkAllocateMemory));
  if (!vkAllocateMemory) {
    LogGetProcError(kvkAllocateMemory);
    return false;
  }

  constexpr char kvkBeginCommandBuffer[] = "vkBeginCommandBuffer";
  vkBeginCommandBuffer = reinterpret_cast<PFN_vkBeginCommandBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkBeginCommandBuffer));
  if (!vkBeginCommandBuffer) {
    LogGetProcError(kvkBeginCommandBuffer);
    return false;
  }

  constexpr char kvkBindBufferMemory[] = "vkBindBufferMemory";
  vkBindBufferMemory = reinterpret_cast<PFN_vkBindBufferMemory>(
      vkGetDeviceProcAddr(vk_device, kvkBindBufferMemory));
  if (!vkBindBufferMemory) {
    LogGetProcError(kvkBindBufferMemory);
    return false;
  }

  constexpr char kvkBindBufferMemory2[] = "vkBindBufferMemory2";
  vkBindBufferMemory2 = reinterpret_cast<PFN_vkBindBufferMemory2>(
      vkGetDeviceProcAddr(vk_device, kvkBindBufferMemory2));
  if (!vkBindBufferMemory2) {
    LogGetProcError(kvkBindBufferMemory2);
    return false;
  }

  constexpr char kvkBindImageMemory[] = "vkBindImageMemory";
  vkBindImageMemory = reinterpret_cast<PFN_vkBindImageMemory>(
      vkGetDeviceProcAddr(vk_device, kvkBindImageMemory));
  if (!vkBindImageMemory) {
    LogGetProcError(kvkBindImageMemory);
    return false;
  }

  constexpr char kvkBindImageMemory2[] = "vkBindImageMemory2";
  vkBindImageMemory2 = reinterpret_cast<PFN_vkBindImageMemory2>(
      vkGetDeviceProcAddr(vk_device, kvkBindImageMemory2));
  if (!vkBindImageMemory2) {
    LogGetProcError(kvkBindImageMemory2);
    return false;
  }

  constexpr char kvkCmdBeginRenderPass[] = "vkCmdBeginRenderPass";
  vkCmdBeginRenderPass = reinterpret_cast<PFN_vkCmdBeginRenderPass>(
      vkGetDeviceProcAddr(vk_device, kvkCmdBeginRenderPass));
  if (!vkCmdBeginRenderPass) {
    LogGetProcError(kvkCmdBeginRenderPass);
    return false;
  }

  constexpr char kvkCmdBindDescriptorSets[] = "vkCmdBindDescriptorSets";
  vkCmdBindDescriptorSets = reinterpret_cast<PFN_vkCmdBindDescriptorSets>(
      vkGetDeviceProcAddr(vk_device, kvkCmdBindDescriptorSets));
  if (!vkCmdBindDescriptorSets) {
    LogGetProcError(kvkCmdBindDescriptorSets);
    return false;
  }

  constexpr char kvkCmdBindPipeline[] = "vkCmdBindPipeline";
  vkCmdBindPipeline = reinterpret_cast<PFN_vkCmdBindPipeline>(
      vkGetDeviceProcAddr(vk_device, kvkCmdBindPipeline));
  if (!vkCmdBindPipeline) {
    LogGetProcError(kvkCmdBindPipeline);
    return false;
  }

  constexpr char kvkCmdBindVertexBuffers[] = "vkCmdBindVertexBuffers";
  vkCmdBindVertexBuffers = reinterpret_cast<PFN_vkCmdBindVertexBuffers>(
      vkGetDeviceProcAddr(vk_device, kvkCmdBindVertexBuffers));
  if (!vkCmdBindVertexBuffers) {
    LogGetProcError(kvkCmdBindVertexBuffers);
    return false;
  }

  constexpr char kvkCmdCopyBuffer[] = "vkCmdCopyBuffer";
  vkCmdCopyBuffer = reinterpret_cast<PFN_vkCmdCopyBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkCmdCopyBuffer));
  if (!vkCmdCopyBuffer) {
    LogGetProcError(kvkCmdCopyBuffer);
    return false;
  }

  constexpr char kvkCmdCopyBufferToImage[] = "vkCmdCopyBufferToImage";
  vkCmdCopyBufferToImage = reinterpret_cast<PFN_vkCmdCopyBufferToImage>(
      vkGetDeviceProcAddr(vk_device, kvkCmdCopyBufferToImage));
  if (!vkCmdCopyBufferToImage) {
    LogGetProcError(kvkCmdCopyBufferToImage);
    return false;
  }

  constexpr char kvkCmdCopyImage[] = "vkCmdCopyImage";
  vkCmdCopyImage = reinterpret_cast<PFN_vkCmdCopyImage>(
      vkGetDeviceProcAddr(vk_device, kvkCmdCopyImage));
  if (!vkCmdCopyImage) {
    LogGetProcError(kvkCmdCopyImage);
    return false;
  }

  constexpr char kvkCmdCopyImageToBuffer[] = "vkCmdCopyImageToBuffer";
  vkCmdCopyImageToBuffer = reinterpret_cast<PFN_vkCmdCopyImageToBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkCmdCopyImageToBuffer));
  if (!vkCmdCopyImageToBuffer) {
    LogGetProcError(kvkCmdCopyImageToBuffer);
    return false;
  }

  constexpr char kvkCmdDraw[] = "vkCmdDraw";
  vkCmdDraw = reinterpret_cast<PFN_vkCmdDraw>(
      vkGetDeviceProcAddr(vk_device, kvkCmdDraw));
  if (!vkCmdDraw) {
    LogGetProcError(kvkCmdDraw);
    return false;
  }

  constexpr char kvkCmdEndRenderPass[] = "vkCmdEndRenderPass";
  vkCmdEndRenderPass = reinterpret_cast<PFN_vkCmdEndRenderPass>(
      vkGetDeviceProcAddr(vk_device, kvkCmdEndRenderPass));
  if (!vkCmdEndRenderPass) {
    LogGetProcError(kvkCmdEndRenderPass);
    return false;
  }

  constexpr char kvkCmdExecuteCommands[] = "vkCmdExecuteCommands";
  vkCmdExecuteCommands = reinterpret_cast<PFN_vkCmdExecuteCommands>(
      vkGetDeviceProcAddr(vk_device, kvkCmdExecuteCommands));
  if (!vkCmdExecuteCommands) {
    LogGetProcError(kvkCmdExecuteCommands);
    return false;
  }

  constexpr char kvkCmdNextSubpass[] = "vkCmdNextSubpass";
  vkCmdNextSubpass = reinterpret_cast<PFN_vkCmdNextSubpass>(
      vkGetDeviceProcAddr(vk_device, kvkCmdNextSubpass));
  if (!vkCmdNextSubpass) {
    LogGetProcError(kvkCmdNextSubpass);
    return false;
  }

  constexpr char kvkCmdPipelineBarrier[] = "vkCmdPipelineBarrier";
  vkCmdPipelineBarrier = reinterpret_cast<PFN_vkCmdPipelineBarrier>(
      vkGetDeviceProcAddr(vk_device, kvkCmdPipelineBarrier));
  if (!vkCmdPipelineBarrier) {
    LogGetProcError(kvkCmdPipelineBarrier);
    return false;
  }

  constexpr char kvkCmdPushConstants[] = "vkCmdPushConstants";
  vkCmdPushConstants = reinterpret_cast<PFN_vkCmdPushConstants>(
      vkGetDeviceProcAddr(vk_device, kvkCmdPushConstants));
  if (!vkCmdPushConstants) {
    LogGetProcError(kvkCmdPushConstants);
    return false;
  }

  constexpr char kvkCmdSetScissor[] = "vkCmdSetScissor";
  vkCmdSetScissor = reinterpret_cast<PFN_vkCmdSetScissor>(
      vkGetDeviceProcAddr(vk_device, kvkCmdSetScissor));
  if (!vkCmdSetScissor) {
    LogGetProcError(kvkCmdSetScissor);
    return false;
  }

  constexpr char kvkCmdSetViewport[] = "vkCmdSetViewport";
  vkCmdSetViewport = reinterpret_cast<PFN_vkCmdSetViewport>(
      vkGetDeviceProcAddr(vk_device, kvkCmdSetViewport));
  if (!vkCmdSetViewport) {
    LogGetProcError(kvkCmdSetViewport);
    return false;
  }

  constexpr char kvkCreateBuffer[] = "vkCreateBuffer";
  vkCreateBuffer = reinterpret_cast<PFN_vkCreateBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkCreateBuffer));
  if (!vkCreateBuffer) {
    LogGetProcError(kvkCreateBuffer);
    return false;
  }

  constexpr char kvkCreateCommandPool[] = "vkCreateCommandPool";
  vkCreateCommandPool = reinterpret_cast<PFN_vkCreateCommandPool>(
      vkGetDeviceProcAddr(vk_device, kvkCreateCommandPool));
  if (!vkCreateCommandPool) {
    LogGetProcError(kvkCreateCommandPool);
    return false;
  }

  constexpr char kvkCreateDescriptorPool[] = "vkCreateDescriptorPool";
  vkCreateDescriptorPool = reinterpret_cast<PFN_vkCreateDescriptorPool>(
      vkGetDeviceProcAddr(vk_device, kvkCreateDescriptorPool));
  if (!vkCreateDescriptorPool) {
    LogGetProcError(kvkCreateDescriptorPool);
    return false;
  }

  constexpr char kvkCreateDescriptorSetLayout[] = "vkCreateDescriptorSetLayout";
  vkCreateDescriptorSetLayout =
      reinterpret_cast<PFN_vkCreateDescriptorSetLayout>(
          vkGetDeviceProcAddr(vk_device, kvkCreateDescriptorSetLayout));
  if (!vkCreateDescriptorSetLayout) {
    LogGetProcError(kvkCreateDescriptorSetLayout);
    return false;
  }

  constexpr char kvkCreateFence[] = "vkCreateFence";
  vkCreateFence = reinterpret_cast<PFN_vkCreateFence>(
      vkGetDeviceProcAddr(vk_device, kvkCreateFence));
  if (!vkCreateFence) {
    LogGetProcError(kvkCreateFence);
    return false;
  }

  constexpr char kvkCreateFramebuffer[] = "vkCreateFramebuffer";
  vkCreateFramebuffer = reinterpret_cast<PFN_vkCreateFramebuffer>(
      vkGetDeviceProcAddr(vk_device, kvkCreateFramebuffer));
  if (!vkCreateFramebuffer) {
    LogGetProcError(kvkCreateFramebuffer);
    return false;
  }

  constexpr char kvkCreateGraphicsPipelines[] = "vkCreateGraphicsPipelines";
  vkCreateGraphicsPipelines = reinterpret_cast<PFN_vkCreateGraphicsPipelines>(
      vkGetDeviceProcAddr(vk_device, kvkCreateGraphicsPipelines));
  if (!vkCreateGraphicsPipelines) {
    LogGetProcError(kvkCreateGraphicsPipelines);
    return false;
  }

  constexpr char kvkCreateImage[] = "vkCreateImage";
  vkCreateImage = reinterpret_cast<PFN_vkCreateImage>(
      vkGetDeviceProcAddr(vk_device, kvkCreateImage));
  if (!vkCreateImage) {
    LogGetProcError(kvkCreateImage);
    return false;
  }

  constexpr char kvkCreateImageView[] = "vkCreateImageView";
  vkCreateImageView = reinterpret_cast<PFN_vkCreateImageView>(
      vkGetDeviceProcAddr(vk_device, kvkCreateImageView));
  if (!vkCreateImageView) {
    LogGetProcError(kvkCreateImageView);
    return false;
  }

  constexpr char kvkCreatePipelineLayout[] = "vkCreatePipelineLayout";
  vkCreatePipelineLayout = reinterpret_cast<PFN_vkCreatePipelineLayout>(
      vkGetDeviceProcAddr(vk_device, kvkCreatePipelineLayout));
  if (!vkCreatePipelineLayout) {
    LogGetProcError(kvkCreatePipelineLayout);
    return false;
  }

  constexpr char kvkCreateRenderPass[] = "vkCreateRenderPass";
  vkCreateRenderPass = reinterpret_cast<PFN_vkCreateRenderPass>(
      vkGetDeviceProcAddr(vk_device, kvkCreateRenderPass));
  if (!vkCreateRenderPass) {
    LogGetProcError(kvkCreateRenderPass);
    return false;
  }

  constexpr char kvkCreateSampler[] = "vkCreateSampler";
  vkCreateSampler = reinterpret_cast<PFN_vkCreateSampler>(
      vkGetDeviceProcAddr(vk_device, kvkCreateSampler));
  if (!vkCreateSampler) {
    LogGetProcError(kvkCreateSampler);
    return false;
  }

  constexpr char kvkCreateSemaphore[] = "vkCreateSemaphore";
  vkCreateSemaphore = reinterpret_cast<PFN_vkCreateSemaphore>(
      vkGetDeviceProcAddr(vk_device, kvkCreateSemaphore));
  if (!vkCreateSemaphore) {
    LogGetProcError(kvkCreateSemaphore);
    return false;
  }

  constexpr char kvkCreateShaderModule[] = "vkCreateShaderModule";
  vkCreateShaderModule = reinterpret_cast<PFN_vkCreateShaderModule>(
      vkGetDeviceProcAddr(vk_device, kvkCreateShaderModule));
  if (!vkCreateShaderModule) {
    LogGetProcError(kvkCreateShaderModule);
    return false;
  }

  constexpr char kvkDestroyBuffer[] = "vkDestroyBuffer";
  vkDestroyBuffer = reinterpret_cast<PFN_vkDestroyBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyBuffer));
  if (!vkDestroyBuffer) {
    LogGetProcError(kvkDestroyBuffer);
    return false;
  }

  constexpr char kvkDestroyCommandPool[] = "vkDestroyCommandPool";
  vkDestroyCommandPool = reinterpret_cast<PFN_vkDestroyCommandPool>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyCommandPool));
  if (!vkDestroyCommandPool) {
    LogGetProcError(kvkDestroyCommandPool);
    return false;
  }

  constexpr char kvkDestroyDescriptorPool[] = "vkDestroyDescriptorPool";
  vkDestroyDescriptorPool = reinterpret_cast<PFN_vkDestroyDescriptorPool>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyDescriptorPool));
  if (!vkDestroyDescriptorPool) {
    LogGetProcError(kvkDestroyDescriptorPool);
    return false;
  }

  constexpr char kvkDestroyDescriptorSetLayout[] =
      "vkDestroyDescriptorSetLayout";
  vkDestroyDescriptorSetLayout =
      reinterpret_cast<PFN_vkDestroyDescriptorSetLayout>(
          vkGetDeviceProcAddr(vk_device, kvkDestroyDescriptorSetLayout));
  if (!vkDestroyDescriptorSetLayout) {
    LogGetProcError(kvkDestroyDescriptorSetLayout);
    return false;
  }

  constexpr char kvkDestroyDevice[] = "vkDestroyDevice";
  vkDestroyDevice = reinterpret_cast<PFN_vkDestroyDevice>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyDevice));
  if (!vkDestroyDevice) {
    LogGetProcError(kvkDestroyDevice);
    return false;
  }

  constexpr char kvkDestroyFence[] = "vkDestroyFence";
  vkDestroyFence = reinterpret_cast<PFN_vkDestroyFence>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyFence));
  if (!vkDestroyFence) {
    LogGetProcError(kvkDestroyFence);
    return false;
  }

  constexpr char kvkDestroyFramebuffer[] = "vkDestroyFramebuffer";
  vkDestroyFramebuffer = reinterpret_cast<PFN_vkDestroyFramebuffer>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyFramebuffer));
  if (!vkDestroyFramebuffer) {
    LogGetProcError(kvkDestroyFramebuffer);
    return false;
  }

  constexpr char kvkDestroyImage[] = "vkDestroyImage";
  vkDestroyImage = reinterpret_cast<PFN_vkDestroyImage>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyImage));
  if (!vkDestroyImage) {
    LogGetProcError(kvkDestroyImage);
    return false;
  }

  constexpr char kvkDestroyImageView[] = "vkDestroyImageView";
  vkDestroyImageView = reinterpret_cast<PFN_vkDestroyImageView>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyImageView));
  if (!vkDestroyImageView) {
    LogGetProcError(kvkDestroyImageView);
    return false;
  }

  constexpr char kvkDestroyPipeline[] = "vkDestroyPipeline";
  vkDestroyPipeline = reinterpret_cast<PFN_vkDestroyPipeline>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyPipeline));
  if (!vkDestroyPipeline) {
    LogGetProcError(kvkDestroyPipeline);
    return false;
  }

  constexpr char kvkDestroyPipelineLayout[] = "vkDestroyPipelineLayout";
  vkDestroyPipelineLayout = reinterpret_cast<PFN_vkDestroyPipelineLayout>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyPipelineLayout));
  if (!vkDestroyPipelineLayout) {
    LogGetProcError(kvkDestroyPipelineLayout);
    return false;
  }

  constexpr char kvkDestroyRenderPass[] = "vkDestroyRenderPass";
  vkDestroyRenderPass = reinterpret_cast<PFN_vkDestroyRenderPass>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyRenderPass));
  if (!vkDestroyRenderPass) {
    LogGetProcError(kvkDestroyRenderPass);
    return false;
  }

  constexpr char kvkDestroySampler[] = "vkDestroySampler";
  vkDestroySampler = reinterpret_cast<PFN_vkDestroySampler>(
      vkGetDeviceProcAddr(vk_device, kvkDestroySampler));
  if (!vkDestroySampler) {
    LogGetProcError(kvkDestroySampler);
    return false;
  }

  constexpr char kvkDestroySemaphore[] = "vkDestroySemaphore";
  vkDestroySemaphore = reinterpret_cast<PFN_vkDestroySemaphore>(
      vkGetDeviceProcAddr(vk_device, kvkDestroySemaphore));
  if (!vkDestroySemaphore) {
    LogGetProcError(kvkDestroySemaphore);
    return false;
  }

  constexpr char kvkDestroyShaderModule[] = "vkDestroyShaderModule";
  vkDestroyShaderModule = reinterpret_cast<PFN_vkDestroyShaderModule>(
      vkGetDeviceProcAddr(vk_device, kvkDestroyShaderModule));
  if (!vkDestroyShaderModule) {
    LogGetProcError(kvkDestroyShaderModule);
    return false;
  }

  constexpr char kvkDeviceWaitIdle[] = "vkDeviceWaitIdle";
  vkDeviceWaitIdle = reinterpret_cast<PFN_vkDeviceWaitIdle>(
      vkGetDeviceProcAddr(vk_device, kvkDeviceWaitIdle));
  if (!vkDeviceWaitIdle) {
    LogGetProcError(kvkDeviceWaitIdle);
    return false;
  }

  constexpr char kvkFlushMappedMemoryRanges[] = "vkFlushMappedMemoryRanges";
  vkFlushMappedMemoryRanges = reinterpret_cast<PFN_vkFlushMappedMemoryRanges>(
      vkGetDeviceProcAddr(vk_device, kvkFlushMappedMemoryRanges));
  if (!vkFlushMappedMemoryRanges) {
    LogGetProcError(kvkFlushMappedMemoryRanges);
    return false;
  }

  constexpr char kvkEndCommandBuffer[] = "vkEndCommandBuffer";
  vkEndCommandBuffer = reinterpret_cast<PFN_vkEndCommandBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkEndCommandBuffer));
  if (!vkEndCommandBuffer) {
    LogGetProcError(kvkEndCommandBuffer);
    return false;
  }

  constexpr char kvkFreeCommandBuffers[] = "vkFreeCommandBuffers";
  vkFreeCommandBuffers = reinterpret_cast<PFN_vkFreeCommandBuffers>(
      vkGetDeviceProcAddr(vk_device, kvkFreeCommandBuffers));
  if (!vkFreeCommandBuffers) {
    LogGetProcError(kvkFreeCommandBuffers);
    return false;
  }

  constexpr char kvkFreeDescriptorSets[] = "vkFreeDescriptorSets";
  vkFreeDescriptorSets = reinterpret_cast<PFN_vkFreeDescriptorSets>(
      vkGetDeviceProcAddr(vk_device, kvkFreeDescriptorSets));
  if (!vkFreeDescriptorSets) {
    LogGetProcError(kvkFreeDescriptorSets);
    return false;
  }

  constexpr char kvkFreeMemory[] = "vkFreeMemory";
  vkFreeMemory = reinterpret_cast<PFN_vkFreeMemory>(
      vkGetDeviceProcAddr(vk_device, kvkFreeMemory));
  if (!vkFreeMemory) {
    LogGetProcError(kvkFreeMemory);
    return false;
  }

  constexpr char kvkInvalidateMappedMemoryRanges[] =
      "vkInvalidateMappedMemoryRanges";
  vkInvalidateMappedMemoryRanges =
      reinterpret_cast<PFN_vkInvalidateMappedMemoryRanges>(
          vkGetDeviceProcAddr(vk_device, kvkInvalidateMappedMemoryRanges));
  if (!vkInvalidateMappedMemoryRanges) {
    LogGetProcError(kvkInvalidateMappedMemoryRanges);
    return false;
  }

  constexpr char kvkGetBufferMemoryRequirements[] =
      "vkGetBufferMemoryRequirements";
  vkGetBufferMemoryRequirements =
      reinterpret_cast<PFN_vkGetBufferMemoryRequirements>(
          vkGetDeviceProcAddr(vk_device, kvkGetBufferMemoryRequirements));
  if (!vkGetBufferMemoryRequirements) {
    LogGetProcError(kvkGetBufferMemoryRequirements);
    return false;
  }

  constexpr char kvkGetBufferMemoryRequirements2[] =
      "vkGetBufferMemoryRequirements2";
  vkGetBufferMemoryRequirements2 =
      reinterpret_cast<PFN_vkGetBufferMemoryRequirements2>(
          vkGetDeviceProcAddr(vk_device, kvkGetBufferMemoryRequirements2));
  if (!vkGetBufferMemoryRequirements2) {
    LogGetProcError(kvkGetBufferMemoryRequirements2);
    return false;
  }

  constexpr char kvkGetDeviceQueue[] = "vkGetDeviceQueue";
  vkGetDeviceQueue = reinterpret_cast<PFN_vkGetDeviceQueue>(
      vkGetDeviceProcAddr(vk_device, kvkGetDeviceQueue));
  if (!vkGetDeviceQueue) {
    LogGetProcError(kvkGetDeviceQueue);
    return false;
  }

  constexpr char kvkGetDeviceQueue2[] = "vkGetDeviceQueue2";
  vkGetDeviceQueue2 = reinterpret_cast<PFN_vkGetDeviceQueue2>(
      vkGetDeviceProcAddr(vk_device, kvkGetDeviceQueue2));
  if (!vkGetDeviceQueue2) {
    LogGetProcError(kvkGetDeviceQueue2);
    return false;
  }

  constexpr char kvkGetFenceStatus[] = "vkGetFenceStatus";
  vkGetFenceStatus = reinterpret_cast<PFN_vkGetFenceStatus>(
      vkGetDeviceProcAddr(vk_device, kvkGetFenceStatus));
  if (!vkGetFenceStatus) {
    LogGetProcError(kvkGetFenceStatus);
    return false;
  }

  constexpr char kvkGetImageMemoryRequirements[] =
      "vkGetImageMemoryRequirements";
  vkGetImageMemoryRequirements =
      reinterpret_cast<PFN_vkGetImageMemoryRequirements>(
          vkGetDeviceProcAddr(vk_device, kvkGetImageMemoryRequirements));
  if (!vkGetImageMemoryRequirements) {
    LogGetProcError(kvkGetImageMemoryRequirements);
    return false;
  }

  constexpr char kvkGetImageMemoryRequirements2[] =
      "vkGetImageMemoryRequirements2";
  vkGetImageMemoryRequirements2 =
      reinterpret_cast<PFN_vkGetImageMemoryRequirements2>(
          vkGetDeviceProcAddr(vk_device, kvkGetImageMemoryRequirements2));
  if (!vkGetImageMemoryRequirements2) {
    LogGetProcError(kvkGetImageMemoryRequirements2);
    return false;
  }

  constexpr char kvkGetImageSubresourceLayout[] = "vkGetImageSubresourceLayout";
  vkGetImageSubresourceLayout =
      reinterpret_cast<PFN_vkGetImageSubresourceLayout>(
          vkGetDeviceProcAddr(vk_device, kvkGetImageSubresourceLayout));
  if (!vkGetImageSubresourceLayout) {
    LogGetProcError(kvkGetImageSubresourceLayout);
    return false;
  }

  constexpr char kvkMapMemory[] = "vkMapMemory";
  vkMapMemory = reinterpret_cast<PFN_vkMapMemory>(
      vkGetDeviceProcAddr(vk_device, kvkMapMemory));
  if (!vkMapMemory) {
    LogGetProcError(kvkMapMemory);
    return false;
  }

  constexpr char kvkQueueSubmit[] = "vkQueueSubmit";
  vkQueueSubmit = reinterpret_cast<PFN_vkQueueSubmit>(
      vkGetDeviceProcAddr(vk_device, kvkQueueSubmit));
  if (!vkQueueSubmit) {
    LogGetProcError(kvkQueueSubmit);
    return false;
  }

  constexpr char kvkQueueWaitIdle[] = "vkQueueWaitIdle";
  vkQueueWaitIdle = reinterpret_cast<PFN_vkQueueWaitIdle>(
      vkGetDeviceProcAddr(vk_device, kvkQueueWaitIdle));
  if (!vkQueueWaitIdle) {
    LogGetProcError(kvkQueueWaitIdle);
    return false;
  }

  constexpr char kvkResetCommandBuffer[] = "vkResetCommandBuffer";
  vkResetCommandBuffer = reinterpret_cast<PFN_vkResetCommandBuffer>(
      vkGetDeviceProcAddr(vk_device, kvkResetCommandBuffer));
  if (!vkResetCommandBuffer) {
    LogGetProcError(kvkResetCommandBuffer);
    return false;
  }

  constexpr char kvkResetFences[] = "vkResetFences";
  vkResetFences = reinterpret_cast<PFN_vkResetFences>(
      vkGetDeviceProcAddr(vk_device, kvkResetFences));
  if (!vkResetFences) {
    LogGetProcError(kvkResetFences);
    return false;
  }

  constexpr char kvkUnmapMemory[] = "vkUnmapMemory";
  vkUnmapMemory = reinterpret_cast<PFN_vkUnmapMemory>(
      vkGetDeviceProcAddr(vk_device, kvkUnmapMemory));
  if (!vkUnmapMemory) {
    LogGetProcError(kvkUnmapMemory);
    return false;
  }

  constexpr char kvkUpdateDescriptorSets[] = "vkUpdateDescriptorSets";
  vkUpdateDescriptorSets = reinterpret_cast<PFN_vkUpdateDescriptorSets>(
      vkGetDeviceProcAddr(vk_device, kvkUpdateDescriptorSets));
  if (!vkUpdateDescriptorSets) {
    LogGetProcError(kvkUpdateDescriptorSets);
    return false;
  }

  constexpr char kvkWaitForFences[] = "vkWaitForFences";
  vkWaitForFences = reinterpret_cast<PFN_vkWaitForFences>(
      vkGetDeviceProcAddr(vk_device, kvkWaitForFences));
  if (!vkWaitForFences) {
    LogGetProcError(kvkWaitForFences);
    return false;
  }

#if BUILDFLAG(IS_ANDROID)
  if (gfx::HasExtension(
          enabled_extensions,
          VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) {
    constexpr char kvkGetAndroidHardwareBufferPropertiesANDROID[] =
        "vkGetAndroidHardwareBufferPropertiesANDROID";
    vkGetAndroidHardwareBufferPropertiesANDROID =
        reinterpret_cast<PFN_vkGetAndroidHardwareBufferPropertiesANDROID>(
            vkGetDeviceProcAddr(vk_device,
                                kvkGetAndroidHardwareBufferPropertiesANDROID));
    if (!vkGetAndroidHardwareBufferPropertiesANDROID) {
      LogGetProcError(kvkGetAndroidHardwareBufferPropertiesANDROID);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_POSIX)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)) {
    constexpr char kvkGetSemaphoreFdKHR[] = "vkGetSemaphoreFdKHR";
    vkGetSemaphoreFdKHR = reinterpret_cast<PFN_vkGetSemaphoreFdKHR>(
        vkGetDeviceProcAddr(vk_device, kvkGetSemaphoreFdKHR));
    if (!vkGetSemaphoreFdKHR) {
      LogGetProcError(kvkGetSemaphoreFdKHR);
      return false;
    }

    constexpr char kvkImportSemaphoreFdKHR[] = "vkImportSemaphoreFdKHR";
    vkImportSemaphoreFdKHR = reinterpret_cast<PFN_vkImportSemaphoreFdKHR>(
        vkGetDeviceProcAddr(vk_device, kvkImportSemaphoreFdKHR));
    if (!vkImportSemaphoreFdKHR) {
      LogGetProcError(kvkImportSemaphoreFdKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_POSIX)

#if BUILDFLAG(IS_WIN)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME)) {
    constexpr char kvkGetSemaphoreWin32HandleKHR[] =
        "vkGetSemaphoreWin32HandleKHR";
    vkGetSemaphoreWin32HandleKHR =
        reinterpret_cast<PFN_vkGetSemaphoreWin32HandleKHR>(
            vkGetDeviceProcAddr(vk_device, kvkGetSemaphoreWin32HandleKHR));
    if (!vkGetSemaphoreWin32HandleKHR) {
      LogGetProcError(kvkGetSemaphoreWin32HandleKHR);
      return false;
    }

    constexpr char kvkImportSemaphoreWin32HandleKHR[] =
        "vkImportSemaphoreWin32HandleKHR";
    vkImportSemaphoreWin32HandleKHR =
        reinterpret_cast<PFN_vkImportSemaphoreWin32HandleKHR>(
            vkGetDeviceProcAddr(vk_device, kvkImportSemaphoreWin32HandleKHR));
    if (!vkImportSemaphoreWin32HandleKHR) {
      LogGetProcError(kvkImportSemaphoreWin32HandleKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_POSIX)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)) {
    constexpr char kvkGetMemoryFdKHR[] = "vkGetMemoryFdKHR";
    vkGetMemoryFdKHR = reinterpret_cast<PFN_vkGetMemoryFdKHR>(
        vkGetDeviceProcAddr(vk_device, kvkGetMemoryFdKHR));
    if (!vkGetMemoryFdKHR) {
      LogGetProcError(kvkGetMemoryFdKHR);
      return false;
    }

    constexpr char kvkGetMemoryFdPropertiesKHR[] = "vkGetMemoryFdPropertiesKHR";
    vkGetMemoryFdPropertiesKHR =
        reinterpret_cast<PFN_vkGetMemoryFdPropertiesKHR>(
            vkGetDeviceProcAddr(vk_device, kvkGetMemoryFdPropertiesKHR));
    if (!vkGetMemoryFdPropertiesKHR) {
      LogGetProcError(kvkGetMemoryFdPropertiesKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_POSIX)

#if BUILDFLAG(IS_WIN)
  if (gfx::HasExtension(enabled_extensions,
                        VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME)) {
    constexpr char kvkGetMemoryWin32HandleKHR[] = "vkGetMemoryWin32HandleKHR";
    vkGetMemoryWin32HandleKHR = reinterpret_cast<PFN_vkGetMemoryWin32HandleKHR>(
        vkGetDeviceProcAddr(vk_device, kvkGetMemoryWin32HandleKHR));
    if (!vkGetMemoryWin32HandleKHR) {
      LogGetProcError(kvkGetMemoryWin32HandleKHR);
      return false;
    }

    constexpr char kvkGetMemoryWin32HandlePropertiesKHR[] =
        "vkGetMemoryWin32HandlePropertiesKHR";
    vkGetMemoryWin32HandlePropertiesKHR =
        reinterpret_cast<PFN_vkGetMemoryWin32HandlePropertiesKHR>(
            vkGetDeviceProcAddr(vk_device,
                                kvkGetMemoryWin32HandlePropertiesKHR));
    if (!vkGetMemoryWin32HandlePropertiesKHR) {
      LogGetProcError(kvkGetMemoryWin32HandlePropertiesKHR);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_FUCHSIA)
  if (gfx::HasExtension(enabled_extensions,
                        VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME)) {
    constexpr char kvkImportSemaphoreZirconHandleFUCHSIA[] =
        "vkImportSemaphoreZirconHandleFUCHSIA";
    vkImportSemaphoreZirconHandleFUCHSIA =
        reinterpret_cast<PFN_vkImportSemaphoreZirconHandleFUCHSIA>(
            vkGetDeviceProcAddr(vk_device,
                                kvkImportSemaphoreZirconHandleFUCHSIA));
    if (!vkImportSemaphoreZirconHandleFUCHSIA) {
      LogGetProcError(kvkImportSemaphoreZirconHandleFUCHSIA);
      return false;
    }

    constexpr char kvkGetSemaphoreZirconHandleFUCHSIA[] =
        "vkGetSemaphoreZirconHandleFUCHSIA";
    vkGetSemaphoreZirconHandleFUCHSIA =
        reinterpret_cast<PFN_vkGetSemaphoreZirconHandleFUCHSIA>(
            vkGetDeviceProcAddr(vk_device, kvkGetSemaphoreZirconHandleFUCHSIA));
    if (!vkGetSemaphoreZirconHandleFUCHSIA) {
      LogGetProcError(kvkGetSemaphoreZirconHandleFUCHSIA);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_FUCHSIA)

#if BUILDFLAG(IS_FUCHSIA)
  if (gfx::HasExtension(enabled_extensions,
                        VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME)) {
    constexpr char kvkGetMemoryZirconHandleFUCHSIA[] =
        "vkGetMemoryZirconHandleFUCHSIA";
    vkGetMemoryZirconHandleFUCHSIA =
        reinterpret_cast<PFN_vkGetMemoryZirconHandleFUCHSIA>(
            vkGetDeviceProcAddr(vk_device, kvkGetMemoryZirconHandleFUCHSIA));
    if (!vkGetMemoryZirconHandleFUCHSIA) {
      LogGetProcError(kvkGetMemoryZirconHandleFUCHSIA);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_FUCHSIA)

#if BUILDFLAG(IS_FUCHSIA)
  if (gfx::HasExtension(enabled_extensions,
                        VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME)) {
    constexpr char kvkCreateBufferCollectionFUCHSIA[] =
        "vkCreateBufferCollectionFUCHSIA";
    vkCreateBufferCollectionFUCHSIA =
        reinterpret_cast<PFN_vkCreateBufferCollectionFUCHSIA>(
            vkGetDeviceProcAddr(vk_device, kvkCreateBufferCollectionFUCHSIA));
    if (!vkCreateBufferCollectionFUCHSIA) {
      LogGetProcError(kvkCreateBufferCollectionFUCHSIA);
      return false;
    }

    constexpr char kvkSetBufferCollectionImageConstraintsFUCHSIA[] =
        "vkSetBufferCollectionImageConstraintsFUCHSIA";
    vkSetBufferCollectionImageConstraintsFUCHSIA =
        reinterpret_cast<PFN_vkSetBufferCollectionImageConstraintsFUCHSIA>(
            vkGetDeviceProcAddr(vk_device,
                                kvkSetBufferCollectionImageConstraintsFUCHSIA));
    if (!vkSetBufferCollectionImageConstraintsFUCHSIA) {
      LogGetProcError(kvkSetBufferCollectionImageConstraintsFUCHSIA);
      return false;
    }

    constexpr char kvkGetBufferCollectionPropertiesFUCHSIA[] =
        "vkGetBufferCollectionPropertiesFUCHSIA";
    vkGetBufferCollectionPropertiesFUCHSIA =
        reinterpret_cast<PFN_vkGetBufferCollectionPropertiesFUCHSIA>(
            vkGetDeviceProcAddr(vk_device,
                                kvkGetBufferCollectionPropertiesFUCHSIA));
    if (!vkGetBufferCollectionPropertiesFUCHSIA) {
      LogGetProcError(kvkGetBufferCollectionPropertiesFUCHSIA);
      return false;
    }

    constexpr char kvkDestroyBufferCollectionFUCHSIA[] =
        "vkDestroyBufferCollectionFUCHSIA";
    vkDestroyBufferCollectionFUCHSIA =
        reinterpret_cast<PFN_vkDestroyBufferCollectionFUCHSIA>(
            vkGetDeviceProcAddr(vk_device, kvkDestroyBufferCollectionFUCHSIA));
    if (!vkDestroyBufferCollectionFUCHSIA) {
      LogGetProcError(kvkDestroyBufferCollectionFUCHSIA);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_FUCHSIA)

  if (gfx::HasExtension(enabled_extensions, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
    constexpr char kvkAcquireNextImageKHR[] = "vkAcquireNextImageKHR";
    vkAcquireNextImageKHR = reinterpret_cast<PFN_vkAcquireNextImageKHR>(
        vkGetDeviceProcAddr(vk_device, kvkAcquireNextImageKHR));
    if (!vkAcquireNextImageKHR) {
      LogGetProcError(kvkAcquireNextImageKHR);
      return false;
    }

    constexpr char kvkCreateSwapchainKHR[] = "vkCreateSwapchainKHR";
    vkCreateSwapchainKHR = reinterpret_cast<PFN_vkCreateSwapchainKHR>(
        vkGetDeviceProcAddr(vk_device, kvkCreateSwapchainKHR));
    if (!vkCreateSwapchainKHR) {
      LogGetProcError(kvkCreateSwapchainKHR);
      return false;
    }

    constexpr char kvkDestroySwapchainKHR[] = "vkDestroySwapchainKHR";
    vkDestroySwapchainKHR = reinterpret_cast<PFN_vkDestroySwapchainKHR>(
        vkGetDeviceProcAddr(vk_device, kvkDestroySwapchainKHR));
    if (!vkDestroySwapchainKHR) {
      LogGetProcError(kvkDestroySwapchainKHR);
      return false;
    }

    constexpr char kvkGetSwapchainImagesKHR[] = "vkGetSwapchainImagesKHR";
    vkGetSwapchainImagesKHR = reinterpret_cast<PFN_vkGetSwapchainImagesKHR>(
        vkGetDeviceProcAddr(vk_device, kvkGetSwapchainImagesKHR));
    if (!vkGetSwapchainImagesKHR) {
      LogGetProcError(kvkGetSwapchainImagesKHR);
      return false;
    }

    constexpr char kvkQueuePresentKHR[] = "vkQueuePresentKHR";
    vkQueuePresentKHR = reinterpret_cast<PFN_vkQueuePresentKHR>(
        vkGetDeviceProcAddr(vk_device, kvkQueuePresentKHR));
    if (!vkQueuePresentKHR) {
      LogGetProcError(kvkQueuePresentKHR);
      return false;
    }
  }

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  if (gfx::HasExtension(enabled_extensions,
                        VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME)) {
    constexpr char kvkGetImageDrmFormatModifierPropertiesEXT[] =
        "vkGetImageDrmFormatModifierPropertiesEXT";
    vkGetImageDrmFormatModifierPropertiesEXT =
        reinterpret_cast<PFN_vkGetImageDrmFormatModifierPropertiesEXT>(
            vkGetDeviceProcAddr(vk_device,
                                kvkGetImageDrmFormatModifierPropertiesEXT));
    if (!vkGetImageDrmFormatModifierPropertiesEXT) {
      LogGetProcError(kvkGetImageDrmFormatModifierPropertiesEXT);
      return false;
    }
  }
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)

  return true;
}

void VulkanFunctionPointers::ResetForTesting() {
  base::AutoLock lock(write_lock_);

  per_queue_lock_map.clear();
  loader_library_ = nullptr;
  vkGetInstanceProcAddr = nullptr;

  vkEnumerateInstanceVersion = nullptr;
  vkCreateInstance = nullptr;
  vkEnumerateInstanceExtensionProperties = nullptr;
  vkEnumerateInstanceLayerProperties = nullptr;

  vkCreateDevice = nullptr;
  vkDestroyInstance = nullptr;
  vkEnumerateDeviceExtensionProperties = nullptr;
  vkEnumerateDeviceLayerProperties = nullptr;
  vkEnumeratePhysicalDevices = nullptr;
  vkGetDeviceProcAddr = nullptr;
  vkGetPhysicalDeviceExternalSemaphoreProperties = nullptr;
  vkGetPhysicalDeviceFeatures2 = nullptr;
  vkGetPhysicalDeviceFormatProperties = nullptr;
  vkGetPhysicalDeviceFormatProperties2 = nullptr;
  vkGetPhysicalDeviceImageFormatProperties2 = nullptr;
  vkGetPhysicalDeviceMemoryProperties = nullptr;
  vkGetPhysicalDeviceMemoryProperties2 = nullptr;
  vkGetPhysicalDeviceProperties = nullptr;
  vkGetPhysicalDeviceProperties2 = nullptr;
  vkGetPhysicalDeviceQueueFamilyProperties = nullptr;

#if DCHECK_IS_ON()
  vkCreateDebugReportCallbackEXT = nullptr;
  vkDestroyDebugReportCallbackEXT = nullptr;
#endif  // DCHECK_IS_ON()

  vkDestroySurfaceKHR = nullptr;
  vkGetPhysicalDeviceSurfaceCapabilitiesKHR = nullptr;
  vkGetPhysicalDeviceSurfaceFormatsKHR = nullptr;
  vkGetPhysicalDeviceSurfaceSupportKHR = nullptr;

  vkCreateHeadlessSurfaceEXT = nullptr;

#if defined(USE_VULKAN_XCB)
  vkCreateXcbSurfaceKHR = nullptr;
  vkGetPhysicalDeviceXcbPresentationSupportKHR = nullptr;
#endif  // defined(USE_VULKAN_XCB)

#if BUILDFLAG(IS_WIN)
  vkCreateWin32SurfaceKHR = nullptr;
  vkGetPhysicalDeviceWin32PresentationSupportKHR = nullptr;
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_ANDROID)
  vkCreateAndroidSurfaceKHR = nullptr;
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_FUCHSIA)
  vkCreateImagePipeSurfaceFUCHSIA = nullptr;
#endif  // BUILDFLAG(IS_FUCHSIA)

  vkAllocateCommandBuffers = nullptr;
  vkAllocateDescriptorSets = nullptr;
  vkAllocateMemory = nullptr;
  vkBeginCommandBuffer = nullptr;
  vkBindBufferMemory = nullptr;
  vkBindBufferMemory2 = nullptr;
  vkBindImageMemory = nullptr;
  vkBindImageMemory2 = nullptr;
  vkCmdBeginRenderPass = nullptr;
  vkCmdBindDescriptorSets = nullptr;
  vkCmdBindPipeline = nullptr;
  vkCmdBindVertexBuffers = nullptr;
  vkCmdCopyBuffer = nullptr;
  vkCmdCopyBufferToImage = nullptr;
  vkCmdCopyImage = nullptr;
  vkCmdCopyImageToBuffer = nullptr;
  vkCmdDraw = nullptr;
  vkCmdEndRenderPass = nullptr;
  vkCmdExecuteCommands = nullptr;
  vkCmdNextSubpass = nullptr;
  vkCmdPipelineBarrier = nullptr;
  vkCmdPushConstants = nullptr;
  vkCmdSetScissor = nullptr;
  vkCmdSetViewport = nullptr;
  vkCreateBuffer = nullptr;
  vkCreateCommandPool = nullptr;
  vkCreateDescriptorPool = nullptr;
  vkCreateDescriptorSetLayout = nullptr;
  vkCreateFence = nullptr;
  vkCreateFramebuffer = nullptr;
  vkCreateGraphicsPipelines = nullptr;
  vkCreateImage = nullptr;
  vkCreateImageView = nullptr;
  vkCreatePipelineLayout = nullptr;
  vkCreateRenderPass = nullptr;
  vkCreateSampler = nullptr;
  vkCreateSemaphore = nullptr;
  vkCreateShaderModule = nullptr;
  vkDestroyBuffer = nullptr;
  vkDestroyCommandPool = nullptr;
  vkDestroyDescriptorPool = nullptr;
  vkDestroyDescriptorSetLayout = nullptr;
  vkDestroyDevice = nullptr;
  vkDestroyFence = nullptr;
  vkDestroyFramebuffer = nullptr;
  vkDestroyImage = nullptr;
  vkDestroyImageView = nullptr;
  vkDestroyPipeline = nullptr;
  vkDestroyPipelineLayout = nullptr;
  vkDestroyRenderPass = nullptr;
  vkDestroySampler = nullptr;
  vkDestroySemaphore = nullptr;
  vkDestroyShaderModule = nullptr;
  vkDeviceWaitIdle = nullptr;
  vkFlushMappedMemoryRanges = nullptr;
  vkEndCommandBuffer = nullptr;
  vkFreeCommandBuffers = nullptr;
  vkFreeDescriptorSets = nullptr;
  vkFreeMemory = nullptr;
  vkInvalidateMappedMemoryRanges = nullptr;
  vkGetBufferMemoryRequirements = nullptr;
  vkGetBufferMemoryRequirements2 = nullptr;
  vkGetDeviceQueue = nullptr;
  vkGetDeviceQueue2 = nullptr;
  vkGetFenceStatus = nullptr;
  vkGetImageMemoryRequirements = nullptr;
  vkGetImageMemoryRequirements2 = nullptr;
  vkGetImageSubresourceLayout = nullptr;
  vkMapMemory = nullptr;
  vkQueueSubmit = nullptr;
  vkQueueWaitIdle = nullptr;
  vkResetCommandBuffer = nullptr;
  vkResetFences = nullptr;
  vkUnmapMemory = nullptr;
  vkUpdateDescriptorSets = nullptr;
  vkWaitForFences = nullptr;

#if BUILDFLAG(IS_ANDROID)
  vkGetAndroidHardwareBufferPropertiesANDROID = nullptr;
#endif  // BUILDFLAG(IS_ANDROID)

#if BUILDFLAG(IS_POSIX)
  vkGetSemaphoreFdKHR = nullptr;
  vkImportSemaphoreFdKHR = nullptr;
#endif  // BUILDFLAG(IS_POSIX)

#if BUILDFLAG(IS_WIN)
  vkGetSemaphoreWin32HandleKHR = nullptr;
  vkImportSemaphoreWin32HandleKHR = nullptr;
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_POSIX)
  vkGetMemoryFdKHR = nullptr;
  vkGetMemoryFdPropertiesKHR = nullptr;
#endif  // BUILDFLAG(IS_POSIX)

#if BUILDFLAG(IS_WIN)
  vkGetMemoryWin32HandleKHR = nullptr;
  vkGetMemoryWin32HandlePropertiesKHR = nullptr;
#endif  // BUILDFLAG(IS_WIN)

#if BUILDFLAG(IS_FUCHSIA)
  vkImportSemaphoreZirconHandleFUCHSIA = nullptr;
  vkGetSemaphoreZirconHandleFUCHSIA = nullptr;
#endif  // BUILDFLAG(IS_FUCHSIA)

#if BUILDFLAG(IS_FUCHSIA)
  vkGetMemoryZirconHandleFUCHSIA = nullptr;
#endif  // BUILDFLAG(IS_FUCHSIA)

#if BUILDFLAG(IS_FUCHSIA)
  vkCreateBufferCollectionFUCHSIA = nullptr;
  vkSetBufferCollectionImageConstraintsFUCHSIA = nullptr;
  vkGetBufferCollectionPropertiesFUCHSIA = nullptr;
  vkDestroyBufferCollectionFUCHSIA = nullptr;
#endif  // BUILDFLAG(IS_FUCHSIA)

  vkAcquireNextImageKHR = nullptr;
  vkCreateSwapchainKHR = nullptr;
  vkDestroySwapchainKHR = nullptr;
  vkGetSwapchainImagesKHR = nullptr;
  vkQueuePresentKHR = nullptr;

#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  vkGetImageDrmFormatModifierPropertiesEXT = nullptr;
#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
}

}  // namespace gpu