From 93052d37a069577833b19d98b53c0efec89cc590 Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Thu, 1 Oct 2026 15:43:59 -0500 Subject: [PATCH] Codegen function names for GetProcAddr tests These arrays of function names were previously hardcoded, which will only become more stale over time. One function was missing already which has been added. The lists were verified to be identical (save for the missing function). A new list was added - all functions exported by the loader, with platform specific functions guarded with #define. This new list allows verifying that all functions which should be exported are actually exported. --- scripts/generate_source.py | 7 + scripts/generators/common_code.py | 48 + .../get_proc_addr_validator_generator.py | 145 ++ .../generators/loader_extension_generator.py | 27 +- .../generated/get_proc_addr_validator.h | 1299 +++++++++++++++++ .../util/dynamic_library_wrapper.cpp | 8 +- .../framework/util/dynamic_library_wrapper.h | 2 + tests/loader_get_proc_addr_tests.cpp | 962 +----------- 8 files changed, 1524 insertions(+), 974 deletions(-) create mode 100644 scripts/generators/common_code.py create mode 100644 scripts/generators/get_proc_addr_validator_generator.py create mode 100644 tests/framework/generated/get_proc_addr_validator.h diff --git a/scripts/generate_source.py b/scripts/generate_source.py index 2f7f081f2..03008db94 100755 --- a/scripts/generate_source.py +++ b/scripts/generate_source.py @@ -67,6 +67,7 @@ def RunGenerators(api: str, registry: str, directory: str, styleFile: str, targe from generators.helper_file_generator import HelperFileGenerator from generators.loader_extension_generator import LoaderExtensionGenerator from generators.vk_result_to_string_generator import VkResultToStringGenerator + from generators.get_proc_addr_validator_generator import GetProcAddrValidatorGenerator # These set fields that are needed by both OutputGenerator and BaseGenerator, # but are uniform and don't need to be set at a per-generated file level @@ -77,6 +78,7 @@ def RunGenerators(api: str, registry: str, directory: str, styleFile: str, targe generated_directory = 'loader/generated' dispatch_table_helper_filename = 'vk_dispatch_table_helper.h' result_to_string_filename = 'vk_result_to_string_helper.h' + get_proc_addr_validator_filename = 'get_proc_addr_validator.h' generators.update({ 'vk_layer_dispatch_table.h': { @@ -108,6 +110,11 @@ def RunGenerators(api: str, registry: str, directory: str, styleFile: str, targe 'generator' : VkResultToStringGenerator, 'genCombined': False, 'directory' : 'tests/framework/generated', + }, + f'{get_proc_addr_validator_filename}': { + 'generator' : GetProcAddrValidatorGenerator, + 'genCombined': False, + 'directory' : 'tests/framework/generated', } }) diff --git a/scripts/generators/common_code.py b/scripts/generators/common_code.py new file mode 100644 index 000000000..41c5004fb --- /dev/null +++ b/scripts/generators/common_code.py @@ -0,0 +1,48 @@ +#!/usr/bin/python3 -i +# +# Copyright (c) 2026 The Khronos Group Inc. +# Copyright (c) 2026 Valve Corporation +# Copyright (c) 2026 LunarG, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Author: Charles Giessen + +DISPATCHABLE_TYPES = ['VkInstance', 'VkPhysicalDevice', 'VkDevice', 'VkQueue', 'VkCommandBuffer'] + +AVOID_EXT_NAMES = ['VK_EXT_debug_report'] + +AVOID_CMD_NAMES = ['vkCreateDebugUtilsMessengerEXT', + 'vkDestroyDebugUtilsMessengerEXT', + 'vkSubmitDebugUtilsMessageEXT'] + +WSI_EXT_NAMES = ['VK_KHR_surface', + 'VK_KHR_display', + 'VK_KHR_xlib_surface', + 'VK_KHR_xcb_surface', + 'VK_KHR_wayland_surface', + 'VK_EXT_directfb_surface', + 'VK_KHR_win32_surface', + 'VK_KHR_android_surface', + 'VK_GGP_stream_descriptor_surface', + 'VK_MVK_macos_surface', + 'VK_MVK_ios_surface', + 'VK_EXT_headless_surface', + 'VK_EXT_metal_surface', + 'VK_FUCHSIA_imagepipe_surface', + 'VK_KHR_swapchain', + 'VK_KHR_display_swapchain', + 'VK_KHR_get_display_properties2', + 'VK_KHR_get_surface_capabilities2', + 'VK_QNX_screen_surface', + 'VK_NN_vi_surface'] diff --git a/scripts/generators/get_proc_addr_validator_generator.py b/scripts/generators/get_proc_addr_validator_generator.py new file mode 100644 index 000000000..f155e7180 --- /dev/null +++ b/scripts/generators/get_proc_addr_validator_generator.py @@ -0,0 +1,145 @@ +#!/usr/bin/python3 -i +# +# Copyright (c) 2026 The Khronos Group Inc. +# Copyright (c) 2026 Valve Corporation +# Copyright (c) 2026 LunarG, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Author: Charles Giessen + +import os +from base_generator import BaseGenerator +from generators.common_code import DISPATCHABLE_TYPES, AVOID_EXT_NAMES, AVOID_CMD_NAMES, WSI_EXT_NAMES + +class GetProcAddrValidatorGenerator(BaseGenerator): + def __init__(self): + BaseGenerator.__init__(self) + + def generate(self): + out = [] + + out.append(f'''#pragma once +// *** THIS FILE IS GENERATED - DO NOT EDIT *** +// See {os.path.basename(__file__)} for modifications + +/* + * Copyright (c) 2026 The Khronos Group Inc. + * Copyright (c) 2026 Valve Corporation + * Copyright (c) 2026 LunarG, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + + */ + +#include +''') + self.OutputExportedFunctionValidator(out) + out.append('\n') + + self.write(''.join(out)) + + # Create a dispatch table from the corresponding table_type and append it to out + def OutputExportedFunctionValidator(self, out: list): + out.append('''// Every name gpa_helper.c's trampoline_get_proc_addr() hand-checks via +// `case 0x...u: if (!strcmp(...)) return ...; break;` (all core Vulkan 1.0-1.4 commands - see +// loader/gpa_helper.c). This list mirrors that function's checks +// exactly so a mistake made while mechanically threading the hash pre-filter through ~230 hand-written +// strcmp branches (wrong hash constant, dropped branch, mismatched name) shows up as a concrete failure +// here instead of silently returning NULL/wrong-pointer for some entry point.\n''') + out.append('static constexpr std::array kGpaHelperCoreInstanceNames = {\n') + for command_name, command in self.vk.commands.items(): + if len(command.extensions) == 0 and command.params[0].type in DISPATCHABLE_TYPES: + out.append(f'"{command_name}",\n') + out.append('};\n') + out.append('\n') + + out.append('''// Every name loader_lookup_device_dispatch_table() (loader/generated/vk_loader_extensions.c) hand-checks +// for the core Vulkan 1.0-1.4 sections. Unlike the instance trampolines above, these entries only resolve +// to a non-null pointer if the underlying (mock) driver actually reports the function, so the test +// physical device must be told about every one of them via add_device_function() first.\n''') + out.append('static constexpr std::array kDeviceDispatchCoreNames = {\n') + for command_name, command in self.vk.commands.items(): + if len(command.extensions) == 0 and command.device: + out.append(f'"{command_name}",\n') + out.append('};\n') + out.append('\n') + + out.append(f'''// The ~553 extension command names extension_instance_gpa() (loader/generated/vk_loader_extensions.c) +// hand-checks, minus ~72 that can't be exercised this way without extra per-name setup: ~48 compiled only +// under a platform-specific #if this Linux test build doesn't define (VK_USE_PLATFORM_WIN32_KHR, +// _ANDROID_KHR, _METAL_EXT, _FUCHSIA, etc.), and ~24 whose case only returns non-null when the backing +// extension is enabled at instance creation, so a bare resolve can't tell "recognized but disabled" apart +// from "a hash-mapping bug made this fall through to not-found". The remaining 481 names resolve +// unconditionally regardless of instance/ICD state, so they can be exhaustively checked like the arrays above. +// +// Explicit template arguments (not CTAD) are load-bearing: Clang caps the recursive fold expression in +// libstdc++'s std::array deduction guide at 256 instantiations, below this array's 481 entries. Naming the +// type and size directly skips that deduction guide.\n''') + + extension_instance_gpa_funcs = [] + for command in [x for x in self.vk.commands.values() if x.extensions]: + if (command.protect or command.version or + command.extensions[0] in WSI_EXT_NAMES or + command.extensions[0] in AVOID_EXT_NAMES or + command.name in AVOID_CMD_NAMES or + self.vk.extensions[command.extensions[0]].instance): + continue + + extension_instance_gpa_funcs.append(command) + + out.append(f'static constexpr std::array kExtensionInstanceGpaNames = {{\n') + for func in extension_instance_gpa_funcs: + out.append(f'"{func.name}",\n') + out.append('};\n') + out.append('\n') + + exported_functions_all_platforms = [] + out.append('''// List of all functions that should be exported by the loader binary\n''') + for command in self.vk.commands.values(): + if command.protect: + continue + if ((command.version is None and len(command.extensions) == 0) or + command.version or (len(command.extensions) > 0 and command.extensions[0] in WSI_EXT_NAMES)): + exported_functions_all_platforms.append(command.name) + out.append(f'static constexpr std::array kExportedFunctionNames = {{\n') + for command_name in exported_functions_all_platforms: + out.append(f'"{command_name}",\n') + out.append('};\n') + out.append('\n') + + out.append('''// List of functions that should be exported by the loader binary that are platform specific\n''') + out.append(f'static constexpr std::array kPlatformExportedFunctionNames = {{\n') + for command in self.vk.commands.values(): + if not command.protect: + continue + if ((command.version is None and len(command.extensions) == 0) or + command.version or (len(command.extensions) > 0 and command.extensions[0] in WSI_EXT_NAMES)): + if command.protect: + out.append(f'#if defined({command.protect})\n') + out.append(f'"{command.name}",\n') + if command.protect: + out.append(f'#endif // defined({command.protect})\n') + out.append('};\n') + out.append('\n') diff --git a/scripts/generators/loader_extension_generator.py b/scripts/generators/loader_extension_generator.py index ad455a0e2..10cad8751 100644 --- a/scripts/generators/loader_extension_generator.py +++ b/scripts/generators/loader_extension_generator.py @@ -27,41 +27,16 @@ import os from base_generator import BaseGenerator from vulkan_object import Version +from generators.common_code import AVOID_EXT_NAMES, AVOID_CMD_NAMES, WSI_EXT_NAMES -WSI_EXT_NAMES = ['VK_KHR_surface', - 'VK_KHR_display', - 'VK_KHR_xlib_surface', - 'VK_KHR_xcb_surface', - 'VK_KHR_wayland_surface', - 'VK_EXT_directfb_surface', - 'VK_KHR_win32_surface', - 'VK_KHR_android_surface', - 'VK_GGP_stream_descriptor_surface', - 'VK_MVK_macos_surface', - 'VK_MVK_ios_surface', - 'VK_EXT_headless_surface', - 'VK_EXT_metal_surface', - 'VK_FUCHSIA_imagepipe_surface', - 'VK_KHR_swapchain', - 'VK_KHR_display_swapchain', - 'VK_KHR_get_display_properties2', - 'VK_KHR_get_surface_capabilities2', - 'VK_QNX_screen_surface', - 'VK_NN_vi_surface'] ADD_INST_CMDS = ['vkCreateInstance', 'vkEnumerateInstanceExtensionProperties', 'vkEnumerateInstanceLayerProperties', 'vkEnumerateInstanceVersion'] -AVOID_EXT_NAMES = ['VK_EXT_debug_report'] - NULL_CHECK_EXT_NAMES= ['VK_EXT_debug_utils'] -AVOID_CMD_NAMES = ['vkCreateDebugUtilsMessengerEXT', - 'vkDestroyDebugUtilsMessengerEXT', - 'vkSubmitDebugUtilsMessageEXT'] - DEVICE_CMDS_NEED_TERM = ['vkGetDeviceProcAddr', 'vkCreateSwapchainKHR', 'vkCreateSharedSwapchainsKHR', diff --git a/tests/framework/generated/get_proc_addr_validator.h b/tests/framework/generated/get_proc_addr_validator.h new file mode 100644 index 000000000..067a3cf2d --- /dev/null +++ b/tests/framework/generated/get_proc_addr_validator.h @@ -0,0 +1,1299 @@ +#pragma once +// *** THIS FILE IS GENERATED - DO NOT EDIT *** +// See get_proc_addr_validator_generator.py for modifications + +/* + * Copyright (c) 2026 The Khronos Group Inc. + * Copyright (c) 2026 Valve Corporation + * Copyright (c) 2026 LunarG, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + + */ + +#include +// Every name gpa_helper.c's trampoline_get_proc_addr() hand-checks via +// `case 0x...u: if (!strcmp(...)) return ...; break;` (all core Vulkan 1.0-1.4 commands - see +// loader/gpa_helper.c). This list mirrors that function's checks +// exactly so a mistake made while mechanically threading the hash pre-filter through ~230 hand-written +// strcmp branches (wrong hash constant, dropped branch, mismatched name) shows up as a concrete failure +// here instead of silently returning NULL/wrong-pointer for some entry point. +static constexpr std::array kGpaHelperCoreInstanceNames = { + "vkDestroyInstance", + "vkEnumeratePhysicalDevices", + "vkGetPhysicalDeviceFeatures", + "vkGetPhysicalDeviceFormatProperties", + "vkGetPhysicalDeviceImageFormatProperties", + "vkGetPhysicalDeviceProperties", + "vkGetPhysicalDeviceQueueFamilyProperties", + "vkGetPhysicalDeviceMemoryProperties", + "vkGetInstanceProcAddr", + "vkGetDeviceProcAddr", + "vkCreateDevice", + "vkDestroyDevice", + "vkEnumerateDeviceExtensionProperties", + "vkEnumerateDeviceLayerProperties", + "vkGetDeviceQueue", + "vkQueueSubmit", + "vkQueueWaitIdle", + "vkDeviceWaitIdle", + "vkAllocateMemory", + "vkFreeMemory", + "vkMapMemory", + "vkUnmapMemory", + "vkFlushMappedMemoryRanges", + "vkInvalidateMappedMemoryRanges", + "vkGetDeviceMemoryCommitment", + "vkBindBufferMemory", + "vkBindImageMemory", + "vkGetBufferMemoryRequirements", + "vkGetImageMemoryRequirements", + "vkGetImageSparseMemoryRequirements", + "vkGetPhysicalDeviceSparseImageFormatProperties", + "vkQueueBindSparse", + "vkCreateFence", + "vkDestroyFence", + "vkResetFences", + "vkGetFenceStatus", + "vkWaitForFences", + "vkCreateSemaphore", + "vkDestroySemaphore", + "vkCreateQueryPool", + "vkDestroyQueryPool", + "vkGetQueryPoolResults", + "vkCreateBuffer", + "vkDestroyBuffer", + "vkCreateImage", + "vkDestroyImage", + "vkGetImageSubresourceLayout", + "vkCreateImageView", + "vkDestroyImageView", + "vkCreateCommandPool", + "vkDestroyCommandPool", + "vkResetCommandPool", + "vkAllocateCommandBuffers", + "vkFreeCommandBuffers", + "vkBeginCommandBuffer", + "vkEndCommandBuffer", + "vkResetCommandBuffer", + "vkCmdCopyBuffer", + "vkCmdCopyImage", + "vkCmdCopyBufferToImage", + "vkCmdCopyImageToBuffer", + "vkCmdUpdateBuffer", + "vkCmdFillBuffer", + "vkCmdPipelineBarrier", + "vkCmdBeginQuery", + "vkCmdEndQuery", + "vkCmdResetQueryPool", + "vkCmdWriteTimestamp", + "vkCmdCopyQueryPoolResults", + "vkCmdExecuteCommands", + "vkCreateEvent", + "vkDestroyEvent", + "vkGetEventStatus", + "vkSetEvent", + "vkResetEvent", + "vkCreateBufferView", + "vkDestroyBufferView", + "vkCreateShaderModule", + "vkDestroyShaderModule", + "vkCreatePipelineCache", + "vkDestroyPipelineCache", + "vkGetPipelineCacheData", + "vkMergePipelineCaches", + "vkCreateComputePipelines", + "vkDestroyPipeline", + "vkCreatePipelineLayout", + "vkDestroyPipelineLayout", + "vkCreateSampler", + "vkDestroySampler", + "vkCreateDescriptorSetLayout", + "vkDestroyDescriptorSetLayout", + "vkCreateDescriptorPool", + "vkDestroyDescriptorPool", + "vkResetDescriptorPool", + "vkAllocateDescriptorSets", + "vkFreeDescriptorSets", + "vkUpdateDescriptorSets", + "vkCmdBindPipeline", + "vkCmdBindDescriptorSets", + "vkCmdClearColorImage", + "vkCmdDispatch", + "vkCmdDispatchIndirect", + "vkCmdSetEvent", + "vkCmdResetEvent", + "vkCmdWaitEvents", + "vkCmdPushConstants", + "vkCreateGraphicsPipelines", + "vkCreateFramebuffer", + "vkDestroyFramebuffer", + "vkCreateRenderPass", + "vkDestroyRenderPass", + "vkGetRenderAreaGranularity", + "vkCmdSetViewport", + "vkCmdSetScissor", + "vkCmdSetLineWidth", + "vkCmdSetDepthBias", + "vkCmdSetBlendConstants", + "vkCmdSetDepthBounds", + "vkCmdSetStencilCompareMask", + "vkCmdSetStencilWriteMask", + "vkCmdSetStencilReference", + "vkCmdBindIndexBuffer", + "vkCmdBindVertexBuffers", + "vkCmdDraw", + "vkCmdDrawIndexed", + "vkCmdDrawIndirect", + "vkCmdDrawIndexedIndirect", + "vkCmdBlitImage", + "vkCmdClearDepthStencilImage", + "vkCmdClearAttachments", + "vkCmdResolveImage", + "vkCmdBeginRenderPass", + "vkCmdNextSubpass", + "vkCmdEndRenderPass", + "vkBindBufferMemory2", + "vkBindImageMemory2", + "vkGetDeviceGroupPeerMemoryFeatures", + "vkCmdSetDeviceMask", + "vkEnumeratePhysicalDeviceGroups", + "vkGetImageMemoryRequirements2", + "vkGetBufferMemoryRequirements2", + "vkGetImageSparseMemoryRequirements2", + "vkGetPhysicalDeviceFeatures2", + "vkGetPhysicalDeviceProperties2", + "vkGetPhysicalDeviceFormatProperties2", + "vkGetPhysicalDeviceImageFormatProperties2", + "vkGetPhysicalDeviceQueueFamilyProperties2", + "vkGetPhysicalDeviceMemoryProperties2", + "vkGetPhysicalDeviceSparseImageFormatProperties2", + "vkTrimCommandPool", + "vkGetDeviceQueue2", + "vkGetPhysicalDeviceExternalBufferProperties", + "vkGetPhysicalDeviceExternalFenceProperties", + "vkGetPhysicalDeviceExternalSemaphoreProperties", + "vkCmdDispatchBase", + "vkCreateDescriptorUpdateTemplate", + "vkDestroyDescriptorUpdateTemplate", + "vkUpdateDescriptorSetWithTemplate", + "vkGetDescriptorSetLayoutSupport", + "vkCreateSamplerYcbcrConversion", + "vkDestroySamplerYcbcrConversion", + "vkResetQueryPool", + "vkGetSemaphoreCounterValue", + "vkWaitSemaphores", + "vkSignalSemaphore", + "vkGetBufferDeviceAddress", + "vkGetBufferOpaqueCaptureAddress", + "vkGetDeviceMemoryOpaqueCaptureAddress", + "vkCmdDrawIndirectCount", + "vkCmdDrawIndexedIndirectCount", + "vkCreateRenderPass2", + "vkCmdBeginRenderPass2", + "vkCmdNextSubpass2", + "vkCmdEndRenderPass2", + "vkGetPhysicalDeviceToolProperties", + "vkCreatePrivateDataSlot", + "vkDestroyPrivateDataSlot", + "vkSetPrivateData", + "vkGetPrivateData", + "vkCmdPipelineBarrier2", + "vkCmdWriteTimestamp2", + "vkQueueSubmit2", + "vkCmdCopyBuffer2", + "vkCmdCopyImage2", + "vkCmdCopyBufferToImage2", + "vkCmdCopyImageToBuffer2", + "vkGetDeviceBufferMemoryRequirements", + "vkGetDeviceImageMemoryRequirements", + "vkGetDeviceImageSparseMemoryRequirements", + "vkCmdSetEvent2", + "vkCmdResetEvent2", + "vkCmdWaitEvents2", + "vkCmdBlitImage2", + "vkCmdResolveImage2", + "vkCmdBeginRendering", + "vkCmdEndRendering", + "vkCmdSetCullMode", + "vkCmdSetFrontFace", + "vkCmdSetPrimitiveTopology", + "vkCmdSetViewportWithCount", + "vkCmdSetScissorWithCount", + "vkCmdBindVertexBuffers2", + "vkCmdSetDepthTestEnable", + "vkCmdSetDepthWriteEnable", + "vkCmdSetDepthCompareOp", + "vkCmdSetDepthBoundsTestEnable", + "vkCmdSetStencilTestEnable", + "vkCmdSetStencilOp", + "vkCmdSetRasterizerDiscardEnable", + "vkCmdSetDepthBiasEnable", + "vkCmdSetPrimitiveRestartEnable", + "vkMapMemory2", + "vkUnmapMemory2", + "vkGetDeviceImageSubresourceLayout", + "vkGetImageSubresourceLayout2", + "vkCopyMemoryToImage", + "vkCopyImageToMemory", + "vkCopyImageToImage", + "vkTransitionImageLayout", + "vkCmdPushDescriptorSet", + "vkCmdPushDescriptorSetWithTemplate", + "vkCmdBindDescriptorSets2", + "vkCmdPushConstants2", + "vkCmdPushDescriptorSet2", + "vkCmdPushDescriptorSetWithTemplate2", + "vkCmdSetLineStipple", + "vkCmdBindIndexBuffer2", + "vkGetRenderingAreaGranularity", + "vkCmdSetRenderingAttachmentLocations", + "vkCmdSetRenderingInputAttachmentIndices", +}; + +// Every name loader_lookup_device_dispatch_table() (loader/generated/vk_loader_extensions.c) hand-checks +// for the core Vulkan 1.0-1.4 sections. Unlike the instance trampolines above, these entries only resolve +// to a non-null pointer if the underlying (mock) driver actually reports the function, so the test +// physical device must be told about every one of them via add_device_function() first. +static constexpr std::array kDeviceDispatchCoreNames = { + "vkGetDeviceProcAddr", + "vkDestroyDevice", + "vkGetDeviceQueue", + "vkQueueSubmit", + "vkQueueWaitIdle", + "vkDeviceWaitIdle", + "vkAllocateMemory", + "vkFreeMemory", + "vkMapMemory", + "vkUnmapMemory", + "vkFlushMappedMemoryRanges", + "vkInvalidateMappedMemoryRanges", + "vkGetDeviceMemoryCommitment", + "vkBindBufferMemory", + "vkBindImageMemory", + "vkGetBufferMemoryRequirements", + "vkGetImageMemoryRequirements", + "vkGetImageSparseMemoryRequirements", + "vkQueueBindSparse", + "vkCreateFence", + "vkDestroyFence", + "vkResetFences", + "vkGetFenceStatus", + "vkWaitForFences", + "vkCreateSemaphore", + "vkDestroySemaphore", + "vkCreateQueryPool", + "vkDestroyQueryPool", + "vkGetQueryPoolResults", + "vkCreateBuffer", + "vkDestroyBuffer", + "vkCreateImage", + "vkDestroyImage", + "vkGetImageSubresourceLayout", + "vkCreateImageView", + "vkDestroyImageView", + "vkCreateCommandPool", + "vkDestroyCommandPool", + "vkResetCommandPool", + "vkAllocateCommandBuffers", + "vkFreeCommandBuffers", + "vkBeginCommandBuffer", + "vkEndCommandBuffer", + "vkResetCommandBuffer", + "vkCmdCopyBuffer", + "vkCmdCopyImage", + "vkCmdCopyBufferToImage", + "vkCmdCopyImageToBuffer", + "vkCmdUpdateBuffer", + "vkCmdFillBuffer", + "vkCmdPipelineBarrier", + "vkCmdBeginQuery", + "vkCmdEndQuery", + "vkCmdResetQueryPool", + "vkCmdWriteTimestamp", + "vkCmdCopyQueryPoolResults", + "vkCmdExecuteCommands", + "vkCreateEvent", + "vkDestroyEvent", + "vkGetEventStatus", + "vkSetEvent", + "vkResetEvent", + "vkCreateBufferView", + "vkDestroyBufferView", + "vkCreateShaderModule", + "vkDestroyShaderModule", + "vkCreatePipelineCache", + "vkDestroyPipelineCache", + "vkGetPipelineCacheData", + "vkMergePipelineCaches", + "vkCreateComputePipelines", + "vkDestroyPipeline", + "vkCreatePipelineLayout", + "vkDestroyPipelineLayout", + "vkCreateSampler", + "vkDestroySampler", + "vkCreateDescriptorSetLayout", + "vkDestroyDescriptorSetLayout", + "vkCreateDescriptorPool", + "vkDestroyDescriptorPool", + "vkResetDescriptorPool", + "vkAllocateDescriptorSets", + "vkFreeDescriptorSets", + "vkUpdateDescriptorSets", + "vkCmdBindPipeline", + "vkCmdBindDescriptorSets", + "vkCmdClearColorImage", + "vkCmdDispatch", + "vkCmdDispatchIndirect", + "vkCmdSetEvent", + "vkCmdResetEvent", + "vkCmdWaitEvents", + "vkCmdPushConstants", + "vkCreateGraphicsPipelines", + "vkCreateFramebuffer", + "vkDestroyFramebuffer", + "vkCreateRenderPass", + "vkDestroyRenderPass", + "vkGetRenderAreaGranularity", + "vkCmdSetViewport", + "vkCmdSetScissor", + "vkCmdSetLineWidth", + "vkCmdSetDepthBias", + "vkCmdSetBlendConstants", + "vkCmdSetDepthBounds", + "vkCmdSetStencilCompareMask", + "vkCmdSetStencilWriteMask", + "vkCmdSetStencilReference", + "vkCmdBindIndexBuffer", + "vkCmdBindVertexBuffers", + "vkCmdDraw", + "vkCmdDrawIndexed", + "vkCmdDrawIndirect", + "vkCmdDrawIndexedIndirect", + "vkCmdBlitImage", + "vkCmdClearDepthStencilImage", + "vkCmdClearAttachments", + "vkCmdResolveImage", + "vkCmdBeginRenderPass", + "vkCmdNextSubpass", + "vkCmdEndRenderPass", + "vkBindBufferMemory2", + "vkBindImageMemory2", + "vkGetDeviceGroupPeerMemoryFeatures", + "vkCmdSetDeviceMask", + "vkGetImageMemoryRequirements2", + "vkGetBufferMemoryRequirements2", + "vkGetImageSparseMemoryRequirements2", + "vkTrimCommandPool", + "vkGetDeviceQueue2", + "vkCmdDispatchBase", + "vkCreateDescriptorUpdateTemplate", + "vkDestroyDescriptorUpdateTemplate", + "vkUpdateDescriptorSetWithTemplate", + "vkGetDescriptorSetLayoutSupport", + "vkCreateSamplerYcbcrConversion", + "vkDestroySamplerYcbcrConversion", + "vkResetQueryPool", + "vkGetSemaphoreCounterValue", + "vkWaitSemaphores", + "vkSignalSemaphore", + "vkGetBufferDeviceAddress", + "vkGetBufferOpaqueCaptureAddress", + "vkGetDeviceMemoryOpaqueCaptureAddress", + "vkCmdDrawIndirectCount", + "vkCmdDrawIndexedIndirectCount", + "vkCreateRenderPass2", + "vkCmdBeginRenderPass2", + "vkCmdNextSubpass2", + "vkCmdEndRenderPass2", + "vkCreatePrivateDataSlot", + "vkDestroyPrivateDataSlot", + "vkSetPrivateData", + "vkGetPrivateData", + "vkCmdPipelineBarrier2", + "vkCmdWriteTimestamp2", + "vkQueueSubmit2", + "vkCmdCopyBuffer2", + "vkCmdCopyImage2", + "vkCmdCopyBufferToImage2", + "vkCmdCopyImageToBuffer2", + "vkGetDeviceBufferMemoryRequirements", + "vkGetDeviceImageMemoryRequirements", + "vkGetDeviceImageSparseMemoryRequirements", + "vkCmdSetEvent2", + "vkCmdResetEvent2", + "vkCmdWaitEvents2", + "vkCmdBlitImage2", + "vkCmdResolveImage2", + "vkCmdBeginRendering", + "vkCmdEndRendering", + "vkCmdSetCullMode", + "vkCmdSetFrontFace", + "vkCmdSetPrimitiveTopology", + "vkCmdSetViewportWithCount", + "vkCmdSetScissorWithCount", + "vkCmdBindVertexBuffers2", + "vkCmdSetDepthTestEnable", + "vkCmdSetDepthWriteEnable", + "vkCmdSetDepthCompareOp", + "vkCmdSetDepthBoundsTestEnable", + "vkCmdSetStencilTestEnable", + "vkCmdSetStencilOp", + "vkCmdSetRasterizerDiscardEnable", + "vkCmdSetDepthBiasEnable", + "vkCmdSetPrimitiveRestartEnable", + "vkMapMemory2", + "vkUnmapMemory2", + "vkGetDeviceImageSubresourceLayout", + "vkGetImageSubresourceLayout2", + "vkCopyMemoryToImage", + "vkCopyImageToMemory", + "vkCopyImageToImage", + "vkTransitionImageLayout", + "vkCmdPushDescriptorSet", + "vkCmdPushDescriptorSetWithTemplate", + "vkCmdBindDescriptorSets2", + "vkCmdPushConstants2", + "vkCmdPushDescriptorSet2", + "vkCmdPushDescriptorSetWithTemplate2", + "vkCmdSetLineStipple", + "vkCmdBindIndexBuffer2", + "vkGetRenderingAreaGranularity", + "vkCmdSetRenderingAttachmentLocations", + "vkCmdSetRenderingInputAttachmentIndices", +}; + +// The ~553 extension command names extension_instance_gpa() (loader/generated/vk_loader_extensions.c) +// hand-checks, minus ~72 that can't be exercised this way without extra per-name setup: ~48 compiled only +// under a platform-specific #if this Linux test build doesn't define (VK_USE_PLATFORM_WIN32_KHR, +// _ANDROID_KHR, _METAL_EXT, _FUCHSIA, etc.), and ~24 whose case only returns non-null when the backing +// extension is enabled at instance creation, so a bare resolve can't tell "recognized but disabled" apart +// from "a hash-mapping bug made this fall through to not-found". The remaining 481 names resolve +// unconditionally regardless of instance/ICD state, so they can be exhaustively checked like the arrays above. +// +// Explicit template arguments (not CTAD) are load-bearing: Clang caps the recursive fold expression in +// libstdc++'s std::array deduction guide at 256 instantiations, below this array's 481 entries. Naming the +// type and size directly skips that deduction guide. +static constexpr std::array kExtensionInstanceGpaNames = { + "vkGetPhysicalDeviceVideoCapabilitiesKHR", + "vkGetPhysicalDeviceVideoFormatPropertiesKHR", + "vkCreateVideoSessionKHR", + "vkDestroyVideoSessionKHR", + "vkGetVideoSessionMemoryRequirementsKHR", + "vkBindVideoSessionMemoryKHR", + "vkCreateVideoSessionParametersKHR", + "vkUpdateVideoSessionParametersKHR", + "vkDestroyVideoSessionParametersKHR", + "vkCmdBeginVideoCodingKHR", + "vkCmdEndVideoCodingKHR", + "vkCmdControlVideoCodingKHR", + "vkCmdDecodeVideoKHR", + "vkCmdBeginRenderingKHR", + "vkCmdEndRenderingKHR", + "vkGetDeviceGroupPeerMemoryFeaturesKHR", + "vkCmdSetDeviceMaskKHR", + "vkCmdDispatchBaseKHR", + "vkTrimCommandPoolKHR", + "vkGetMemoryFdKHR", + "vkGetMemoryFdPropertiesKHR", + "vkImportSemaphoreFdKHR", + "vkGetSemaphoreFdKHR", + "vkCmdPushDescriptorSetKHR", + "vkCmdPushDescriptorSetWithTemplateKHR", + "vkCreateDescriptorUpdateTemplateKHR", + "vkDestroyDescriptorUpdateTemplateKHR", + "vkUpdateDescriptorSetWithTemplateKHR", + "vkCreateRenderPass2KHR", + "vkCmdBeginRenderPass2KHR", + "vkCmdNextSubpass2KHR", + "vkCmdEndRenderPass2KHR", + "vkGetSwapchainStatusKHR", + "vkImportFenceFdKHR", + "vkGetFenceFdKHR", + "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR", + "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR", + "vkAcquireProfilingLockKHR", + "vkReleaseProfilingLockKHR", + "vkGetImageMemoryRequirements2KHR", + "vkGetBufferMemoryRequirements2KHR", + "vkGetImageSparseMemoryRequirements2KHR", + "vkCreateSamplerYcbcrConversionKHR", + "vkDestroySamplerYcbcrConversionKHR", + "vkBindBufferMemory2KHR", + "vkBindImageMemory2KHR", + "vkGetDescriptorSetLayoutSupportKHR", + "vkCmdDrawIndirectCountKHR", + "vkCmdDrawIndexedIndirectCountKHR", + "vkGetSemaphoreCounterValueKHR", + "vkWaitSemaphoresKHR", + "vkSignalSemaphoreKHR", + "vkGetPhysicalDeviceFragmentShadingRatesKHR", + "vkCmdSetFragmentShadingRateKHR", + "vkCmdSetRenderingAttachmentLocationsKHR", + "vkCmdSetRenderingInputAttachmentIndicesKHR", + "vkWaitForPresentKHR", + "vkGetBufferDeviceAddressKHR", + "vkGetBufferOpaqueCaptureAddressKHR", + "vkGetDeviceMemoryOpaqueCaptureAddressKHR", + "vkCreateDeferredOperationKHR", + "vkDestroyDeferredOperationKHR", + "vkGetDeferredOperationMaxConcurrencyKHR", + "vkGetDeferredOperationResultKHR", + "vkDeferredOperationJoinKHR", + "vkGetPipelineExecutablePropertiesKHR", + "vkGetPipelineExecutableStatisticsKHR", + "vkGetPipelineExecutableInternalRepresentationsKHR", + "vkMapMemory2KHR", + "vkUnmapMemory2KHR", + "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR", + "vkGetEncodedVideoSessionParametersKHR", + "vkCmdEncodeVideoKHR", + "vkCmdSetEvent2KHR", + "vkCmdResetEvent2KHR", + "vkCmdWaitEvents2KHR", + "vkCmdPipelineBarrier2KHR", + "vkCmdWriteTimestamp2KHR", + "vkQueueSubmit2KHR", + "vkCmdBindIndexBuffer3KHR", + "vkCmdBindVertexBuffers3KHR", + "vkCmdDrawIndirect2KHR", + "vkCmdDrawIndexedIndirect2KHR", + "vkCmdDispatchIndirect2KHR", + "vkCmdCopyMemoryKHR", + "vkCmdCopyMemoryToImageKHR", + "vkCmdCopyImageToMemoryKHR", + "vkCmdUpdateMemoryKHR", + "vkCmdFillMemoryKHR", + "vkCmdCopyQueryPoolResultsToMemoryKHR", + "vkCmdDrawIndirectCount2KHR", + "vkCmdDrawIndexedIndirectCount2KHR", + "vkCmdBeginConditionalRendering2EXT", + "vkCmdBindTransformFeedbackBuffers2EXT", + "vkCmdBeginTransformFeedback2EXT", + "vkCmdEndTransformFeedback2EXT", + "vkCmdDrawIndirectByteCount2EXT", + "vkCmdDrawMeshTasksIndirect2EXT", + "vkCmdDrawMeshTasksIndirectCount2EXT", + "vkCmdWriteMarkerToMemoryAMD", + "vkCreateAccelerationStructure2KHR", + "vkCmdCopyBuffer2KHR", + "vkCmdCopyImage2KHR", + "vkCmdCopyBufferToImage2KHR", + "vkCmdCopyImageToBuffer2KHR", + "vkCmdBlitImage2KHR", + "vkCmdResolveImage2KHR", + "vkCmdTraceRaysIndirect2KHR", + "vkGetDeviceBufferMemoryRequirementsKHR", + "vkGetDeviceImageMemoryRequirementsKHR", + "vkGetDeviceImageSparseMemoryRequirementsKHR", + "vkCmdBindIndexBuffer2KHR", + "vkGetRenderingAreaGranularityKHR", + "vkGetDeviceImageSubresourceLayoutKHR", + "vkGetImageSubresourceLayout2KHR", + "vkWaitForPresent2KHR", + "vkCreatePipelineBinariesKHR", + "vkDestroyPipelineBinaryKHR", + "vkGetPipelineKeyKHR", + "vkGetPipelineBinaryDataKHR", + "vkReleaseCapturedPipelineDataKHR", + "vkReleaseSwapchainImagesKHR", + "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR", + "vkCmdSetLineStippleKHR", + "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR", + "vkGetCalibratedTimestampsKHR", + "vkCmdBindDescriptorSets2KHR", + "vkCmdPushConstants2KHR", + "vkCmdPushDescriptorSet2KHR", + "vkCmdPushDescriptorSetWithTemplate2KHR", + "vkCmdSetDescriptorBufferOffsets2EXT", + "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT", + "vkCmdCopyMemoryIndirectKHR", + "vkCmdCopyMemoryToImageIndirectKHR", + "vkGetDeviceFaultReportsKHR", + "vkGetDeviceFaultDebugInfoKHR", + "vkCmdEndRendering2KHR", + "vkDebugMarkerSetObjectTagEXT", + "vkDebugMarkerSetObjectNameEXT", + "vkCmdDebugMarkerBeginEXT", + "vkCmdDebugMarkerEndEXT", + "vkCmdDebugMarkerInsertEXT", + "vkCmdBindTransformFeedbackBuffersEXT", + "vkCmdBeginTransformFeedbackEXT", + "vkCmdEndTransformFeedbackEXT", + "vkCmdBeginQueryIndexedEXT", + "vkCmdEndQueryIndexedEXT", + "vkCmdDrawIndirectByteCountEXT", + "vkCreateCuModuleNVX", + "vkCreateCuFunctionNVX", + "vkDestroyCuModuleNVX", + "vkDestroyCuFunctionNVX", + "vkCmdCuLaunchKernelNVX", + "vkGetImageViewHandleNVX", + "vkGetImageViewHandle64NVX", + "vkGetImageViewAddressNVX", + "vkGetDeviceCombinedImageSamplerIndexNVX", + "vkCmdDrawIndirectCountAMD", + "vkCmdDrawIndexedIndirectCountAMD", + "vkGetShaderInfoAMD", + "vkCmdBeginConditionalRenderingEXT", + "vkCmdEndConditionalRenderingEXT", + "vkCmdSetViewportWScalingNV", + "vkDisplayPowerControlEXT", + "vkRegisterDeviceEventEXT", + "vkRegisterDisplayEventEXT", + "vkGetSwapchainCounterEXT", + "vkGetRefreshCycleDurationGOOGLE", + "vkGetPastPresentationTimingGOOGLE", + "vkCmdSetDiscardRectangleEXT", + "vkCmdSetDiscardRectangleEnableEXT", + "vkCmdSetDiscardRectangleModeEXT", + "vkSetHdrMetadataEXT", + "vkCreateGpaSessionAMD", + "vkDestroyGpaSessionAMD", + "vkSetGpaDeviceClockModeAMD", + "vkGetGpaDeviceClockInfoAMD", + "vkCmdBeginGpaSessionAMD", + "vkCmdEndGpaSessionAMD", + "vkCmdBeginGpaSampleAMD", + "vkCmdEndGpaSampleAMD", + "vkGetGpaSessionStatusAMD", + "vkGetGpaSessionResultsAMD", + "vkResetGpaSessionAMD", + "vkCmdCopyGpaSessionResultsAMD", + "vkWriteSamplerDescriptorsEXT", + "vkWriteResourceDescriptorsEXT", + "vkCmdBindSamplerHeapEXT", + "vkCmdBindResourceHeapEXT", + "vkCmdPushDataEXT", + "vkGetImageOpaqueCaptureDataEXT", + "vkGetPhysicalDeviceDescriptorSizeEXT", + "vkRegisterCustomBorderColorEXT", + "vkUnregisterCustomBorderColorEXT", + "vkGetTensorOpaqueCaptureDataARM", + "vkCmdSetSampleLocationsEXT", + "vkGetPhysicalDeviceMultisamplePropertiesEXT", + "vkGetImageDrmFormatModifierPropertiesEXT", + "vkCreateValidationCacheEXT", + "vkDestroyValidationCacheEXT", + "vkMergeValidationCachesEXT", + "vkGetValidationCacheDataEXT", + "vkCmdBindShadingRateImageNV", + "vkCmdSetViewportShadingRatePaletteNV", + "vkCmdSetCoarseSampleOrderNV", + "vkCreateAccelerationStructureNV", + "vkDestroyAccelerationStructureNV", + "vkGetAccelerationStructureMemoryRequirementsNV", + "vkBindAccelerationStructureMemoryNV", + "vkCmdBuildAccelerationStructureNV", + "vkCmdCopyAccelerationStructureNV", + "vkCmdTraceRaysNV", + "vkCreateRayTracingPipelinesNV", + "vkGetRayTracingShaderGroupHandlesKHR", + "vkGetRayTracingShaderGroupHandlesNV", + "vkGetAccelerationStructureHandleNV", + "vkCmdWriteAccelerationStructuresPropertiesNV", + "vkCompileDeferredNV", + "vkGetMemoryHostPointerPropertiesEXT", + "vkCmdWriteBufferMarkerAMD", + "vkCmdWriteBufferMarker2AMD", + "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT", + "vkGetCalibratedTimestampsEXT", + "vkCmdDrawMeshTasksNV", + "vkCmdDrawMeshTasksIndirectNV", + "vkCmdDrawMeshTasksIndirectCountNV", + "vkCmdSetExclusiveScissorEnableNV", + "vkCmdSetExclusiveScissorNV", + "vkCmdSetCheckpointNV", + "vkGetQueueCheckpointDataNV", + "vkGetQueueCheckpointData2NV", + "vkSetSwapchainPresentTimingQueueSizeEXT", + "vkGetSwapchainTimingPropertiesEXT", + "vkGetSwapchainTimeDomainPropertiesEXT", + "vkGetPastPresentationTimingEXT", + "vkInitializePerformanceApiINTEL", + "vkUninitializePerformanceApiINTEL", + "vkCmdSetPerformanceMarkerINTEL", + "vkCmdSetPerformanceStreamMarkerINTEL", + "vkCmdSetPerformanceOverrideINTEL", + "vkAcquirePerformanceConfigurationINTEL", + "vkReleasePerformanceConfigurationINTEL", + "vkQueueSetPerformanceConfigurationINTEL", + "vkGetPerformanceParameterINTEL", + "vkSetLocalDimmingAMD", + "vkGetBufferDeviceAddressEXT", + "vkGetPhysicalDeviceToolPropertiesEXT", + "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV", + "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV", + "vkCmdSetLineStippleEXT", + "vkResetQueryPoolEXT", + "vkCmdSetCullModeEXT", + "vkCmdSetFrontFaceEXT", + "vkCmdSetPrimitiveTopologyEXT", + "vkCmdSetViewportWithCountEXT", + "vkCmdSetScissorWithCountEXT", + "vkCmdBindVertexBuffers2EXT", + "vkCmdSetDepthTestEnableEXT", + "vkCmdSetDepthWriteEnableEXT", + "vkCmdSetDepthCompareOpEXT", + "vkCmdSetDepthBoundsTestEnableEXT", + "vkCmdSetStencilTestEnableEXT", + "vkCmdSetStencilOpEXT", + "vkCopyMemoryToImageEXT", + "vkCopyImageToMemoryEXT", + "vkCopyImageToImageEXT", + "vkTransitionImageLayoutEXT", + "vkGetImageSubresourceLayout2EXT", + "vkReleaseSwapchainImagesEXT", + "vkGetGeneratedCommandsMemoryRequirementsNV", + "vkCmdPreprocessGeneratedCommandsNV", + "vkCmdExecuteGeneratedCommandsNV", + "vkCmdBindPipelineShaderGroupNV", + "vkCreateIndirectCommandsLayoutNV", + "vkDestroyIndirectCommandsLayoutNV", + "vkCmdSetDepthBias2EXT", + "vkCreatePrivateDataSlotEXT", + "vkDestroyPrivateDataSlotEXT", + "vkSetPrivateDataEXT", + "vkGetPrivateDataEXT", + "vkQueueSetPerfHintQCOM", + "vkCmdDispatchTileQCOM", + "vkCmdBeginPerTileExecutionQCOM", + "vkCmdEndPerTileExecutionQCOM", + "vkSetLatencySleepModeLegacyNV", + "vkLatencySleepLegacyNV", + "vkSetLatencyMarkerLegacyNV", + "vkGetLatencyTimingsLegacyNV", + "vkQueueNotifyOutOfBandLegacyNV", + "vkGetSleepStatusLegacyNV", + "vkShutdownLatencyDeviceLegacyNV", + "vkGetDescriptorSetLayoutSizeEXT", + "vkGetDescriptorSetLayoutBindingOffsetEXT", + "vkGetDescriptorEXT", + "vkCmdBindDescriptorBuffersEXT", + "vkCmdSetDescriptorBufferOffsetsEXT", + "vkCmdBindDescriptorBufferEmbeddedSamplersEXT", + "vkGetBufferOpaqueCaptureDescriptorDataEXT", + "vkGetImageOpaqueCaptureDescriptorDataEXT", + "vkGetImageViewOpaqueCaptureDescriptorDataEXT", + "vkGetSamplerOpaqueCaptureDescriptorDataEXT", + "vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT", + "vkCmdSetFragmentShadingRateEnumNV", + "vkGetDeviceFaultInfoEXT", + "vkCmdSetVertexInputEXT", + "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI", + "vkCmdSubpassShadingHUAWEI", + "vkCmdBindInvocationMaskHUAWEI", + "vkGetMemoryRemoteAddressNV", + "vkGetPipelinePropertiesEXT", + "vkCmdSetPatchControlPointsEXT", + "vkCmdSetRasterizerDiscardEnableEXT", + "vkCmdSetDepthBiasEnableEXT", + "vkCmdSetLogicOpEXT", + "vkCmdSetPrimitiveRestartEnableEXT", + "vkCmdSetColorWriteEnableEXT", + "vkCmdDrawMultiEXT", + "vkCmdDrawMultiIndexedEXT", + "vkCreateMicromapEXT", + "vkDestroyMicromapEXT", + "vkCmdBuildMicromapsEXT", + "vkBuildMicromapsEXT", + "vkCopyMicromapEXT", + "vkCopyMicromapToMemoryEXT", + "vkCopyMemoryToMicromapEXT", + "vkWriteMicromapsPropertiesEXT", + "vkCmdCopyMicromapEXT", + "vkCmdCopyMicromapToMemoryEXT", + "vkCmdCopyMemoryToMicromapEXT", + "vkCmdWriteMicromapsPropertiesEXT", + "vkGetDeviceMicromapCompatibilityEXT", + "vkGetMicromapBuildSizesEXT", + "vkCmdDrawClusterHUAWEI", + "vkCmdDrawClusterIndirectHUAWEI", + "vkSetDeviceMemoryPriorityEXT", + "vkCmdSetDispatchParametersARM", + "vkGetDescriptorSetLayoutHostMappingInfoVALVE", + "vkGetDescriptorSetHostMappingVALVE", + "vkCmdCopyMemoryIndirectNV", + "vkCmdCopyMemoryToImageIndirectNV", + "vkCmdDecompressMemoryNV", + "vkCmdDecompressMemoryIndirectCountNV", + "vkGetPipelineIndirectMemoryRequirementsNV", + "vkCmdUpdatePipelineIndirectBufferNV", + "vkGetPipelineIndirectDeviceAddressNV", + "vkCmdSetDepthClampEnableEXT", + "vkCmdSetPolygonModeEXT", + "vkCmdSetRasterizationSamplesEXT", + "vkCmdSetSampleMaskEXT", + "vkCmdSetAlphaToCoverageEnableEXT", + "vkCmdSetAlphaToOneEnableEXT", + "vkCmdSetLogicOpEnableEXT", + "vkCmdSetColorBlendEnableEXT", + "vkCmdSetColorBlendEquationEXT", + "vkCmdSetColorWriteMaskEXT", + "vkCmdSetTessellationDomainOriginEXT", + "vkCmdSetRasterizationStreamEXT", + "vkCmdSetConservativeRasterizationModeEXT", + "vkCmdSetExtraPrimitiveOverestimationSizeEXT", + "vkCmdSetDepthClipEnableEXT", + "vkCmdSetSampleLocationsEnableEXT", + "vkCmdSetColorBlendAdvancedEXT", + "vkCmdSetProvokingVertexModeEXT", + "vkCmdSetLineRasterizationModeEXT", + "vkCmdSetLineStippleEnableEXT", + "vkCmdSetDepthClipNegativeOneToOneEXT", + "vkCmdSetViewportWScalingEnableNV", + "vkCmdSetViewportSwizzleNV", + "vkCmdSetCoverageToColorEnableNV", + "vkCmdSetCoverageToColorLocationNV", + "vkCmdSetCoverageModulationModeNV", + "vkCmdSetCoverageModulationTableEnableNV", + "vkCmdSetCoverageModulationTableNV", + "vkCmdSetShadingRateImageEnableNV", + "vkCmdSetRepresentativeFragmentTestEnableNV", + "vkCmdSetCoverageReductionModeNV", + "vkCreateTensorARM", + "vkDestroyTensorARM", + "vkCreateTensorViewARM", + "vkDestroyTensorViewARM", + "vkGetTensorMemoryRequirementsARM", + "vkBindTensorMemoryARM", + "vkGetDeviceTensorMemoryRequirementsARM", + "vkCmdCopyTensorARM", + "vkGetPhysicalDeviceExternalTensorPropertiesARM", + "vkGetTensorOpaqueCaptureDescriptorDataARM", + "vkGetTensorViewOpaqueCaptureDescriptorDataARM", + "vkGetShaderModuleIdentifierEXT", + "vkGetShaderModuleCreateInfoIdentifierEXT", + "vkGetPhysicalDeviceOpticalFlowImageFormatsNV", + "vkCreateOpticalFlowSessionNV", + "vkDestroyOpticalFlowSessionNV", + "vkBindOpticalFlowSessionImageNV", + "vkCmdOpticalFlowExecuteNV", + "vkAntiLagUpdateAMD", + "vkCreateShadersEXT", + "vkDestroyShaderEXT", + "vkGetShaderBinaryDataEXT", + "vkCmdBindShadersEXT", + "vkCmdSetDepthClampRangeEXT", + "vkGetFramebufferTilePropertiesQCOM", + "vkGetDynamicRenderingTilePropertiesQCOM", + "vkGetPhysicalDeviceCooperativeVectorPropertiesNV", + "vkConvertCooperativeVectorMatrixNV", + "vkCmdConvertCooperativeVectorMatrixNV", + "vkSetLatencySleepModeNV", + "vkLatencySleepNV", + "vkSetLatencyMarkerNV", + "vkGetLatencyTimingsNV", + "vkQueueNotifyOutOfBandNV", + "vkCreateDataGraphPipelinesARM", + "vkCreateDataGraphPipelineSessionARM", + "vkGetDataGraphPipelineSessionBindPointRequirementsARM", + "vkGetDataGraphPipelineSessionMemoryRequirementsARM", + "vkBindDataGraphPipelineSessionMemoryARM", + "vkDestroyDataGraphPipelineSessionARM", + "vkCmdDispatchDataGraphARM", + "vkGetDataGraphPipelineAvailablePropertiesARM", + "vkGetDataGraphPipelinePropertiesARM", + "vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM", + "vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM", + "vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM", + "vkCmdSetAttachmentFeedbackLoopEnableEXT", + "vkCmdBindTileMemoryQCOM", + "vkCmdDecompressMemoryEXT", + "vkCmdDecompressMemoryIndirectCountEXT", + "vkCreateExternalComputeQueueNV", + "vkDestroyExternalComputeQueueNV", + "vkGetExternalComputeQueueDataNV", + "vkGetClusterAccelerationStructureBuildSizesNV", + "vkCmdBuildClusterAccelerationStructureIndirectNV", + "vkGetPartitionedAccelerationStructuresBuildSizesNV", + "vkCmdBuildPartitionedAccelerationStructuresNV", + "vkGetGeneratedCommandsMemoryRequirementsEXT", + "vkCmdPreprocessGeneratedCommandsEXT", + "vkCmdExecuteGeneratedCommandsEXT", + "vkCreateIndirectCommandsLayoutEXT", + "vkDestroyIndirectCommandsLayoutEXT", + "vkCreateIndirectExecutionSetEXT", + "vkDestroyIndirectExecutionSetEXT", + "vkUpdateIndirectExecutionSetPipelineEXT", + "vkUpdateIndirectExecutionSetShaderEXT", + "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV", + "vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM", + "vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM", + "vkCreateShaderInstrumentationARM", + "vkDestroyShaderInstrumentationARM", + "vkCmdBeginShaderInstrumentationARM", + "vkCmdEndShaderInstrumentationARM", + "vkGetShaderInstrumentationValuesARM", + "vkClearShaderInstrumentationMetricsARM", + "vkCmdEndRendering2EXT", + "vkCmdBeginCustomResolveEXT", + "vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM", + "vkCmdSetComputeOccupancyPriorityNV", + "vkGetPhysicalDeviceCooperativeMatrixProperties2EXT", + "vkCmdSetPrimitiveRestartIndexEXT", + "vkCreateAccelerationStructureKHR", + "vkDestroyAccelerationStructureKHR", + "vkCmdBuildAccelerationStructuresKHR", + "vkCmdBuildAccelerationStructuresIndirectKHR", + "vkBuildAccelerationStructuresKHR", + "vkCopyAccelerationStructureKHR", + "vkCopyAccelerationStructureToMemoryKHR", + "vkCopyMemoryToAccelerationStructureKHR", + "vkWriteAccelerationStructuresPropertiesKHR", + "vkCmdCopyAccelerationStructureKHR", + "vkCmdCopyAccelerationStructureToMemoryKHR", + "vkCmdCopyMemoryToAccelerationStructureKHR", + "vkGetAccelerationStructureDeviceAddressKHR", + "vkCmdWriteAccelerationStructuresPropertiesKHR", + "vkGetDeviceAccelerationStructureCompatibilityKHR", + "vkGetAccelerationStructureBuildSizesKHR", + "vkCmdTraceRaysKHR", + "vkCreateRayTracingPipelinesKHR", + "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", + "vkCmdTraceRaysIndirectKHR", + "vkGetRayTracingShaderGroupStackSizeKHR", + "vkCmdSetRayTracingPipelineStackSizeKHR", + "vkCmdDrawMeshTasksEXT", + "vkCmdDrawMeshTasksIndirectEXT", + "vkCmdDrawMeshTasksIndirectCountEXT", +}; + +// List of all functions that should be exported by the loader binary +static constexpr std::array kExportedFunctionNames = { + "vkCreateInstance", + "vkDestroyInstance", + "vkEnumeratePhysicalDevices", + "vkGetPhysicalDeviceFeatures", + "vkGetPhysicalDeviceFormatProperties", + "vkGetPhysicalDeviceImageFormatProperties", + "vkGetPhysicalDeviceProperties", + "vkGetPhysicalDeviceQueueFamilyProperties", + "vkGetPhysicalDeviceMemoryProperties", + "vkGetInstanceProcAddr", + "vkGetDeviceProcAddr", + "vkCreateDevice", + "vkDestroyDevice", + "vkEnumerateInstanceExtensionProperties", + "vkEnumerateDeviceExtensionProperties", + "vkEnumerateInstanceLayerProperties", + "vkEnumerateDeviceLayerProperties", + "vkGetDeviceQueue", + "vkQueueSubmit", + "vkQueueWaitIdle", + "vkDeviceWaitIdle", + "vkAllocateMemory", + "vkFreeMemory", + "vkMapMemory", + "vkUnmapMemory", + "vkFlushMappedMemoryRanges", + "vkInvalidateMappedMemoryRanges", + "vkGetDeviceMemoryCommitment", + "vkBindBufferMemory", + "vkBindImageMemory", + "vkGetBufferMemoryRequirements", + "vkGetImageMemoryRequirements", + "vkGetImageSparseMemoryRequirements", + "vkGetPhysicalDeviceSparseImageFormatProperties", + "vkQueueBindSparse", + "vkCreateFence", + "vkDestroyFence", + "vkResetFences", + "vkGetFenceStatus", + "vkWaitForFences", + "vkCreateSemaphore", + "vkDestroySemaphore", + "vkCreateQueryPool", + "vkDestroyQueryPool", + "vkGetQueryPoolResults", + "vkCreateBuffer", + "vkDestroyBuffer", + "vkCreateImage", + "vkDestroyImage", + "vkGetImageSubresourceLayout", + "vkCreateImageView", + "vkDestroyImageView", + "vkCreateCommandPool", + "vkDestroyCommandPool", + "vkResetCommandPool", + "vkAllocateCommandBuffers", + "vkFreeCommandBuffers", + "vkBeginCommandBuffer", + "vkEndCommandBuffer", + "vkResetCommandBuffer", + "vkCmdCopyBuffer", + "vkCmdCopyImage", + "vkCmdCopyBufferToImage", + "vkCmdCopyImageToBuffer", + "vkCmdUpdateBuffer", + "vkCmdFillBuffer", + "vkCmdPipelineBarrier", + "vkCmdBeginQuery", + "vkCmdEndQuery", + "vkCmdResetQueryPool", + "vkCmdWriteTimestamp", + "vkCmdCopyQueryPoolResults", + "vkCmdExecuteCommands", + "vkCreateEvent", + "vkDestroyEvent", + "vkGetEventStatus", + "vkSetEvent", + "vkResetEvent", + "vkCreateBufferView", + "vkDestroyBufferView", + "vkCreateShaderModule", + "vkDestroyShaderModule", + "vkCreatePipelineCache", + "vkDestroyPipelineCache", + "vkGetPipelineCacheData", + "vkMergePipelineCaches", + "vkCreateComputePipelines", + "vkDestroyPipeline", + "vkCreatePipelineLayout", + "vkDestroyPipelineLayout", + "vkCreateSampler", + "vkDestroySampler", + "vkCreateDescriptorSetLayout", + "vkDestroyDescriptorSetLayout", + "vkCreateDescriptorPool", + "vkDestroyDescriptorPool", + "vkResetDescriptorPool", + "vkAllocateDescriptorSets", + "vkFreeDescriptorSets", + "vkUpdateDescriptorSets", + "vkCmdBindPipeline", + "vkCmdBindDescriptorSets", + "vkCmdClearColorImage", + "vkCmdDispatch", + "vkCmdDispatchIndirect", + "vkCmdSetEvent", + "vkCmdResetEvent", + "vkCmdWaitEvents", + "vkCmdPushConstants", + "vkCreateGraphicsPipelines", + "vkCreateFramebuffer", + "vkDestroyFramebuffer", + "vkCreateRenderPass", + "vkDestroyRenderPass", + "vkGetRenderAreaGranularity", + "vkCmdSetViewport", + "vkCmdSetScissor", + "vkCmdSetLineWidth", + "vkCmdSetDepthBias", + "vkCmdSetBlendConstants", + "vkCmdSetDepthBounds", + "vkCmdSetStencilCompareMask", + "vkCmdSetStencilWriteMask", + "vkCmdSetStencilReference", + "vkCmdBindIndexBuffer", + "vkCmdBindVertexBuffers", + "vkCmdDraw", + "vkCmdDrawIndexed", + "vkCmdDrawIndirect", + "vkCmdDrawIndexedIndirect", + "vkCmdBlitImage", + "vkCmdClearDepthStencilImage", + "vkCmdClearAttachments", + "vkCmdResolveImage", + "vkCmdBeginRenderPass", + "vkCmdNextSubpass", + "vkCmdEndRenderPass", + "vkEnumerateInstanceVersion", + "vkBindBufferMemory2", + "vkBindImageMemory2", + "vkGetDeviceGroupPeerMemoryFeatures", + "vkCmdSetDeviceMask", + "vkEnumeratePhysicalDeviceGroups", + "vkGetImageMemoryRequirements2", + "vkGetBufferMemoryRequirements2", + "vkGetImageSparseMemoryRequirements2", + "vkGetPhysicalDeviceFeatures2", + "vkGetPhysicalDeviceProperties2", + "vkGetPhysicalDeviceFormatProperties2", + "vkGetPhysicalDeviceImageFormatProperties2", + "vkGetPhysicalDeviceQueueFamilyProperties2", + "vkGetPhysicalDeviceMemoryProperties2", + "vkGetPhysicalDeviceSparseImageFormatProperties2", + "vkTrimCommandPool", + "vkGetDeviceQueue2", + "vkGetPhysicalDeviceExternalBufferProperties", + "vkGetPhysicalDeviceExternalFenceProperties", + "vkGetPhysicalDeviceExternalSemaphoreProperties", + "vkCmdDispatchBase", + "vkCreateDescriptorUpdateTemplate", + "vkDestroyDescriptorUpdateTemplate", + "vkUpdateDescriptorSetWithTemplate", + "vkGetDescriptorSetLayoutSupport", + "vkCreateSamplerYcbcrConversion", + "vkDestroySamplerYcbcrConversion", + "vkResetQueryPool", + "vkGetSemaphoreCounterValue", + "vkWaitSemaphores", + "vkSignalSemaphore", + "vkGetBufferDeviceAddress", + "vkGetBufferOpaqueCaptureAddress", + "vkGetDeviceMemoryOpaqueCaptureAddress", + "vkCmdDrawIndirectCount", + "vkCmdDrawIndexedIndirectCount", + "vkCreateRenderPass2", + "vkCmdBeginRenderPass2", + "vkCmdNextSubpass2", + "vkCmdEndRenderPass2", + "vkGetPhysicalDeviceToolProperties", + "vkCreatePrivateDataSlot", + "vkDestroyPrivateDataSlot", + "vkSetPrivateData", + "vkGetPrivateData", + "vkCmdPipelineBarrier2", + "vkCmdWriteTimestamp2", + "vkQueueSubmit2", + "vkCmdCopyBuffer2", + "vkCmdCopyImage2", + "vkCmdCopyBufferToImage2", + "vkCmdCopyImageToBuffer2", + "vkGetDeviceBufferMemoryRequirements", + "vkGetDeviceImageMemoryRequirements", + "vkGetDeviceImageSparseMemoryRequirements", + "vkCmdSetEvent2", + "vkCmdResetEvent2", + "vkCmdWaitEvents2", + "vkCmdBlitImage2", + "vkCmdResolveImage2", + "vkCmdBeginRendering", + "vkCmdEndRendering", + "vkCmdSetCullMode", + "vkCmdSetFrontFace", + "vkCmdSetPrimitiveTopology", + "vkCmdSetViewportWithCount", + "vkCmdSetScissorWithCount", + "vkCmdBindVertexBuffers2", + "vkCmdSetDepthTestEnable", + "vkCmdSetDepthWriteEnable", + "vkCmdSetDepthCompareOp", + "vkCmdSetDepthBoundsTestEnable", + "vkCmdSetStencilTestEnable", + "vkCmdSetStencilOp", + "vkCmdSetRasterizerDiscardEnable", + "vkCmdSetDepthBiasEnable", + "vkCmdSetPrimitiveRestartEnable", + "vkMapMemory2", + "vkUnmapMemory2", + "vkGetDeviceImageSubresourceLayout", + "vkGetImageSubresourceLayout2", + "vkCopyMemoryToImage", + "vkCopyImageToMemory", + "vkCopyImageToImage", + "vkTransitionImageLayout", + "vkCmdPushDescriptorSet", + "vkCmdPushDescriptorSetWithTemplate", + "vkCmdBindDescriptorSets2", + "vkCmdPushConstants2", + "vkCmdPushDescriptorSet2", + "vkCmdPushDescriptorSetWithTemplate2", + "vkCmdSetLineStipple", + "vkCmdBindIndexBuffer2", + "vkGetRenderingAreaGranularity", + "vkCmdSetRenderingAttachmentLocations", + "vkCmdSetRenderingInputAttachmentIndices", + "vkDestroySurfaceKHR", + "vkGetPhysicalDeviceSurfaceSupportKHR", + "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", + "vkGetPhysicalDeviceSurfaceFormatsKHR", + "vkGetPhysicalDeviceSurfacePresentModesKHR", + "vkCreateSwapchainKHR", + "vkDestroySwapchainKHR", + "vkGetSwapchainImagesKHR", + "vkAcquireNextImageKHR", + "vkQueuePresentKHR", + "vkGetDeviceGroupPresentCapabilitiesKHR", + "vkGetDeviceGroupSurfacePresentModesKHR", + "vkGetPhysicalDevicePresentRectanglesKHR", + "vkAcquireNextImage2KHR", + "vkGetPhysicalDeviceDisplayPropertiesKHR", + "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", + "vkGetDisplayPlaneSupportedDisplaysKHR", + "vkGetDisplayModePropertiesKHR", + "vkCreateDisplayModeKHR", + "vkGetDisplayPlaneCapabilitiesKHR", + "vkCreateDisplayPlaneSurfaceKHR", + "vkCreateSharedSwapchainsKHR", + "vkGetPhysicalDeviceSurfaceCapabilities2KHR", + "vkGetPhysicalDeviceSurfaceFormats2KHR", + "vkGetPhysicalDeviceDisplayProperties2KHR", + "vkGetPhysicalDeviceDisplayPlaneProperties2KHR", + "vkGetDisplayModeProperties2KHR", + "vkGetDisplayPlaneCapabilities2KHR", + "vkCreateHeadlessSurfaceEXT", +}; + +// List of functions that should be exported by the loader binary that are platform specific +static constexpr std::array kPlatformExportedFunctionNames = { +#if defined(VK_USE_PLATFORM_XLIB_KHR) + "vkCreateXlibSurfaceKHR", +#endif // defined(VK_USE_PLATFORM_XLIB_KHR) +#if defined(VK_USE_PLATFORM_XLIB_KHR) + "vkGetPhysicalDeviceXlibPresentationSupportKHR", +#endif // defined(VK_USE_PLATFORM_XLIB_KHR) +#if defined(VK_USE_PLATFORM_XCB_KHR) + "vkCreateXcbSurfaceKHR", +#endif // defined(VK_USE_PLATFORM_XCB_KHR) +#if defined(VK_USE_PLATFORM_XCB_KHR) + "vkGetPhysicalDeviceXcbPresentationSupportKHR", +#endif // defined(VK_USE_PLATFORM_XCB_KHR) +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + "vkCreateWaylandSurfaceKHR", +#endif // defined(VK_USE_PLATFORM_WAYLAND_KHR) +#if defined(VK_USE_PLATFORM_WAYLAND_KHR) + "vkGetPhysicalDeviceWaylandPresentationSupportKHR", +#endif // defined(VK_USE_PLATFORM_WAYLAND_KHR) +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + "vkCreateAndroidSurfaceKHR", +#endif // defined(VK_USE_PLATFORM_ANDROID_KHR) +#if defined(VK_USE_PLATFORM_WIN32_KHR) + "vkCreateWin32SurfaceKHR", +#endif // defined(VK_USE_PLATFORM_WIN32_KHR) +#if defined(VK_USE_PLATFORM_WIN32_KHR) + "vkGetPhysicalDeviceWin32PresentationSupportKHR", +#endif // defined(VK_USE_PLATFORM_WIN32_KHR) +#if defined(VK_USE_PLATFORM_GGP) + "vkCreateStreamDescriptorSurfaceGGP", +#endif // defined(VK_USE_PLATFORM_GGP) +#if defined(VK_USE_PLATFORM_VI_NN) + "vkCreateViSurfaceNN", +#endif // defined(VK_USE_PLATFORM_VI_NN) +#if defined(VK_USE_PLATFORM_IOS_MVK) + "vkCreateIOSSurfaceMVK", +#endif // defined(VK_USE_PLATFORM_IOS_MVK) +#if defined(VK_USE_PLATFORM_MACOS_MVK) + "vkCreateMacOSSurfaceMVK", +#endif // defined(VK_USE_PLATFORM_MACOS_MVK) +#if defined(VK_USE_PLATFORM_FUCHSIA) + "vkCreateImagePipeSurfaceFUCHSIA", +#endif // defined(VK_USE_PLATFORM_FUCHSIA) +#if defined(VK_USE_PLATFORM_METAL_EXT) + "vkCreateMetalSurfaceEXT", +#endif // defined(VK_USE_PLATFORM_METAL_EXT) +#if defined(VK_USE_PLATFORM_DIRECTFB_EXT) + "vkCreateDirectFBSurfaceEXT", +#endif // defined(VK_USE_PLATFORM_DIRECTFB_EXT) +#if defined(VK_USE_PLATFORM_DIRECTFB_EXT) + "vkGetPhysicalDeviceDirectFBPresentationSupportEXT", +#endif // defined(VK_USE_PLATFORM_DIRECTFB_EXT) +#if defined(VK_USE_PLATFORM_SCREEN_QNX) + "vkCreateScreenSurfaceQNX", +#endif // defined(VK_USE_PLATFORM_SCREEN_QNX) +#if defined(VK_USE_PLATFORM_SCREEN_QNX) + "vkGetPhysicalDeviceScreenPresentationSupportQNX", +#endif // defined(VK_USE_PLATFORM_SCREEN_QNX) +}; diff --git a/tests/framework/util/dynamic_library_wrapper.cpp b/tests/framework/util/dynamic_library_wrapper.cpp index e868d1607..2ab5a62c8 100644 --- a/tests/framework/util/dynamic_library_wrapper.cpp +++ b/tests/framework/util/dynamic_library_wrapper.cpp @@ -133,7 +133,7 @@ void LibraryWrapper::close_library() noexcept { } } -FromVoidStarFunc LibraryWrapper::get_symbol(const char* symbol_name) const { +void* LibraryWrapper::get_symbol_no_cast(const char* symbol_name) const { if (symbol_name == nullptr) { std::cerr << "LibraryWrapper::get_symbol called with a null symbol_name!\n"; abort(); @@ -161,5 +161,9 @@ FromVoidStarFunc LibraryWrapper::get_symbol(const char* symbol_name) const { #else #error "Unhandled platform in dynamic_library_wrapper.cpp!" #endif - return FromVoidStarFunc(symbol); + return symbol; +} + +FromVoidStarFunc LibraryWrapper::get_symbol(const char* symbol_name) const { + return FromVoidStarFunc(get_symbol_no_cast(symbol_name)); } diff --git a/tests/framework/util/dynamic_library_wrapper.h b/tests/framework/util/dynamic_library_wrapper.h index 35b72adbe..3a6468314 100644 --- a/tests/framework/util/dynamic_library_wrapper.h +++ b/tests/framework/util/dynamic_library_wrapper.h @@ -54,6 +54,8 @@ struct LibraryWrapper { LibraryWrapper& operator=(LibraryWrapper&& wrapper) noexcept; FromVoidStarFunc get_symbol(const char* symbol_name) const; + void* get_symbol_no_cast(const char* symbol_name) const; + std::filesystem::path const& get_path() const { return lib_path; } explicit operator bool() const noexcept { return lib_handle != nullptr; } diff --git a/tests/loader_get_proc_addr_tests.cpp b/tests/loader_get_proc_addr_tests.cpp index 5fcd3fdf8..37db7ae78 100644 --- a/tests/loader_get_proc_addr_tests.cpp +++ b/tests/loader_get_proc_addr_tests.cpp @@ -38,6 +38,8 @@ extern "C" { #include #include +#include "generated/get_proc_addr_validator.h" + // On arm64x the loader has two views of each entry point. An x64 caller (an arm64ec build, or a plain // x64 process emulated on an Arm64 host) gets an export's x64 fast-forward-sequence thunk back from // GetProcAddress, while the loader resolves its own name to the native arm64ec function. Same command, @@ -94,952 +96,6 @@ static void assert_gdpa_equivalent(PFN_vkGetDeviceProcAddr from_loader, PFN_vkGe } } -// Every name gpa_helper.c's trampoline_get_proc_addr() hand-checks via -// `case 0x...u: if (!strcmp(...)) return ...; break;` (all core Vulkan 1.0-1.4 commands - see -// loader/gpa_helper.c). This list mirrors that function's checks -// exactly so a mistake made while mechanically threading the hash pre-filter through ~230 hand-written -// strcmp branches (wrong hash constant, dropped branch, mismatched name) shows up as a concrete failure -// here instead of silently returning NULL/wrong-pointer for some entry point. -static constexpr std::array kGpaHelperCoreInstanceNames = { - "vkGetInstanceProcAddr", - "vkDestroyInstance", - "vkEnumeratePhysicalDevices", - "vkGetPhysicalDeviceFeatures", - "vkGetPhysicalDeviceFormatProperties", - "vkGetPhysicalDeviceImageFormatProperties", - "vkGetPhysicalDeviceSparseImageFormatProperties", - "vkGetPhysicalDeviceProperties", - "vkGetPhysicalDeviceQueueFamilyProperties", - "vkGetPhysicalDeviceMemoryProperties", - "vkEnumerateDeviceLayerProperties", - "vkEnumerateDeviceExtensionProperties", - "vkCreateDevice", - "vkGetDeviceProcAddr", - "vkDestroyDevice", - "vkGetDeviceQueue", - "vkQueueSubmit", - "vkQueueWaitIdle", - "vkDeviceWaitIdle", - "vkAllocateMemory", - "vkFreeMemory", - "vkMapMemory", - "vkUnmapMemory", - "vkFlushMappedMemoryRanges", - "vkInvalidateMappedMemoryRanges", - "vkGetDeviceMemoryCommitment", - "vkGetImageSparseMemoryRequirements", - "vkGetImageMemoryRequirements", - "vkGetBufferMemoryRequirements", - "vkBindImageMemory", - "vkBindBufferMemory", - "vkQueueBindSparse", - "vkCreateFence", - "vkDestroyFence", - "vkGetFenceStatus", - "vkResetFences", - "vkWaitForFences", - "vkCreateSemaphore", - "vkDestroySemaphore", - "vkCreateEvent", - "vkDestroyEvent", - "vkGetEventStatus", - "vkSetEvent", - "vkResetEvent", - "vkCreateQueryPool", - "vkDestroyQueryPool", - "vkGetQueryPoolResults", - "vkCreateBuffer", - "vkDestroyBuffer", - "vkCreateBufferView", - "vkDestroyBufferView", - "vkCreateImage", - "vkDestroyImage", - "vkGetImageSubresourceLayout", - "vkCreateImageView", - "vkDestroyImageView", - "vkCreateShaderModule", - "vkDestroyShaderModule", - "vkCreatePipelineCache", - "vkDestroyPipelineCache", - "vkGetPipelineCacheData", - "vkMergePipelineCaches", - "vkCreateGraphicsPipelines", - "vkCreateComputePipelines", - "vkDestroyPipeline", - "vkCreatePipelineLayout", - "vkDestroyPipelineLayout", - "vkCreateSampler", - "vkDestroySampler", - "vkCreateDescriptorSetLayout", - "vkDestroyDescriptorSetLayout", - "vkCreateDescriptorPool", - "vkDestroyDescriptorPool", - "vkResetDescriptorPool", - "vkAllocateDescriptorSets", - "vkFreeDescriptorSets", - "vkUpdateDescriptorSets", - "vkCreateFramebuffer", - "vkDestroyFramebuffer", - "vkCreateRenderPass", - "vkDestroyRenderPass", - "vkGetRenderAreaGranularity", - "vkCreateCommandPool", - "vkDestroyCommandPool", - "vkResetCommandPool", - "vkAllocateCommandBuffers", - "vkFreeCommandBuffers", - "vkBeginCommandBuffer", - "vkEndCommandBuffer", - "vkResetCommandBuffer", - "vkCmdBindPipeline", - "vkCmdBindDescriptorSets", - "vkCmdBindVertexBuffers", - "vkCmdBindIndexBuffer", - "vkCmdSetViewport", - "vkCmdSetScissor", - "vkCmdSetLineWidth", - "vkCmdSetDepthBias", - "vkCmdSetBlendConstants", - "vkCmdSetDepthBounds", - "vkCmdSetStencilCompareMask", - "vkCmdSetStencilWriteMask", - "vkCmdSetStencilReference", - "vkCmdDraw", - "vkCmdDrawIndexed", - "vkCmdDrawIndirect", - "vkCmdDrawIndexedIndirect", - "vkCmdDispatch", - "vkCmdDispatchIndirect", - "vkCmdCopyBuffer", - "vkCmdCopyImage", - "vkCmdBlitImage", - "vkCmdCopyBufferToImage", - "vkCmdCopyImageToBuffer", - "vkCmdUpdateBuffer", - "vkCmdFillBuffer", - "vkCmdClearColorImage", - "vkCmdClearDepthStencilImage", - "vkCmdClearAttachments", - "vkCmdResolveImage", - "vkCmdSetEvent", - "vkCmdResetEvent", - "vkCmdWaitEvents", - "vkCmdPipelineBarrier", - "vkCmdBeginQuery", - "vkCmdEndQuery", - "vkCmdResetQueryPool", - "vkCmdWriteTimestamp", - "vkCmdCopyQueryPoolResults", - "vkCmdPushConstants", - "vkCmdBeginRenderPass", - "vkCmdNextSubpass", - "vkCmdEndRenderPass", - "vkCmdExecuteCommands", - "vkEnumeratePhysicalDeviceGroups", - "vkGetPhysicalDeviceFeatures2", - "vkGetPhysicalDeviceProperties2", - "vkGetPhysicalDeviceFormatProperties2", - "vkGetPhysicalDeviceImageFormatProperties2", - "vkGetPhysicalDeviceQueueFamilyProperties2", - "vkGetPhysicalDeviceMemoryProperties2", - "vkGetPhysicalDeviceSparseImageFormatProperties2", - "vkGetPhysicalDeviceExternalBufferProperties", - "vkGetPhysicalDeviceExternalSemaphoreProperties", - "vkGetPhysicalDeviceExternalFenceProperties", - "vkBindBufferMemory2", - "vkBindImageMemory2", - "vkGetDeviceGroupPeerMemoryFeatures", - "vkCmdSetDeviceMask", - "vkCmdDispatchBase", - "vkGetImageMemoryRequirements2", - "vkTrimCommandPool", - "vkGetDeviceQueue2", - "vkCreateSamplerYcbcrConversion", - "vkDestroySamplerYcbcrConversion", - "vkGetDescriptorSetLayoutSupport", - "vkCreateDescriptorUpdateTemplate", - "vkDestroyDescriptorUpdateTemplate", - "vkUpdateDescriptorSetWithTemplate", - "vkGetImageSparseMemoryRequirements2", - "vkGetBufferMemoryRequirements2", - "vkCreateRenderPass2", - "vkCmdBeginRenderPass2", - "vkCmdNextSubpass2", - "vkCmdEndRenderPass2", - "vkCmdDrawIndirectCount", - "vkCmdDrawIndexedIndirectCount", - "vkGetSemaphoreCounterValue", - "vkWaitSemaphores", - "vkSignalSemaphore", - "vkGetBufferDeviceAddress", - "vkGetBufferOpaqueCaptureAddress", - "vkGetDeviceMemoryOpaqueCaptureAddress", - "vkResetQueryPool", - "vkGetPhysicalDeviceToolProperties", - "vkCreatePrivateDataSlot", - "vkDestroyPrivateDataSlot", - "vkSetPrivateData", - "vkGetPrivateData", - "vkCmdSetEvent2", - "vkCmdResetEvent2", - "vkCmdWaitEvents2", - "vkCmdPipelineBarrier2", - "vkCmdWriteTimestamp2", - "vkQueueSubmit2", - "vkCmdCopyBuffer2", - "vkCmdCopyImage2", - "vkCmdCopyBufferToImage2", - "vkCmdCopyImageToBuffer2", - "vkCmdBlitImage2", - "vkCmdResolveImage2", - "vkCmdBeginRendering", - "vkCmdEndRendering", - "vkCmdSetCullMode", - "vkCmdSetFrontFace", - "vkCmdSetPrimitiveTopology", - "vkCmdSetViewportWithCount", - "vkCmdSetScissorWithCount", - "vkCmdBindVertexBuffers2", - "vkCmdSetDepthTestEnable", - "vkCmdSetDepthWriteEnable", - "vkCmdSetDepthCompareOp", - "vkCmdSetDepthBoundsTestEnable", - "vkCmdSetStencilTestEnable", - "vkCmdSetStencilOp", - "vkCmdSetRasterizerDiscardEnable", - "vkCmdSetDepthBiasEnable", - "vkCmdSetPrimitiveRestartEnable", - "vkGetDeviceBufferMemoryRequirements", - "vkGetDeviceImageMemoryRequirements", - "vkGetDeviceImageSparseMemoryRequirements", - "vkCmdSetLineStipple", - "vkMapMemory2", - "vkUnmapMemory2", - "vkCmdBindIndexBuffer2", - "vkGetRenderingAreaGranularity", - "vkGetDeviceImageSubresourceLayout", - "vkGetImageSubresourceLayout2", - "vkCmdPushDescriptorSet", - "vkCmdPushDescriptorSetWithTemplate", - "vkCmdSetRenderingAttachmentLocations", - "vkCmdSetRenderingInputAttachmentIndices", - "vkCmdBindDescriptorSets2", - "vkCmdPushConstants2", - "vkCmdPushDescriptorSet2", - "vkCmdPushDescriptorSetWithTemplate2", - "vkCopyMemoryToImage", - "vkCopyImageToMemory", - "vkCopyImageToImage", - "vkTransitionImageLayout", -}; - -// Every name loader_lookup_device_dispatch_table() (loader/generated/vk_loader_extensions.c) hand-checks -// for the core Vulkan 1.0-1.4 sections. Unlike the instance trampolines above, these entries only resolve -// to a non-null pointer if the underlying (mock) driver actually reports the function, so the test -// physical device must be told about every one of them via add_device_function() first. -static constexpr std::array kDeviceDispatchCoreNames = { - "vkGetDeviceProcAddr", - "vkDestroyDevice", - "vkGetDeviceQueue", - "vkQueueSubmit", - "vkQueueWaitIdle", - "vkDeviceWaitIdle", - "vkAllocateMemory", - "vkFreeMemory", - "vkMapMemory", - "vkUnmapMemory", - "vkFlushMappedMemoryRanges", - "vkInvalidateMappedMemoryRanges", - "vkGetDeviceMemoryCommitment", - "vkBindBufferMemory", - "vkBindImageMemory", - "vkGetBufferMemoryRequirements", - "vkGetImageMemoryRequirements", - "vkGetImageSparseMemoryRequirements", - "vkQueueBindSparse", - "vkCreateFence", - "vkDestroyFence", - "vkResetFences", - "vkGetFenceStatus", - "vkWaitForFences", - "vkCreateSemaphore", - "vkDestroySemaphore", - "vkCreateQueryPool", - "vkDestroyQueryPool", - "vkGetQueryPoolResults", - "vkCreateBuffer", - "vkDestroyBuffer", - "vkCreateImage", - "vkDestroyImage", - "vkGetImageSubresourceLayout", - "vkCreateImageView", - "vkDestroyImageView", - "vkCreateCommandPool", - "vkDestroyCommandPool", - "vkResetCommandPool", - "vkAllocateCommandBuffers", - "vkFreeCommandBuffers", - "vkBeginCommandBuffer", - "vkEndCommandBuffer", - "vkResetCommandBuffer", - "vkCmdCopyBuffer", - "vkCmdCopyImage", - "vkCmdCopyBufferToImage", - "vkCmdCopyImageToBuffer", - "vkCmdUpdateBuffer", - "vkCmdFillBuffer", - "vkCmdPipelineBarrier", - "vkCmdBeginQuery", - "vkCmdEndQuery", - "vkCmdResetQueryPool", - "vkCmdWriteTimestamp", - "vkCmdCopyQueryPoolResults", - "vkCmdExecuteCommands", - "vkCreateEvent", - "vkDestroyEvent", - "vkGetEventStatus", - "vkSetEvent", - "vkResetEvent", - "vkCreateBufferView", - "vkDestroyBufferView", - "vkCreateShaderModule", - "vkDestroyShaderModule", - "vkCreatePipelineCache", - "vkDestroyPipelineCache", - "vkGetPipelineCacheData", - "vkMergePipelineCaches", - "vkCreateComputePipelines", - "vkDestroyPipeline", - "vkCreatePipelineLayout", - "vkDestroyPipelineLayout", - "vkCreateSampler", - "vkDestroySampler", - "vkCreateDescriptorSetLayout", - "vkDestroyDescriptorSetLayout", - "vkCreateDescriptorPool", - "vkDestroyDescriptorPool", - "vkResetDescriptorPool", - "vkAllocateDescriptorSets", - "vkFreeDescriptorSets", - "vkUpdateDescriptorSets", - "vkCmdBindPipeline", - "vkCmdBindDescriptorSets", - "vkCmdClearColorImage", - "vkCmdDispatch", - "vkCmdDispatchIndirect", - "vkCmdSetEvent", - "vkCmdResetEvent", - "vkCmdWaitEvents", - "vkCmdPushConstants", - "vkCreateGraphicsPipelines", - "vkCreateFramebuffer", - "vkDestroyFramebuffer", - "vkCreateRenderPass", - "vkDestroyRenderPass", - "vkGetRenderAreaGranularity", - "vkCmdSetViewport", - "vkCmdSetScissor", - "vkCmdSetLineWidth", - "vkCmdSetDepthBias", - "vkCmdSetBlendConstants", - "vkCmdSetDepthBounds", - "vkCmdSetStencilCompareMask", - "vkCmdSetStencilWriteMask", - "vkCmdSetStencilReference", - "vkCmdBindIndexBuffer", - "vkCmdBindVertexBuffers", - "vkCmdDraw", - "vkCmdDrawIndexed", - "vkCmdDrawIndirect", - "vkCmdDrawIndexedIndirect", - "vkCmdBlitImage", - "vkCmdClearDepthStencilImage", - "vkCmdClearAttachments", - "vkCmdResolveImage", - "vkCmdBeginRenderPass", - "vkCmdNextSubpass", - "vkCmdEndRenderPass", - "vkBindBufferMemory2", - "vkBindImageMemory2", - "vkGetDeviceGroupPeerMemoryFeatures", - "vkCmdSetDeviceMask", - "vkGetImageMemoryRequirements2", - "vkGetBufferMemoryRequirements2", - "vkGetImageSparseMemoryRequirements2", - "vkTrimCommandPool", - "vkGetDeviceQueue2", - "vkCmdDispatchBase", - "vkCreateDescriptorUpdateTemplate", - "vkDestroyDescriptorUpdateTemplate", - "vkUpdateDescriptorSetWithTemplate", - "vkGetDescriptorSetLayoutSupport", - "vkCreateSamplerYcbcrConversion", - "vkDestroySamplerYcbcrConversion", - "vkResetQueryPool", - "vkGetSemaphoreCounterValue", - "vkWaitSemaphores", - "vkSignalSemaphore", - "vkGetBufferDeviceAddress", - "vkGetBufferOpaqueCaptureAddress", - "vkGetDeviceMemoryOpaqueCaptureAddress", - "vkCmdDrawIndirectCount", - "vkCmdDrawIndexedIndirectCount", - "vkCreateRenderPass2", - "vkCmdBeginRenderPass2", - "vkCmdNextSubpass2", - "vkCmdEndRenderPass2", - "vkCreatePrivateDataSlot", - "vkDestroyPrivateDataSlot", - "vkSetPrivateData", - "vkGetPrivateData", - "vkCmdPipelineBarrier2", - "vkCmdWriteTimestamp2", - "vkQueueSubmit2", - "vkCmdCopyBuffer2", - "vkCmdCopyImage2", - "vkCmdCopyBufferToImage2", - "vkCmdCopyImageToBuffer2", - "vkGetDeviceBufferMemoryRequirements", - "vkGetDeviceImageMemoryRequirements", - "vkGetDeviceImageSparseMemoryRequirements", - "vkCmdSetEvent2", - "vkCmdResetEvent2", - "vkCmdWaitEvents2", - "vkCmdBlitImage2", - "vkCmdResolveImage2", - "vkCmdBeginRendering", - "vkCmdEndRendering", - "vkCmdSetCullMode", - "vkCmdSetFrontFace", - "vkCmdSetPrimitiveTopology", - "vkCmdSetViewportWithCount", - "vkCmdSetScissorWithCount", - "vkCmdBindVertexBuffers2", - "vkCmdSetDepthTestEnable", - "vkCmdSetDepthWriteEnable", - "vkCmdSetDepthCompareOp", - "vkCmdSetDepthBoundsTestEnable", - "vkCmdSetStencilTestEnable", - "vkCmdSetStencilOp", - "vkCmdSetRasterizerDiscardEnable", - "vkCmdSetDepthBiasEnable", - "vkCmdSetPrimitiveRestartEnable", - "vkMapMemory2", - "vkUnmapMemory2", - "vkGetDeviceImageSubresourceLayout", - "vkGetImageSubresourceLayout2", - "vkCopyMemoryToImage", - "vkCopyImageToMemory", - "vkCopyImageToImage", - "vkTransitionImageLayout", - "vkCmdPushDescriptorSet", - "vkCmdPushDescriptorSetWithTemplate", - "vkCmdBindDescriptorSets2", - "vkCmdPushConstants2", - "vkCmdPushDescriptorSet2", - "vkCmdPushDescriptorSetWithTemplate2", - "vkCmdSetLineStipple", - "vkCmdBindIndexBuffer2", - "vkGetRenderingAreaGranularity", - "vkCmdSetRenderingAttachmentLocations", - "vkCmdSetRenderingInputAttachmentIndices", -}; - -// The ~553 extension command names extension_instance_gpa() (loader/generated/vk_loader_extensions.c) -// hand-checks, minus ~72 that can't be exercised this way without extra per-name setup: ~48 compiled only -// under a platform-specific #if this Linux test build doesn't define (VK_USE_PLATFORM_WIN32_KHR, -// _ANDROID_KHR, _METAL_EXT, _FUCHSIA, etc.), and ~24 whose case only returns non-null when the backing -// extension is enabled at instance creation, so a bare resolve can't tell "recognized but disabled" apart -// from "a hash-mapping bug made this fall through to not-found". The remaining 481 names resolve -// unconditionally regardless of instance/ICD state, so they can be exhaustively checked like the arrays above. -// -// Explicit template arguments (not CTAD) are load-bearing: Clang caps the recursive fold expression in -// libstdc++'s std::array deduction guide at 256 instantiations, below this array's 481 entries. Naming the -// type and size directly skips that deduction guide. -static constexpr std::array kExtensionInstanceGpaNames = { - "vkGetPhysicalDeviceVideoCapabilitiesKHR", - "vkGetPhysicalDeviceVideoFormatPropertiesKHR", - "vkCreateVideoSessionKHR", - "vkDestroyVideoSessionKHR", - "vkGetVideoSessionMemoryRequirementsKHR", - "vkBindVideoSessionMemoryKHR", - "vkCreateVideoSessionParametersKHR", - "vkUpdateVideoSessionParametersKHR", - "vkDestroyVideoSessionParametersKHR", - "vkCmdBeginVideoCodingKHR", - "vkCmdEndVideoCodingKHR", - "vkCmdControlVideoCodingKHR", - "vkCmdDecodeVideoKHR", - "vkCmdBeginRenderingKHR", - "vkCmdEndRenderingKHR", - "vkGetDeviceGroupPeerMemoryFeaturesKHR", - "vkCmdSetDeviceMaskKHR", - "vkCmdDispatchBaseKHR", - "vkTrimCommandPoolKHR", - "vkGetMemoryFdKHR", - "vkGetMemoryFdPropertiesKHR", - "vkImportSemaphoreFdKHR", - "vkGetSemaphoreFdKHR", - "vkCmdPushDescriptorSetKHR", - "vkCmdPushDescriptorSetWithTemplateKHR", - "vkCreateDescriptorUpdateTemplateKHR", - "vkDestroyDescriptorUpdateTemplateKHR", - "vkUpdateDescriptorSetWithTemplateKHR", - "vkCreateRenderPass2KHR", - "vkCmdBeginRenderPass2KHR", - "vkCmdNextSubpass2KHR", - "vkCmdEndRenderPass2KHR", - "vkGetSwapchainStatusKHR", - "vkImportFenceFdKHR", - "vkGetFenceFdKHR", - "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR", - "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR", - "vkAcquireProfilingLockKHR", - "vkReleaseProfilingLockKHR", - "vkGetImageMemoryRequirements2KHR", - "vkGetBufferMemoryRequirements2KHR", - "vkGetImageSparseMemoryRequirements2KHR", - "vkCreateSamplerYcbcrConversionKHR", - "vkDestroySamplerYcbcrConversionKHR", - "vkBindBufferMemory2KHR", - "vkBindImageMemory2KHR", - "vkGetDescriptorSetLayoutSupportKHR", - "vkCmdDrawIndirectCountKHR", - "vkCmdDrawIndexedIndirectCountKHR", - "vkGetSemaphoreCounterValueKHR", - "vkWaitSemaphoresKHR", - "vkSignalSemaphoreKHR", - "vkGetPhysicalDeviceFragmentShadingRatesKHR", - "vkCmdSetFragmentShadingRateKHR", - "vkCmdSetRenderingAttachmentLocationsKHR", - "vkCmdSetRenderingInputAttachmentIndicesKHR", - "vkWaitForPresentKHR", - "vkGetBufferDeviceAddressKHR", - "vkGetBufferOpaqueCaptureAddressKHR", - "vkGetDeviceMemoryOpaqueCaptureAddressKHR", - "vkCreateDeferredOperationKHR", - "vkDestroyDeferredOperationKHR", - "vkGetDeferredOperationMaxConcurrencyKHR", - "vkGetDeferredOperationResultKHR", - "vkDeferredOperationJoinKHR", - "vkGetPipelineExecutablePropertiesKHR", - "vkGetPipelineExecutableStatisticsKHR", - "vkGetPipelineExecutableInternalRepresentationsKHR", - "vkMapMemory2KHR", - "vkUnmapMemory2KHR", - "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR", - "vkGetEncodedVideoSessionParametersKHR", - "vkCmdEncodeVideoKHR", - "vkCmdSetEvent2KHR", - "vkCmdResetEvent2KHR", - "vkCmdWaitEvents2KHR", - "vkCmdPipelineBarrier2KHR", - "vkCmdWriteTimestamp2KHR", - "vkQueueSubmit2KHR", - "vkCmdBindIndexBuffer3KHR", - "vkCmdBindVertexBuffers3KHR", - "vkCmdDrawIndirect2KHR", - "vkCmdDrawIndexedIndirect2KHR", - "vkCmdDispatchIndirect2KHR", - "vkCmdCopyMemoryKHR", - "vkCmdCopyMemoryToImageKHR", - "vkCmdCopyImageToMemoryKHR", - "vkCmdUpdateMemoryKHR", - "vkCmdFillMemoryKHR", - "vkCmdCopyQueryPoolResultsToMemoryKHR", - "vkCmdDrawIndirectCount2KHR", - "vkCmdDrawIndexedIndirectCount2KHR", - "vkCmdBeginConditionalRendering2EXT", - "vkCmdBindTransformFeedbackBuffers2EXT", - "vkCmdBeginTransformFeedback2EXT", - "vkCmdEndTransformFeedback2EXT", - "vkCmdDrawIndirectByteCount2EXT", - "vkCmdDrawMeshTasksIndirect2EXT", - "vkCmdDrawMeshTasksIndirectCount2EXT", - "vkCmdWriteMarkerToMemoryAMD", - "vkCreateAccelerationStructure2KHR", - "vkCmdCopyBuffer2KHR", - "vkCmdCopyImage2KHR", - "vkCmdCopyBufferToImage2KHR", - "vkCmdCopyImageToBuffer2KHR", - "vkCmdBlitImage2KHR", - "vkCmdResolveImage2KHR", - "vkCmdTraceRaysIndirect2KHR", - "vkGetDeviceBufferMemoryRequirementsKHR", - "vkGetDeviceImageMemoryRequirementsKHR", - "vkGetDeviceImageSparseMemoryRequirementsKHR", - "vkCmdBindIndexBuffer2KHR", - "vkGetRenderingAreaGranularityKHR", - "vkGetDeviceImageSubresourceLayoutKHR", - "vkGetImageSubresourceLayout2KHR", - "vkWaitForPresent2KHR", - "vkCreatePipelineBinariesKHR", - "vkDestroyPipelineBinaryKHR", - "vkGetPipelineKeyKHR", - "vkGetPipelineBinaryDataKHR", - "vkReleaseCapturedPipelineDataKHR", - "vkReleaseSwapchainImagesKHR", - "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR", - "vkCmdSetLineStippleKHR", - "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR", - "vkGetCalibratedTimestampsKHR", - "vkCmdBindDescriptorSets2KHR", - "vkCmdPushConstants2KHR", - "vkCmdPushDescriptorSet2KHR", - "vkCmdPushDescriptorSetWithTemplate2KHR", - "vkCmdSetDescriptorBufferOffsets2EXT", - "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT", - "vkCmdCopyMemoryIndirectKHR", - "vkCmdCopyMemoryToImageIndirectKHR", - "vkGetDeviceFaultReportsKHR", - "vkGetDeviceFaultDebugInfoKHR", - "vkCmdEndRendering2KHR", - "vkDebugMarkerSetObjectTagEXT", - "vkDebugMarkerSetObjectNameEXT", - "vkCmdDebugMarkerBeginEXT", - "vkCmdDebugMarkerEndEXT", - "vkCmdDebugMarkerInsertEXT", - "vkCmdBindTransformFeedbackBuffersEXT", - "vkCmdBeginTransformFeedbackEXT", - "vkCmdEndTransformFeedbackEXT", - "vkCmdBeginQueryIndexedEXT", - "vkCmdEndQueryIndexedEXT", - "vkCmdDrawIndirectByteCountEXT", - "vkCreateCuModuleNVX", - "vkCreateCuFunctionNVX", - "vkDestroyCuModuleNVX", - "vkDestroyCuFunctionNVX", - "vkCmdCuLaunchKernelNVX", - "vkGetImageViewHandleNVX", - "vkGetImageViewHandle64NVX", - "vkGetImageViewAddressNVX", - "vkGetDeviceCombinedImageSamplerIndexNVX", - "vkCmdDrawIndirectCountAMD", - "vkCmdDrawIndexedIndirectCountAMD", - "vkGetShaderInfoAMD", - "vkCmdBeginConditionalRenderingEXT", - "vkCmdEndConditionalRenderingEXT", - "vkCmdSetViewportWScalingNV", - "vkDisplayPowerControlEXT", - "vkRegisterDeviceEventEXT", - "vkRegisterDisplayEventEXT", - "vkGetSwapchainCounterEXT", - "vkGetRefreshCycleDurationGOOGLE", - "vkGetPastPresentationTimingGOOGLE", - "vkCmdSetDiscardRectangleEXT", - "vkCmdSetDiscardRectangleEnableEXT", - "vkCmdSetDiscardRectangleModeEXT", - "vkSetHdrMetadataEXT", - "vkCreateGpaSessionAMD", - "vkDestroyGpaSessionAMD", - "vkSetGpaDeviceClockModeAMD", - "vkGetGpaDeviceClockInfoAMD", - "vkCmdBeginGpaSessionAMD", - "vkCmdEndGpaSessionAMD", - "vkCmdBeginGpaSampleAMD", - "vkCmdEndGpaSampleAMD", - "vkGetGpaSessionStatusAMD", - "vkGetGpaSessionResultsAMD", - "vkResetGpaSessionAMD", - "vkCmdCopyGpaSessionResultsAMD", - "vkWriteSamplerDescriptorsEXT", - "vkWriteResourceDescriptorsEXT", - "vkCmdBindSamplerHeapEXT", - "vkCmdBindResourceHeapEXT", - "vkCmdPushDataEXT", - "vkGetImageOpaqueCaptureDataEXT", - "vkGetPhysicalDeviceDescriptorSizeEXT", - "vkRegisterCustomBorderColorEXT", - "vkUnregisterCustomBorderColorEXT", - "vkGetTensorOpaqueCaptureDataARM", - "vkCmdSetSampleLocationsEXT", - "vkGetPhysicalDeviceMultisamplePropertiesEXT", - "vkGetImageDrmFormatModifierPropertiesEXT", - "vkCreateValidationCacheEXT", - "vkDestroyValidationCacheEXT", - "vkMergeValidationCachesEXT", - "vkGetValidationCacheDataEXT", - "vkCmdBindShadingRateImageNV", - "vkCmdSetViewportShadingRatePaletteNV", - "vkCmdSetCoarseSampleOrderNV", - "vkCreateAccelerationStructureNV", - "vkDestroyAccelerationStructureNV", - "vkGetAccelerationStructureMemoryRequirementsNV", - "vkBindAccelerationStructureMemoryNV", - "vkCmdBuildAccelerationStructureNV", - "vkCmdCopyAccelerationStructureNV", - "vkCmdTraceRaysNV", - "vkCreateRayTracingPipelinesNV", - "vkGetRayTracingShaderGroupHandlesKHR", - "vkGetRayTracingShaderGroupHandlesNV", - "vkGetAccelerationStructureHandleNV", - "vkCmdWriteAccelerationStructuresPropertiesNV", - "vkCompileDeferredNV", - "vkGetMemoryHostPointerPropertiesEXT", - "vkCmdWriteBufferMarkerAMD", - "vkCmdWriteBufferMarker2AMD", - "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT", - "vkGetCalibratedTimestampsEXT", - "vkCmdDrawMeshTasksNV", - "vkCmdDrawMeshTasksIndirectNV", - "vkCmdDrawMeshTasksIndirectCountNV", - "vkCmdSetExclusiveScissorEnableNV", - "vkCmdSetExclusiveScissorNV", - "vkCmdSetCheckpointNV", - "vkGetQueueCheckpointDataNV", - "vkGetQueueCheckpointData2NV", - "vkSetSwapchainPresentTimingQueueSizeEXT", - "vkGetSwapchainTimingPropertiesEXT", - "vkGetSwapchainTimeDomainPropertiesEXT", - "vkGetPastPresentationTimingEXT", - "vkInitializePerformanceApiINTEL", - "vkUninitializePerformanceApiINTEL", - "vkCmdSetPerformanceMarkerINTEL", - "vkCmdSetPerformanceStreamMarkerINTEL", - "vkCmdSetPerformanceOverrideINTEL", - "vkAcquirePerformanceConfigurationINTEL", - "vkReleasePerformanceConfigurationINTEL", - "vkQueueSetPerformanceConfigurationINTEL", - "vkGetPerformanceParameterINTEL", - "vkSetLocalDimmingAMD", - "vkGetBufferDeviceAddressEXT", - "vkGetPhysicalDeviceToolPropertiesEXT", - "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV", - "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV", - "vkCmdSetLineStippleEXT", - "vkResetQueryPoolEXT", - "vkCmdSetCullModeEXT", - "vkCmdSetFrontFaceEXT", - "vkCmdSetPrimitiveTopologyEXT", - "vkCmdSetViewportWithCountEXT", - "vkCmdSetScissorWithCountEXT", - "vkCmdBindVertexBuffers2EXT", - "vkCmdSetDepthTestEnableEXT", - "vkCmdSetDepthWriteEnableEXT", - "vkCmdSetDepthCompareOpEXT", - "vkCmdSetDepthBoundsTestEnableEXT", - "vkCmdSetStencilTestEnableEXT", - "vkCmdSetStencilOpEXT", - "vkCopyMemoryToImageEXT", - "vkCopyImageToMemoryEXT", - "vkCopyImageToImageEXT", - "vkTransitionImageLayoutEXT", - "vkGetImageSubresourceLayout2EXT", - "vkReleaseSwapchainImagesEXT", - "vkGetGeneratedCommandsMemoryRequirementsNV", - "vkCmdPreprocessGeneratedCommandsNV", - "vkCmdExecuteGeneratedCommandsNV", - "vkCmdBindPipelineShaderGroupNV", - "vkCreateIndirectCommandsLayoutNV", - "vkDestroyIndirectCommandsLayoutNV", - "vkCmdSetDepthBias2EXT", - "vkCreatePrivateDataSlotEXT", - "vkDestroyPrivateDataSlotEXT", - "vkSetPrivateDataEXT", - "vkGetPrivateDataEXT", - "vkQueueSetPerfHintQCOM", - "vkCmdDispatchTileQCOM", - "vkCmdBeginPerTileExecutionQCOM", - "vkCmdEndPerTileExecutionQCOM", - "vkSetLatencySleepModeLegacyNV", - "vkLatencySleepLegacyNV", - "vkSetLatencyMarkerLegacyNV", - "vkGetLatencyTimingsLegacyNV", - "vkQueueNotifyOutOfBandLegacyNV", - "vkGetSleepStatusLegacyNV", - "vkShutdownLatencyDeviceLegacyNV", - "vkGetDescriptorSetLayoutSizeEXT", - "vkGetDescriptorSetLayoutBindingOffsetEXT", - "vkGetDescriptorEXT", - "vkCmdBindDescriptorBuffersEXT", - "vkCmdSetDescriptorBufferOffsetsEXT", - "vkCmdBindDescriptorBufferEmbeddedSamplersEXT", - "vkGetBufferOpaqueCaptureDescriptorDataEXT", - "vkGetImageOpaqueCaptureDescriptorDataEXT", - "vkGetImageViewOpaqueCaptureDescriptorDataEXT", - "vkGetSamplerOpaqueCaptureDescriptorDataEXT", - "vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT", - "vkCmdSetFragmentShadingRateEnumNV", - "vkGetDeviceFaultInfoEXT", - "vkCmdSetVertexInputEXT", - "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI", - "vkCmdSubpassShadingHUAWEI", - "vkCmdBindInvocationMaskHUAWEI", - "vkGetMemoryRemoteAddressNV", - "vkGetPipelinePropertiesEXT", - "vkCmdSetPatchControlPointsEXT", - "vkCmdSetRasterizerDiscardEnableEXT", - "vkCmdSetDepthBiasEnableEXT", - "vkCmdSetLogicOpEXT", - "vkCmdSetPrimitiveRestartEnableEXT", - "vkCmdSetColorWriteEnableEXT", - "vkCmdDrawMultiEXT", - "vkCmdDrawMultiIndexedEXT", - "vkCreateMicromapEXT", - "vkDestroyMicromapEXT", - "vkCmdBuildMicromapsEXT", - "vkBuildMicromapsEXT", - "vkCopyMicromapEXT", - "vkCopyMicromapToMemoryEXT", - "vkCopyMemoryToMicromapEXT", - "vkWriteMicromapsPropertiesEXT", - "vkCmdCopyMicromapEXT", - "vkCmdCopyMicromapToMemoryEXT", - "vkCmdCopyMemoryToMicromapEXT", - "vkCmdWriteMicromapsPropertiesEXT", - "vkGetDeviceMicromapCompatibilityEXT", - "vkGetMicromapBuildSizesEXT", - "vkCmdDrawClusterHUAWEI", - "vkCmdDrawClusterIndirectHUAWEI", - "vkSetDeviceMemoryPriorityEXT", - "vkCmdSetDispatchParametersARM", - "vkGetDescriptorSetLayoutHostMappingInfoVALVE", - "vkGetDescriptorSetHostMappingVALVE", - "vkCmdCopyMemoryIndirectNV", - "vkCmdCopyMemoryToImageIndirectNV", - "vkCmdDecompressMemoryNV", - "vkCmdDecompressMemoryIndirectCountNV", - "vkGetPipelineIndirectMemoryRequirementsNV", - "vkCmdUpdatePipelineIndirectBufferNV", - "vkGetPipelineIndirectDeviceAddressNV", - "vkCmdSetDepthClampEnableEXT", - "vkCmdSetPolygonModeEXT", - "vkCmdSetRasterizationSamplesEXT", - "vkCmdSetSampleMaskEXT", - "vkCmdSetAlphaToCoverageEnableEXT", - "vkCmdSetAlphaToOneEnableEXT", - "vkCmdSetLogicOpEnableEXT", - "vkCmdSetColorBlendEnableEXT", - "vkCmdSetColorBlendEquationEXT", - "vkCmdSetColorWriteMaskEXT", - "vkCmdSetTessellationDomainOriginEXT", - "vkCmdSetRasterizationStreamEXT", - "vkCmdSetConservativeRasterizationModeEXT", - "vkCmdSetExtraPrimitiveOverestimationSizeEXT", - "vkCmdSetDepthClipEnableEXT", - "vkCmdSetSampleLocationsEnableEXT", - "vkCmdSetColorBlendAdvancedEXT", - "vkCmdSetProvokingVertexModeEXT", - "vkCmdSetLineRasterizationModeEXT", - "vkCmdSetLineStippleEnableEXT", - "vkCmdSetDepthClipNegativeOneToOneEXT", - "vkCmdSetViewportWScalingEnableNV", - "vkCmdSetViewportSwizzleNV", - "vkCmdSetCoverageToColorEnableNV", - "vkCmdSetCoverageToColorLocationNV", - "vkCmdSetCoverageModulationModeNV", - "vkCmdSetCoverageModulationTableEnableNV", - "vkCmdSetCoverageModulationTableNV", - "vkCmdSetShadingRateImageEnableNV", - "vkCmdSetRepresentativeFragmentTestEnableNV", - "vkCmdSetCoverageReductionModeNV", - "vkCreateTensorARM", - "vkDestroyTensorARM", - "vkCreateTensorViewARM", - "vkDestroyTensorViewARM", - "vkGetTensorMemoryRequirementsARM", - "vkBindTensorMemoryARM", - "vkGetDeviceTensorMemoryRequirementsARM", - "vkCmdCopyTensorARM", - "vkGetPhysicalDeviceExternalTensorPropertiesARM", - "vkGetTensorOpaqueCaptureDescriptorDataARM", - "vkGetTensorViewOpaqueCaptureDescriptorDataARM", - "vkGetShaderModuleIdentifierEXT", - "vkGetShaderModuleCreateInfoIdentifierEXT", - "vkGetPhysicalDeviceOpticalFlowImageFormatsNV", - "vkCreateOpticalFlowSessionNV", - "vkDestroyOpticalFlowSessionNV", - "vkBindOpticalFlowSessionImageNV", - "vkCmdOpticalFlowExecuteNV", - "vkAntiLagUpdateAMD", - "vkCreateShadersEXT", - "vkDestroyShaderEXT", - "vkGetShaderBinaryDataEXT", - "vkCmdBindShadersEXT", - "vkCmdSetDepthClampRangeEXT", - "vkGetFramebufferTilePropertiesQCOM", - "vkGetDynamicRenderingTilePropertiesQCOM", - "vkGetPhysicalDeviceCooperativeVectorPropertiesNV", - "vkConvertCooperativeVectorMatrixNV", - "vkCmdConvertCooperativeVectorMatrixNV", - "vkSetLatencySleepModeNV", - "vkLatencySleepNV", - "vkSetLatencyMarkerNV", - "vkGetLatencyTimingsNV", - "vkQueueNotifyOutOfBandNV", - "vkCreateDataGraphPipelinesARM", - "vkCreateDataGraphPipelineSessionARM", - "vkGetDataGraphPipelineSessionBindPointRequirementsARM", - "vkGetDataGraphPipelineSessionMemoryRequirementsARM", - "vkBindDataGraphPipelineSessionMemoryARM", - "vkDestroyDataGraphPipelineSessionARM", - "vkCmdDispatchDataGraphARM", - "vkGetDataGraphPipelineAvailablePropertiesARM", - "vkGetDataGraphPipelinePropertiesARM", - "vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM", - "vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM", - "vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM", - "vkCmdSetAttachmentFeedbackLoopEnableEXT", - "vkCmdBindTileMemoryQCOM", - "vkCmdDecompressMemoryEXT", - "vkCmdDecompressMemoryIndirectCountEXT", - "vkCreateExternalComputeQueueNV", - "vkDestroyExternalComputeQueueNV", - "vkGetExternalComputeQueueDataNV", - "vkGetClusterAccelerationStructureBuildSizesNV", - "vkCmdBuildClusterAccelerationStructureIndirectNV", - "vkGetPartitionedAccelerationStructuresBuildSizesNV", - "vkCmdBuildPartitionedAccelerationStructuresNV", - "vkGetGeneratedCommandsMemoryRequirementsEXT", - "vkCmdPreprocessGeneratedCommandsEXT", - "vkCmdExecuteGeneratedCommandsEXT", - "vkCreateIndirectCommandsLayoutEXT", - "vkDestroyIndirectCommandsLayoutEXT", - "vkCreateIndirectExecutionSetEXT", - "vkDestroyIndirectExecutionSetEXT", - "vkUpdateIndirectExecutionSetPipelineEXT", - "vkUpdateIndirectExecutionSetShaderEXT", - "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV", - "vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM", - "vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM", - "vkCreateShaderInstrumentationARM", - "vkDestroyShaderInstrumentationARM", - "vkCmdBeginShaderInstrumentationARM", - "vkCmdEndShaderInstrumentationARM", - "vkGetShaderInstrumentationValuesARM", - "vkClearShaderInstrumentationMetricsARM", - "vkCmdEndRendering2EXT", - "vkCmdBeginCustomResolveEXT", - "vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM", - "vkCmdSetComputeOccupancyPriorityNV", - "vkCmdSetPrimitiveRestartIndexEXT", - "vkCreateAccelerationStructureKHR", - "vkDestroyAccelerationStructureKHR", - "vkCmdBuildAccelerationStructuresKHR", - "vkCmdBuildAccelerationStructuresIndirectKHR", - "vkBuildAccelerationStructuresKHR", - "vkCopyAccelerationStructureKHR", - "vkCopyAccelerationStructureToMemoryKHR", - "vkCopyMemoryToAccelerationStructureKHR", - "vkWriteAccelerationStructuresPropertiesKHR", - "vkCmdCopyAccelerationStructureKHR", - "vkCmdCopyAccelerationStructureToMemoryKHR", - "vkCmdCopyMemoryToAccelerationStructureKHR", - "vkGetAccelerationStructureDeviceAddressKHR", - "vkCmdWriteAccelerationStructuresPropertiesKHR", - "vkGetDeviceAccelerationStructureCompatibilityKHR", - "vkGetAccelerationStructureBuildSizesKHR", - "vkCmdTraceRaysKHR", - "vkCreateRayTracingPipelinesKHR", - "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", - "vkCmdTraceRaysIndirectKHR", - "vkGetRayTracingShaderGroupStackSizeKHR", - "vkCmdSetRayTracingPipelineStackSizeKHR", - "vkCmdDrawMeshTasksEXT", - "vkCmdDrawMeshTasksIndirectEXT", - "vkCmdDrawMeshTasksIndirectCountEXT", -}; - // Exhaustively call every one of gpa_helper.c's ~230 hand-checked core instance trampoline names through // the real vkGetInstanceProcAddr entry point and confirm each still resolves - i.e. the mechanical // hash-prefilter transformation of that file didn't drop, misname, or mis-hash any branch. @@ -1833,3 +889,17 @@ TEST(GetDeviceProcAddr, AppQueries13FunctionsWhileOnlyEnabling12) { } } } + +TEST(BinaryInterface, ExportedFunctions) { +#if defined(APPLE_STATIC_LOADER) + GTEST_SKIP() << "Static build doesn't have a dynamic library, so no exported functions to verify"; +#endif + LibraryWrapper vk_loader{FRAMEWORK_VULKAN_LIBRARY_PATH}; + + for (auto const& name : kExportedFunctionNames) { + ASSERT_NE(vk_loader.get_symbol_no_cast(name), nullptr); + } + for (auto const& name : kPlatformExportedFunctionNames) { + ASSERT_NE(vk_loader.get_symbol_no_cast(name), nullptr); + } +}