Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f38ec8ab authored by Chris Forbes's avatar Chris Forbes Committed by Android (Google) Code Review
Browse files

Merge "vulkan: Add support for non-fatal missing functions in vulkan loader"

parents 6fb63696 5948b3ea
Loading
Loading
Loading
Loading
+148 −148
Original line number Diff line number Diff line
@@ -29,11 +29,11 @@ namespace api {

#define UNLIKELY(expr) __builtin_expect((expr), 0)

#define INIT_PROC(obj, proc)                                           \
#define INIT_PROC(required, obj, proc)                                 \
    do {                                                               \
        data.dispatch.proc =                                           \
            reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
        if (UNLIKELY(!data.dispatch.proc)) {                           \
        if (UNLIKELY(required && !data.dispatch.proc)) {               \
            ALOGE("missing " #obj " proc: vk" #proc);                  \
            success = false;                                           \
        }                                                              \
@@ -41,10 +41,10 @@ namespace api {

// Exported extension functions may be invoked even when their extensions
// are disabled.  Dispatch to stubs when that happens.
#define INIT_PROC_EXT(ext, obj, proc)            \
#define INIT_PROC_EXT(ext, required, obj, proc)  \
    do {                                         \
        if (extensions[driver::ProcHook::ext])   \
            INIT_PROC(obj, proc);                \
            INIT_PROC(required, obj, proc);      \
        else                                     \
            data.dispatch.proc = disabled##proc; \
    } while (0)
@@ -118,24 +118,24 @@ bool InitDispatchTable(
    bool success = true;

    // clang-format off
    INIT_PROC(instance, DestroyInstance);
    INIT_PROC(instance, EnumeratePhysicalDevices);
    INIT_PROC(instance, GetInstanceProcAddr);
    INIT_PROC(instance, GetPhysicalDeviceProperties);
    INIT_PROC(instance, GetPhysicalDeviceQueueFamilyProperties);
    INIT_PROC(instance, GetPhysicalDeviceMemoryProperties);
    INIT_PROC(instance, GetPhysicalDeviceFeatures);
    INIT_PROC(instance, GetPhysicalDeviceFormatProperties);
    INIT_PROC(instance, GetPhysicalDeviceImageFormatProperties);
    INIT_PROC(instance, CreateDevice);
    INIT_PROC(instance, EnumerateDeviceExtensionProperties);
    INIT_PROC(instance, GetPhysicalDeviceSparseImageFormatProperties);
    INIT_PROC_EXT(KHR_surface, instance, DestroySurfaceKHR);
    INIT_PROC_EXT(KHR_surface, instance, GetPhysicalDeviceSurfaceSupportKHR);
    INIT_PROC_EXT(KHR_surface, instance, GetPhysicalDeviceSurfaceCapabilitiesKHR);
    INIT_PROC_EXT(KHR_surface, instance, GetPhysicalDeviceSurfaceFormatsKHR);
    INIT_PROC_EXT(KHR_surface, instance, GetPhysicalDeviceSurfacePresentModesKHR);
    INIT_PROC_EXT(KHR_android_surface, instance, CreateAndroidSurfaceKHR);
    INIT_PROC(true, instance, DestroyInstance);
    INIT_PROC(true, instance, EnumeratePhysicalDevices);
    INIT_PROC(true, instance, GetInstanceProcAddr);
    INIT_PROC(true, instance, GetPhysicalDeviceProperties);
    INIT_PROC(true, instance, GetPhysicalDeviceQueueFamilyProperties);
    INIT_PROC(true, instance, GetPhysicalDeviceMemoryProperties);
    INIT_PROC(true, instance, GetPhysicalDeviceFeatures);
    INIT_PROC(true, instance, GetPhysicalDeviceFormatProperties);
    INIT_PROC(true, instance, GetPhysicalDeviceImageFormatProperties);
    INIT_PROC(true, instance, CreateDevice);
    INIT_PROC(true, instance, EnumerateDeviceExtensionProperties);
    INIT_PROC(true, instance, GetPhysicalDeviceSparseImageFormatProperties);
    INIT_PROC_EXT(KHR_surface, true, instance, DestroySurfaceKHR);
    INIT_PROC_EXT(KHR_surface, true, instance, GetPhysicalDeviceSurfaceSupportKHR);
    INIT_PROC_EXT(KHR_surface, true, instance, GetPhysicalDeviceSurfaceCapabilitiesKHR);
    INIT_PROC_EXT(KHR_surface, true, instance, GetPhysicalDeviceSurfaceFormatsKHR);
    INIT_PROC_EXT(KHR_surface, true, instance, GetPhysicalDeviceSurfacePresentModesKHR);
    INIT_PROC_EXT(KHR_android_surface, true, instance, CreateAndroidSurfaceKHR);
    // clang-format on

    return success;
@@ -149,132 +149,132 @@ bool InitDispatchTable(
    bool success = true;

    // clang-format off
    INIT_PROC(dev, GetDeviceProcAddr);
    INIT_PROC(dev, DestroyDevice);
    INIT_PROC(dev, GetDeviceQueue);
    INIT_PROC(dev, QueueSubmit);
    INIT_PROC(dev, QueueWaitIdle);
    INIT_PROC(dev, DeviceWaitIdle);
    INIT_PROC(dev, AllocateMemory);
    INIT_PROC(dev, FreeMemory);
    INIT_PROC(dev, MapMemory);
    INIT_PROC(dev, UnmapMemory);
    INIT_PROC(dev, FlushMappedMemoryRanges);
    INIT_PROC(dev, InvalidateMappedMemoryRanges);
    INIT_PROC(dev, GetDeviceMemoryCommitment);
    INIT_PROC(dev, GetBufferMemoryRequirements);
    INIT_PROC(dev, BindBufferMemory);
    INIT_PROC(dev, GetImageMemoryRequirements);
    INIT_PROC(dev, BindImageMemory);
    INIT_PROC(dev, GetImageSparseMemoryRequirements);
    INIT_PROC(dev, QueueBindSparse);
    INIT_PROC(dev, CreateFence);
    INIT_PROC(dev, DestroyFence);
    INIT_PROC(dev, ResetFences);
    INIT_PROC(dev, GetFenceStatus);
    INIT_PROC(dev, WaitForFences);
    INIT_PROC(dev, CreateSemaphore);
    INIT_PROC(dev, DestroySemaphore);
    INIT_PROC(dev, CreateEvent);
    INIT_PROC(dev, DestroyEvent);
    INIT_PROC(dev, GetEventStatus);
    INIT_PROC(dev, SetEvent);
    INIT_PROC(dev, ResetEvent);
    INIT_PROC(dev, CreateQueryPool);
    INIT_PROC(dev, DestroyQueryPool);
    INIT_PROC(dev, GetQueryPoolResults);
    INIT_PROC(dev, CreateBuffer);
    INIT_PROC(dev, DestroyBuffer);
    INIT_PROC(dev, CreateBufferView);
    INIT_PROC(dev, DestroyBufferView);
    INIT_PROC(dev, CreateImage);
    INIT_PROC(dev, DestroyImage);
    INIT_PROC(dev, GetImageSubresourceLayout);
    INIT_PROC(dev, CreateImageView);
    INIT_PROC(dev, DestroyImageView);
    INIT_PROC(dev, CreateShaderModule);
    INIT_PROC(dev, DestroyShaderModule);
    INIT_PROC(dev, CreatePipelineCache);
    INIT_PROC(dev, DestroyPipelineCache);
    INIT_PROC(dev, GetPipelineCacheData);
    INIT_PROC(dev, MergePipelineCaches);
    INIT_PROC(dev, CreateGraphicsPipelines);
    INIT_PROC(dev, CreateComputePipelines);
    INIT_PROC(dev, DestroyPipeline);
    INIT_PROC(dev, CreatePipelineLayout);
    INIT_PROC(dev, DestroyPipelineLayout);
    INIT_PROC(dev, CreateSampler);
    INIT_PROC(dev, DestroySampler);
    INIT_PROC(dev, CreateDescriptorSetLayout);
    INIT_PROC(dev, DestroyDescriptorSetLayout);
    INIT_PROC(dev, CreateDescriptorPool);
    INIT_PROC(dev, DestroyDescriptorPool);
    INIT_PROC(dev, ResetDescriptorPool);
    INIT_PROC(dev, AllocateDescriptorSets);
    INIT_PROC(dev, FreeDescriptorSets);
    INIT_PROC(dev, UpdateDescriptorSets);
    INIT_PROC(dev, CreateFramebuffer);
    INIT_PROC(dev, DestroyFramebuffer);
    INIT_PROC(dev, CreateRenderPass);
    INIT_PROC(dev, DestroyRenderPass);
    INIT_PROC(dev, GetRenderAreaGranularity);
    INIT_PROC(dev, CreateCommandPool);
    INIT_PROC(dev, DestroyCommandPool);
    INIT_PROC(dev, ResetCommandPool);
    INIT_PROC(dev, AllocateCommandBuffers);
    INIT_PROC(dev, FreeCommandBuffers);
    INIT_PROC(dev, BeginCommandBuffer);
    INIT_PROC(dev, EndCommandBuffer);
    INIT_PROC(dev, ResetCommandBuffer);
    INIT_PROC(dev, CmdBindPipeline);
    INIT_PROC(dev, CmdSetViewport);
    INIT_PROC(dev, CmdSetScissor);
    INIT_PROC(dev, CmdSetLineWidth);
    INIT_PROC(dev, CmdSetDepthBias);
    INIT_PROC(dev, CmdSetBlendConstants);
    INIT_PROC(dev, CmdSetDepthBounds);
    INIT_PROC(dev, CmdSetStencilCompareMask);
    INIT_PROC(dev, CmdSetStencilWriteMask);
    INIT_PROC(dev, CmdSetStencilReference);
    INIT_PROC(dev, CmdBindDescriptorSets);
    INIT_PROC(dev, CmdBindIndexBuffer);
    INIT_PROC(dev, CmdBindVertexBuffers);
    INIT_PROC(dev, CmdDraw);
    INIT_PROC(dev, CmdDrawIndexed);
    INIT_PROC(dev, CmdDrawIndirect);
    INIT_PROC(dev, CmdDrawIndexedIndirect);
    INIT_PROC(dev, CmdDispatch);
    INIT_PROC(dev, CmdDispatchIndirect);
    INIT_PROC(dev, CmdCopyBuffer);
    INIT_PROC(dev, CmdCopyImage);
    INIT_PROC(dev, CmdBlitImage);
    INIT_PROC(dev, CmdCopyBufferToImage);
    INIT_PROC(dev, CmdCopyImageToBuffer);
    INIT_PROC(dev, CmdUpdateBuffer);
    INIT_PROC(dev, CmdFillBuffer);
    INIT_PROC(dev, CmdClearColorImage);
    INIT_PROC(dev, CmdClearDepthStencilImage);
    INIT_PROC(dev, CmdClearAttachments);
    INIT_PROC(dev, CmdResolveImage);
    INIT_PROC(dev, CmdSetEvent);
    INIT_PROC(dev, CmdResetEvent);
    INIT_PROC(dev, CmdWaitEvents);
    INIT_PROC(dev, CmdPipelineBarrier);
    INIT_PROC(dev, CmdBeginQuery);
    INIT_PROC(dev, CmdEndQuery);
    INIT_PROC(dev, CmdResetQueryPool);
    INIT_PROC(dev, CmdWriteTimestamp);
    INIT_PROC(dev, CmdCopyQueryPoolResults);
    INIT_PROC(dev, CmdPushConstants);
    INIT_PROC(dev, CmdBeginRenderPass);
    INIT_PROC(dev, CmdNextSubpass);
    INIT_PROC(dev, CmdEndRenderPass);
    INIT_PROC(dev, CmdExecuteCommands);
    INIT_PROC_EXT(KHR_swapchain, dev, CreateSwapchainKHR);
    INIT_PROC_EXT(KHR_swapchain, dev, DestroySwapchainKHR);
    INIT_PROC_EXT(KHR_swapchain, dev, GetSwapchainImagesKHR);
    INIT_PROC_EXT(KHR_swapchain, dev, AcquireNextImageKHR);
    INIT_PROC_EXT(KHR_swapchain, dev, QueuePresentKHR);
    INIT_PROC(true, dev, GetDeviceProcAddr);
    INIT_PROC(true, dev, DestroyDevice);
    INIT_PROC(true, dev, GetDeviceQueue);
    INIT_PROC(true, dev, QueueSubmit);
    INIT_PROC(true, dev, QueueWaitIdle);
    INIT_PROC(true, dev, DeviceWaitIdle);
    INIT_PROC(true, dev, AllocateMemory);
    INIT_PROC(true, dev, FreeMemory);
    INIT_PROC(true, dev, MapMemory);
    INIT_PROC(true, dev, UnmapMemory);
    INIT_PROC(true, dev, FlushMappedMemoryRanges);
    INIT_PROC(true, dev, InvalidateMappedMemoryRanges);
    INIT_PROC(true, dev, GetDeviceMemoryCommitment);
    INIT_PROC(true, dev, GetBufferMemoryRequirements);
    INIT_PROC(true, dev, BindBufferMemory);
    INIT_PROC(true, dev, GetImageMemoryRequirements);
    INIT_PROC(true, dev, BindImageMemory);
    INIT_PROC(true, dev, GetImageSparseMemoryRequirements);
    INIT_PROC(true, dev, QueueBindSparse);
    INIT_PROC(true, dev, CreateFence);
    INIT_PROC(true, dev, DestroyFence);
    INIT_PROC(true, dev, ResetFences);
    INIT_PROC(true, dev, GetFenceStatus);
    INIT_PROC(true, dev, WaitForFences);
    INIT_PROC(true, dev, CreateSemaphore);
    INIT_PROC(true, dev, DestroySemaphore);
    INIT_PROC(true, dev, CreateEvent);
    INIT_PROC(true, dev, DestroyEvent);
    INIT_PROC(true, dev, GetEventStatus);
    INIT_PROC(true, dev, SetEvent);
    INIT_PROC(true, dev, ResetEvent);
    INIT_PROC(true, dev, CreateQueryPool);
    INIT_PROC(true, dev, DestroyQueryPool);
    INIT_PROC(true, dev, GetQueryPoolResults);
    INIT_PROC(true, dev, CreateBuffer);
    INIT_PROC(true, dev, DestroyBuffer);
    INIT_PROC(true, dev, CreateBufferView);
    INIT_PROC(true, dev, DestroyBufferView);
    INIT_PROC(true, dev, CreateImage);
    INIT_PROC(true, dev, DestroyImage);
    INIT_PROC(true, dev, GetImageSubresourceLayout);
    INIT_PROC(true, dev, CreateImageView);
    INIT_PROC(true, dev, DestroyImageView);
    INIT_PROC(true, dev, CreateShaderModule);
    INIT_PROC(true, dev, DestroyShaderModule);
    INIT_PROC(true, dev, CreatePipelineCache);
    INIT_PROC(true, dev, DestroyPipelineCache);
    INIT_PROC(true, dev, GetPipelineCacheData);
    INIT_PROC(true, dev, MergePipelineCaches);
    INIT_PROC(true, dev, CreateGraphicsPipelines);
    INIT_PROC(true, dev, CreateComputePipelines);
    INIT_PROC(true, dev, DestroyPipeline);
    INIT_PROC(true, dev, CreatePipelineLayout);
    INIT_PROC(true, dev, DestroyPipelineLayout);
    INIT_PROC(true, dev, CreateSampler);
    INIT_PROC(true, dev, DestroySampler);
    INIT_PROC(true, dev, CreateDescriptorSetLayout);
    INIT_PROC(true, dev, DestroyDescriptorSetLayout);
    INIT_PROC(true, dev, CreateDescriptorPool);
    INIT_PROC(true, dev, DestroyDescriptorPool);
    INIT_PROC(true, dev, ResetDescriptorPool);
    INIT_PROC(true, dev, AllocateDescriptorSets);
    INIT_PROC(true, dev, FreeDescriptorSets);
    INIT_PROC(true, dev, UpdateDescriptorSets);
    INIT_PROC(true, dev, CreateFramebuffer);
    INIT_PROC(true, dev, DestroyFramebuffer);
    INIT_PROC(true, dev, CreateRenderPass);
    INIT_PROC(true, dev, DestroyRenderPass);
    INIT_PROC(true, dev, GetRenderAreaGranularity);
    INIT_PROC(true, dev, CreateCommandPool);
    INIT_PROC(true, dev, DestroyCommandPool);
    INIT_PROC(true, dev, ResetCommandPool);
    INIT_PROC(true, dev, AllocateCommandBuffers);
    INIT_PROC(true, dev, FreeCommandBuffers);
    INIT_PROC(true, dev, BeginCommandBuffer);
    INIT_PROC(true, dev, EndCommandBuffer);
    INIT_PROC(true, dev, ResetCommandBuffer);
    INIT_PROC(true, dev, CmdBindPipeline);
    INIT_PROC(true, dev, CmdSetViewport);
    INIT_PROC(true, dev, CmdSetScissor);
    INIT_PROC(true, dev, CmdSetLineWidth);
    INIT_PROC(true, dev, CmdSetDepthBias);
    INIT_PROC(true, dev, CmdSetBlendConstants);
    INIT_PROC(true, dev, CmdSetDepthBounds);
    INIT_PROC(true, dev, CmdSetStencilCompareMask);
    INIT_PROC(true, dev, CmdSetStencilWriteMask);
    INIT_PROC(true, dev, CmdSetStencilReference);
    INIT_PROC(true, dev, CmdBindDescriptorSets);
    INIT_PROC(true, dev, CmdBindIndexBuffer);
    INIT_PROC(true, dev, CmdBindVertexBuffers);
    INIT_PROC(true, dev, CmdDraw);
    INIT_PROC(true, dev, CmdDrawIndexed);
    INIT_PROC(true, dev, CmdDrawIndirect);
    INIT_PROC(true, dev, CmdDrawIndexedIndirect);
    INIT_PROC(true, dev, CmdDispatch);
    INIT_PROC(true, dev, CmdDispatchIndirect);
    INIT_PROC(true, dev, CmdCopyBuffer);
    INIT_PROC(true, dev, CmdCopyImage);
    INIT_PROC(true, dev, CmdBlitImage);
    INIT_PROC(true, dev, CmdCopyBufferToImage);
    INIT_PROC(true, dev, CmdCopyImageToBuffer);
    INIT_PROC(true, dev, CmdUpdateBuffer);
    INIT_PROC(true, dev, CmdFillBuffer);
    INIT_PROC(true, dev, CmdClearColorImage);
    INIT_PROC(true, dev, CmdClearDepthStencilImage);
    INIT_PROC(true, dev, CmdClearAttachments);
    INIT_PROC(true, dev, CmdResolveImage);
    INIT_PROC(true, dev, CmdSetEvent);
    INIT_PROC(true, dev, CmdResetEvent);
    INIT_PROC(true, dev, CmdWaitEvents);
    INIT_PROC(true, dev, CmdPipelineBarrier);
    INIT_PROC(true, dev, CmdBeginQuery);
    INIT_PROC(true, dev, CmdEndQuery);
    INIT_PROC(true, dev, CmdResetQueryPool);
    INIT_PROC(true, dev, CmdWriteTimestamp);
    INIT_PROC(true, dev, CmdCopyQueryPoolResults);
    INIT_PROC(true, dev, CmdPushConstants);
    INIT_PROC(true, dev, CmdBeginRenderPass);
    INIT_PROC(true, dev, CmdNextSubpass);
    INIT_PROC(true, dev, CmdEndRenderPass);
    INIT_PROC(true, dev, CmdExecuteCommands);
    INIT_PROC_EXT(KHR_swapchain, true, dev, CreateSwapchainKHR);
    INIT_PROC_EXT(KHR_swapchain, true, dev, DestroySwapchainKHR);
    INIT_PROC_EXT(KHR_swapchain, true, dev, GetSwapchainImagesKHR);
    INIT_PROC_EXT(KHR_swapchain, true, dev, AcquireNextImageKHR);
    INIT_PROC_EXT(KHR_swapchain, true, dev, QueuePresentKHR);
    // clang-format on

    return success;
+28 −8
Original line number Diff line number Diff line
@@ -389,10 +389,10 @@ bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
{{define "C++.DefineInitProcMacro"}}
  #define UNLIKELY(expr) __builtin_expect((expr), 0)

  #define INIT_PROC(obj, proc) do {                             \
  #define INIT_PROC(required, obj, proc) do {                   \
      data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>(       \
              get_proc(obj, "vk" # proc));                      \
      if (UNLIKELY(!data.{{$}}.proc)) {                         \
      if (UNLIKELY(required && !data.{{$}}.proc)) {             \
          ALOGE("missing " # obj " proc: vk" # proc);           \
          success = false;                                      \
      }                                                         \
@@ -409,10 +409,11 @@ bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
  {{AssertType $ "Function"}}

  {{$ext := GetAnnotation $ "extension"}}
  {{$required := (Macro "IsRequiredFunction" $)}}
  {{if $ext}}
    INIT_PROC_EXT({{Macro "BaseName" $ext}}, §
    INIT_PROC_EXT({{Macro "BaseName" $ext}}, {{$required}}, §
  {{else}}
    INIT_PROC(§
    INIT_PROC({{$required}}, §
  {{end}}

  {{if (Macro "IsInstanceDispatched" $)}}
@@ -425,6 +426,25 @@ bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
{{end}}


{{/*
------------------------------------------------------------------------------
  Emits true if a function /must/ be resolved. The only time this is not
  the case is for extension-added functions added in a later revision of the
  extension, and where we have to cope with drivers written against an older
  revision.
------------------------------------------------------------------------------
*/}}
{{define "IsRequiredFunction"}}
  {{AssertType $ "Function"}}

  {{if eq $.Name "vkGetSwapchainGrallocUsage2ANDROID"}}
    false
  {{else}}
    true
  {{end}}
{{end}}


{{/*
------------------------------------------------------------------------------
  Emits true if a function is exported and instance-dispatched.
@@ -490,9 +510,9 @@ bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
{{define "api.C++.DefineInitProcExtMacro"}}
  // Exported extension functions may be invoked even when their extensions
  // are disabled.  Dispatch to stubs when that happens.
  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
      if (extensions[driver::ProcHook::ext])                    \
        INIT_PROC(obj, proc);                                   \
        INIT_PROC(required, obj, proc);                         \
      else                                                      \
        data.dispatch.proc = disabled ## proc;                  \
  } while(0)
@@ -792,9 +812,9 @@ VK_KHR_swapchain
-------------------------------------------------------------------------------
*/}}
{{define "driver.C++.DefineInitProcExtMacro"}}
  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
      if (extensions[ProcHook::ext])                            \
        INIT_PROC(obj, proc);                                   \
        INIT_PROC(required, obj, proc);                         \
  } while(0)
{{end}}

+24 −24
Original line number Diff line number Diff line
@@ -308,20 +308,20 @@ ProcHook::Extension GetProcHookExtension(const char* name) {

#define UNLIKELY(expr) __builtin_expect((expr), 0)

#define INIT_PROC(obj, proc)                                           \
#define INIT_PROC(required, obj, proc)                                 \
    do {                                                               \
        data.driver.proc =                                             \
            reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \
        if (UNLIKELY(!data.driver.proc)) {                             \
        if (UNLIKELY(required && !data.driver.proc)) {                 \
            ALOGE("missing " #obj " proc: vk" #proc);                  \
            success = false;                                           \
        }                                                              \
    } while (0)

#define INIT_PROC_EXT(ext, obj, proc)  \
#define INIT_PROC_EXT(ext, required, obj, proc) \
    do {                                        \
        if (extensions[ProcHook::ext])          \
            INIT_PROC(obj, proc);      \
            INIT_PROC(required, obj, proc);     \
    } while (0)

bool InitDriverTable(VkInstance instance,
@@ -331,14 +331,14 @@ bool InitDriverTable(VkInstance instance,
    bool success = true;

    // clang-format off
    INIT_PROC(instance, DestroyInstance);
    INIT_PROC(instance, EnumeratePhysicalDevices);
    INIT_PROC(instance, GetInstanceProcAddr);
    INIT_PROC(instance, CreateDevice);
    INIT_PROC(instance, EnumerateDeviceExtensionProperties);
    INIT_PROC_EXT(EXT_debug_report, instance, CreateDebugReportCallbackEXT);
    INIT_PROC_EXT(EXT_debug_report, instance, DestroyDebugReportCallbackEXT);
    INIT_PROC_EXT(EXT_debug_report, instance, DebugReportMessageEXT);
    INIT_PROC(true, instance, DestroyInstance);
    INIT_PROC(true, instance, EnumeratePhysicalDevices);
    INIT_PROC(true, instance, GetInstanceProcAddr);
    INIT_PROC(true, instance, CreateDevice);
    INIT_PROC(true, instance, EnumerateDeviceExtensionProperties);
    INIT_PROC_EXT(EXT_debug_report, true, instance, CreateDebugReportCallbackEXT);
    INIT_PROC_EXT(EXT_debug_report, true, instance, DestroyDebugReportCallbackEXT);
    INIT_PROC_EXT(EXT_debug_report, true, instance, DebugReportMessageEXT);
    // clang-format on

    return success;
@@ -351,16 +351,16 @@ bool InitDriverTable(VkDevice dev,
    bool success = true;

    // clang-format off
    INIT_PROC(dev, GetDeviceProcAddr);
    INIT_PROC(dev, DestroyDevice);
    INIT_PROC(dev, GetDeviceQueue);
    INIT_PROC(dev, CreateImage);
    INIT_PROC(dev, DestroyImage);
    INIT_PROC(dev, AllocateCommandBuffers);
    INIT_PROC_EXT(ANDROID_native_buffer, dev, GetSwapchainGrallocUsageANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, dev, GetSwapchainGrallocUsage2ANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, dev, AcquireImageANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, dev, QueueSignalReleaseImageANDROID);
    INIT_PROC(true, dev, GetDeviceProcAddr);
    INIT_PROC(true, dev, DestroyDevice);
    INIT_PROC(true, dev, GetDeviceQueue);
    INIT_PROC(true, dev, CreateImage);
    INIT_PROC(true, dev, DestroyImage);
    INIT_PROC(true, dev, AllocateCommandBuffers);
    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, GetSwapchainGrallocUsageANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, false, dev, GetSwapchainGrallocUsage2ANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, AcquireImageANDROID);
    INIT_PROC_EXT(ANDROID_native_buffer, true, dev, QueueSignalReleaseImageANDROID);
    // clang-format on

    return success;