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); + } +}