From 99f24621346e9fd4061b7eaee918a3e402108e95 Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Mon, 24 Feb 2025 17:27:45 -0600 Subject: [PATCH] Refactor codegen scripts to use vulkan_object.py Requires hardcoding a few things to make it work, most notably: * Missing Extension Requires Depends information * Missing aliases for handles On the whole, the codegen outputs *almost* identical files from before, making the refactor not able to introduce issues into the output. The changes that do occur to remove duplicated if statements from aliased handles or for comments and whitespace. --- loader/generated/vk_layer_dispatch_table.h | 11 +- loader/generated/vk_loader_extensions.c | 35 +- loader/generated/vk_loader_extensions.h | 12 +- loader/generated/vk_object_types.h | 15 +- scripts/dispatch_table_helper_generator.py | 273 +- scripts/generate_source.py | 130 +- scripts/helper_file_generator.py | 644 ++--- scripts/loader_extension_generator.py | 2194 +++++++---------- .../layer/vk_dispatch_table_helper.h | 666 +++-- 9 files changed, 1590 insertions(+), 2390 deletions(-) diff --git a/loader/generated/vk_layer_dispatch_table.h b/loader/generated/vk_layer_dispatch_table.h index 8473b9b88..4e41db082 100644 --- a/loader/generated/vk_layer_dispatch_table.h +++ b/loader/generated/vk_layer_dispatch_table.h @@ -2,9 +2,9 @@ // See loader_extension_generator.py for modifications /* - * Copyright (c) 2015-2022 The Khronos Group Inc. - * Copyright (c) 2015-2022 Valve Corporation - * Copyright (c) 2015-2022 LunarG, Inc. + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * Copyright (c) 2023-2023 RasterGrid Kft. * @@ -22,6 +22,7 @@ * * Author: Mark Lobodzinski * Author: Mark Young + * Author: Charles Giessen */ // clang-format off @@ -858,7 +859,11 @@ typedef struct VkLayerDispatchTable_ { PFN_vkCmdCopyAccelerationStructureNV CmdCopyAccelerationStructureNV; PFN_vkCmdTraceRaysNV CmdTraceRaysNV; PFN_vkCreateRayTracingPipelinesNV CreateRayTracingPipelinesNV; + + // ---- VK_KHR_ray_tracing_pipeline extension commands PFN_vkGetRayTracingShaderGroupHandlesKHR GetRayTracingShaderGroupHandlesKHR; + + // ---- VK_NV_ray_tracing extension commands PFN_vkGetRayTracingShaderGroupHandlesNV GetRayTracingShaderGroupHandlesNV; PFN_vkGetAccelerationStructureHandleNV GetAccelerationStructureHandleNV; PFN_vkCmdWriteAccelerationStructuresPropertiesNV CmdWriteAccelerationStructuresPropertiesNV; diff --git a/loader/generated/vk_loader_extensions.c b/loader/generated/vk_loader_extensions.c index 5f909cb7a..16392bec8 100644 --- a/loader/generated/vk_loader_extensions.c +++ b/loader/generated/vk_loader_extensions.c @@ -2,9 +2,9 @@ // See loader_extension_generator.py for modifications /* - * Copyright (c) 2015-2022 The Khronos Group Inc. - * Copyright (c) 2015-2022 Valve Corporation - * Copyright (c) 2015-2022 LunarG, Inc. + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * Copyright (c) 2023-2023 RasterGrid Kft. * @@ -22,6 +22,7 @@ * * Author: Mark Lobodzinski * Author: Mark Young + * Author: Charles Giessen */ // clang-format off @@ -896,7 +897,11 @@ VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct lo table->CmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)gdpa(dev, "vkCmdCopyAccelerationStructureNV"); table->CmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)gdpa(dev, "vkCmdTraceRaysNV"); table->CreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)gdpa(dev, "vkCreateRayTracingPipelinesNV"); + + // ---- VK_KHR_ray_tracing_pipeline extension commands table->GetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)gdpa(dev, "vkGetRayTracingShaderGroupHandlesKHR"); + + // ---- VK_NV_ray_tracing extension commands table->GetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)gdpa(dev, "vkGetRayTracingShaderGroupHandlesNV"); table->GetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)gdpa(dev, "vkGetAccelerationStructureHandleNV"); table->CmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)gdpa(dev, "vkCmdWriteAccelerationStructuresPropertiesNV"); @@ -1540,19 +1545,23 @@ VKAPI_ATTR void VKAPI_CALL loader_init_instance_extension_dispatch_table(VkLayer void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) { struct loader_device_terminator_dispatch* dispatch = &dev->loader_dispatch.extension_terminator_dispatch; PFN_vkGetDeviceProcAddr gpda = (PFN_vkGetDeviceProcAddr)dev->phys_dev_term->this_icd_term->dispatch.GetDeviceProcAddr; + // ---- VK_KHR_swapchain extension commands if (dev->driver_extensions.khr_swapchain_enabled) dispatch->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpda(dev->icd_device, "vkCreateSwapchainKHR"); if (dev->driver_extensions.khr_swapchain_enabled) dispatch->GetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)gpda(dev->icd_device, "vkGetDeviceGroupSurfacePresentModesKHR"); + // ---- VK_KHR_display_swapchain extension commands if (dev->driver_extensions.khr_display_swapchain_enabled) dispatch->CreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)gpda(dev->icd_device, "vkCreateSharedSwapchainsKHR"); + // ---- VK_EXT_debug_marker extension commands if (dev->driver_extensions.ext_debug_marker_enabled) dispatch->DebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)gpda(dev->icd_device, "vkDebugMarkerSetObjectTagEXT"); if (dev->driver_extensions.ext_debug_marker_enabled) dispatch->DebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)gpda(dev->icd_device, "vkDebugMarkerSetObjectNameEXT"); + // ---- VK_EXT_debug_utils extension commands if (dev->driver_extensions.ext_debug_utils_enabled) dispatch->SetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)gpda(dev->icd_device, "vkSetDebugUtilsObjectNameEXT"); @@ -1571,6 +1580,7 @@ void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) { if (dev->driver_extensions.ext_debug_utils_enabled) dispatch->CmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)gpda(dev->icd_device, "vkCmdInsertDebugUtilsLabelEXT"); #if defined(VK_USE_PLATFORM_WIN32_KHR) + // ---- VK_EXT_full_screen_exclusive extension commands if (dev->driver_extensions.ext_full_screen_exclusive_enabled && (dev->driver_extensions.khr_device_group_enabled || dev->driver_extensions.version_1_1_enabled)) dispatch->GetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)gpda(dev->icd_device, "vkGetDeviceGroupSurfacePresentModes2EXT"); @@ -1579,6 +1589,7 @@ void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) { // These are prototypes for functions that need their trampoline called in all circumstances. // They are used in loader_lookup_device_dispatch_table but are defined afterwards. + // ---- VK_EXT_debug_marker extension commands VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT( VkDevice device, @@ -1586,6 +1597,7 @@ VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT( VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT( VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo); + // ---- VK_EXT_debug_utils extension commands VKAPI_ATTR VkResult VKAPI_CALL SetDebugUtilsObjectNameEXT( VkDevice device, @@ -2778,7 +2790,11 @@ VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDis if (!strcmp(name, "CmdCopyAccelerationStructureNV")) return (void *)table->CmdCopyAccelerationStructureNV; if (!strcmp(name, "CmdTraceRaysNV")) return (void *)table->CmdTraceRaysNV; if (!strcmp(name, "CreateRayTracingPipelinesNV")) return (void *)table->CreateRayTracingPipelinesNV; + + // ---- VK_KHR_ray_tracing_pipeline extension commands if (!strcmp(name, "GetRayTracingShaderGroupHandlesKHR")) return (void *)table->GetRayTracingShaderGroupHandlesKHR; + + // ---- VK_NV_ray_tracing extension commands if (!strcmp(name, "GetRayTracingShaderGroupHandlesNV")) return (void *)table->GetRayTracingShaderGroupHandlesNV; if (!strcmp(name, "GetAccelerationStructureHandleNV")) return (void *)table->GetAccelerationStructureHandleNV; if (!strcmp(name, "CmdWriteAccelerationStructuresPropertiesNV")) return (void *)table->CmdWriteAccelerationStructuresPropertiesNV; @@ -6713,6 +6729,9 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRayTracingPipelinesNV( return disp->CreateRayTracingPipelinesNV(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines); } + +// ---- VK_KHR_ray_tracing_pipeline extension trampoline/terminators + VKAPI_ATTR VkResult VKAPI_CALL GetRayTracingShaderGroupHandlesKHR( VkDevice device, VkPipeline pipeline, @@ -6730,6 +6749,9 @@ VKAPI_ATTR VkResult VKAPI_CALL GetRayTracingShaderGroupHandlesKHR( return disp->GetRayTracingShaderGroupHandlesKHR(device, pipeline, firstGroup, groupCount, dataSize, pData); } + +// ---- VK_NV_ray_tracing extension trampoline/terminators + VKAPI_ATTR VkResult VKAPI_CALL GetRayTracingShaderGroupHandlesNV( VkDevice device, VkPipeline pipeline, @@ -11467,10 +11489,14 @@ bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *na *addr = (void *)CreateRayTracingPipelinesNV; return true; } + + // ---- VK_KHR_ray_tracing_pipeline extension commands if (!strcmp("vkGetRayTracingShaderGroupHandlesKHR", name)) { *addr = (void *)GetRayTracingShaderGroupHandlesKHR; return true; } + + // ---- VK_NV_ray_tracing extension commands if (!strcmp("vkGetRayTracingShaderGroupHandlesNV", name)) { *addr = (void *)GetRayTracingShaderGroupHandlesNV; return true; @@ -13006,6 +13032,9 @@ const char *const LOADER_INSTANCE_EXTENSIONS[] = { #if defined(VK_USE_PLATFORM_WAYLAND_KHR) VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, #endif // VK_USE_PLATFORM_WAYLAND_KHR +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, +#endif // VK_USE_PLATFORM_ANDROID_KHR #if defined(VK_USE_PLATFORM_WIN32_KHR) VK_KHR_WIN32_SURFACE_EXTENSION_NAME, #endif // VK_USE_PLATFORM_WIN32_KHR diff --git a/loader/generated/vk_loader_extensions.h b/loader/generated/vk_loader_extensions.h index caa38dd5b..fceeb1289 100644 --- a/loader/generated/vk_loader_extensions.h +++ b/loader/generated/vk_loader_extensions.h @@ -2,9 +2,9 @@ // See loader_extension_generator.py for modifications /* - * Copyright (c) 2015-2022 The Khronos Group Inc. - * Copyright (c) 2015-2022 Valve Corporation - * Copyright (c) 2015-2022 LunarG, Inc. + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * Copyright (c) 2023-2023 RasterGrid Kft. * @@ -22,6 +22,7 @@ * * Author: Mark Lobodzinski * Author: Mark Young + * Author: Charles Giessen */ // clang-format off @@ -502,14 +503,18 @@ struct loader_instance_extension_enables { // Functions that required a terminator need to have a separate dispatch table which contains their corresponding // device function. This is used in the terminators themselves. struct loader_device_terminator_dispatch { + // ---- VK_KHR_swapchain extension commands PFN_vkCreateSwapchainKHR CreateSwapchainKHR; PFN_vkGetDeviceGroupSurfacePresentModesKHR GetDeviceGroupSurfacePresentModesKHR; + // ---- VK_KHR_display_swapchain extension commands PFN_vkCreateSharedSwapchainsKHR CreateSharedSwapchainsKHR; + // ---- VK_EXT_debug_marker extension commands PFN_vkDebugMarkerSetObjectTagEXT DebugMarkerSetObjectTagEXT; PFN_vkDebugMarkerSetObjectNameEXT DebugMarkerSetObjectNameEXT; + // ---- VK_EXT_debug_utils extension commands PFN_vkSetDebugUtilsObjectNameEXT SetDebugUtilsObjectNameEXT; PFN_vkSetDebugUtilsObjectTagEXT SetDebugUtilsObjectTagEXT; @@ -520,6 +525,7 @@ struct loader_device_terminator_dispatch { PFN_vkCmdEndDebugUtilsLabelEXT CmdEndDebugUtilsLabelEXT; PFN_vkCmdInsertDebugUtilsLabelEXT CmdInsertDebugUtilsLabelEXT; #if defined(VK_USE_PLATFORM_WIN32_KHR) + // ---- VK_EXT_full_screen_exclusive extension commands PFN_vkGetDeviceGroupSurfacePresentModes2EXT GetDeviceGroupSurfacePresentModes2EXT; #endif // VK_USE_PLATFORM_WIN32_KHR diff --git a/loader/generated/vk_object_types.h b/loader/generated/vk_object_types.h index c7666efbd..98bee44b2 100644 --- a/loader/generated/vk_object_types.h +++ b/loader/generated/vk_object_types.h @@ -5,9 +5,9 @@ /*************************************************************************** * - * Copyright (c) 2015-2017 The Khronos Group Inc. - * Copyright (c) 2015-2017 Valve Corporation - * Copyright (c) 2015-2017 LunarG, Inc. + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. * Copyright (c) 2015-2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,6 +27,7 @@ * Author: Tobin Ehlis * Author: Chris Forbes * Author: John Zulauf + * Author: Charles Giessen * ****************************************************************************/ @@ -346,12 +347,8 @@ static inline VkObjectType convertDebugReportObjectToCoreObject(VkDebugReportObj return VK_OBJECT_TYPE_CU_MODULE_NVX; } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT) { return VK_OBJECT_TYPE_CU_FUNCTION_NVX; - } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT) { - return VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR; } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR; - } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT) { - return VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR; } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT) { return VK_OBJECT_TYPE_VALIDATION_CACHE_EXT; } else if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT) { @@ -440,12 +437,8 @@ static inline VkDebugReportObjectTypeEXT convertCoreObjectToDebugReportObject(Vk return VK_DEBUG_REPORT_OBJECT_TYPE_CU_MODULE_NVX_EXT; } else if (core_report_obj == VK_OBJECT_TYPE_CU_FUNCTION_NVX) { return VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT; - } else if (core_report_obj == VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR) { - return VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT; } else if (core_report_obj == VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR) { return VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT; - } else if (core_report_obj == VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR) { - return VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT; } else if (core_report_obj == VK_OBJECT_TYPE_VALIDATION_CACHE_EXT) { return VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT; } else if (core_report_obj == VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV) { diff --git a/scripts/dispatch_table_helper_generator.py b/scripts/dispatch_table_helper_generator.py index 67af7be1d..8aa1c7740 100644 --- a/scripts/dispatch_table_helper_generator.py +++ b/scripts/dispatch_table_helper_generator.py @@ -18,219 +18,84 @@ # limitations under the License. # # Author: Mark Lobodzinski +# Author: Charles Giessen -import os,re,sys -import xml.etree.ElementTree as etree -from generator import * -from collections import namedtuple -from common_codegen import * +from base_generator import BaseGenerator -return_type_table = {"VkResult": "VK_SUCCESS", - "uint32_t": "0", - "uint64_t": "0L", - "VkDeviceAddress": "0L", - "VkDeviceSize": "0L"} +class DispatchTableHelperGenerator(BaseGenerator): + def __init__(self): + BaseGenerator.__init__(self) -# -# DispatchTableHelperOutputGeneratorOptions - subclass of GeneratorOptions. -class DispatchTableHelperOutputGeneratorOptions(GeneratorOptions): - def __init__(self, - conventions = None, - filename = None, - directory = '.', - genpath = None, - apiname = None, - profile = None, - versions = '.*', - emitversions = '.*', - defaultExtensions = None, - addExtensions = None, - removeExtensions = None, - emitExtensions = None, - sortProcedure = regSortFeatures, - prefixText = "", - genFuncPointers = True, - apicall = '', - apientry = '', - apientryp = '', - alignFuncParam = 0, - expandEnumerants = True): - GeneratorOptions.__init__(self, - conventions = conventions, - filename = filename, - directory = directory, - genpath = genpath, - apiname = apiname, - profile = profile, - versions = versions, - emitversions = emitversions, - defaultExtensions = defaultExtensions, - addExtensions = addExtensions, - removeExtensions = removeExtensions, - emitExtensions = emitExtensions, - sortProcedure = sortProcedure) - self.prefixText = prefixText - self.genFuncPointers = genFuncPointers - self.prefixText = None - self.apicall = apicall - self.apientry = apientry - self.apientryp = apientryp - self.alignFuncParam = alignFuncParam -# -# DispatchTableHelperOutputGenerator - subclass of OutputGenerator. -# Generates dispatch table helper header files for LVL -class DispatchTableHelperOutputGenerator(OutputGenerator): - """Generate dispatch table helper header based on XML element attributes""" - def __init__(self, - errFile = sys.stderr, - warnFile = sys.stderr, - diagFile = sys.stdout): - OutputGenerator.__init__(self, errFile, warnFile, diagFile) - # Internal state - accumulators for different inner block text - self.instance_dispatch_list = [] # List of entries for instance dispatch list - self.device_dispatch_list = [] # List of entries for device dispatch list - self.dev_ext_stub_list = [] # List of stub functions for device extension functions - self.device_extension_list = [] # List of device extension functions - self.extension_type = '' - # - # Called once at the beginning of each run - def beginFile(self, genOpts): - OutputGenerator.beginFile(self, genOpts) - write("#pragma once", file=self.outFile) - # User-supplied prefix text, if any (list of strings) - if (genOpts.prefixText): - for s in genOpts.prefixText: - write(s, file=self.outFile) - # File Comment - file_comment = '// *** THIS FILE IS GENERATED - DO NOT EDIT ***\n' - file_comment += '// See dispatch_table_helper_generator.py for modifications\n' - write(file_comment, file=self.outFile) - # Copyright Notice - copyright = '/*\n' - copyright += ' * Copyright (c) 2015-2021 The Khronos Group Inc.\n' - copyright += ' * Copyright (c) 2015-2021 Valve Corporation\n' - copyright += ' * Copyright (c) 2015-2021 LunarG, Inc.\n' - copyright += ' *\n' - copyright += ' * Licensed under the Apache License, Version 2.0 (the "License");\n' - copyright += ' * you may not use this file except in compliance with the License.\n' - copyright += ' * You may obtain a copy of the License at\n' - copyright += ' *\n' - copyright += ' * http://www.apache.org/licenses/LICENSE-2.0\n' - copyright += ' *\n' - copyright += ' * Unless required by applicable law or agreed to in writing, software\n' - copyright += ' * distributed under the License is distributed on an "AS IS" BASIS,\n' - copyright += ' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' - copyright += ' * See the License for the specific language governing permissions and\n' - copyright += ' * limitations under the License.\n' - copyright += ' *\n' - copyright += ' * Author: Courtney Goeltzenleuchter \n' - copyright += ' * Author: Jon Ashburn \n' - copyright += ' * Author: Mark Lobodzinski \n' - copyright += ' */\n' - - preamble = '' - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include "loader/generated/vk_layer_dispatch_table.h"\n' - - write(copyright, file=self.outFile) - write(preamble, file=self.outFile) - # - # Write generate and write dispatch tables to output file - def endFile(self): - device_table = '' - instance_table = '' - - device_table += self.OutputDispatchTableHelper('device') - instance_table += self.OutputDispatchTableHelper('instance') - - for stub in self.dev_ext_stub_list: - write(stub, file=self.outFile) - write("\n\n", file=self.outFile) - write(device_table, file=self.outFile); - write("\n", file=self.outFile) - write(instance_table, file=self.outFile); + def generate(self): + out = [] - # Finish processing in superclass - OutputGenerator.endFile(self) - # - # Processing at beginning of each feature or extension - def beginFeature(self, interface, emit): - OutputGenerator.beginFeature(self, interface, emit) - self.featureExtraProtect = GetFeatureProtect(interface) - self.extension_type = interface.get('type') - - # - # Process commands, adding to appropriate dispatch tables - def genCmd(self, cmdinfo, name, alias): - OutputGenerator.genCmd(self, cmdinfo, name, alias) - - avoid_entries = ['vkCreateInstance', - 'vkCreateDevice'] - # Get first param type - params = cmdinfo.elem.findall('param') - info = self.getTypeNameTuple(params[0]) - - if name not in avoid_entries: - self.AddCommandToDispatchList(name, info[0], self.featureExtraProtect, cmdinfo) - - # - # Determine if this API should be ignored or added to the instance or device dispatch table - def AddCommandToDispatchList(self, name, handle_type, protect, cmdinfo): - handle = self.registry.tree.find("types/type/[name='" + handle_type + "'][@category='handle']") - if handle is None: - return - if handle_type != 'VkInstance' and handle_type != 'VkPhysicalDevice' and name != 'vkGetInstanceProcAddr': - self.device_dispatch_list.append((name, self.featureExtraProtect)) - else: - self.instance_dispatch_list.append((name, self.featureExtraProtect)) - return - # - # Retrieve the type and name for a parameter - def getTypeNameTuple(self, param): - type = '' - name = '' - for elem in param: - if elem.tag == 'type': - type = noneStr(elem.text) - elif elem.tag == 'name': - name = noneStr(elem.text) - return (type, name) - # - # Create a dispatch table from the appropriate list and return it as a string - def OutputDispatchTableHelper(self, table_type): - entries = [] - table = '' + out.append('#pragma once\n') + out.append('// *** THIS FILE IS GENERATED - DO NOT EDIT ***\n') + out.append('// See dispatch_table_helper_generator.py for modifications\n') + out.append('\n') + # Copyright Notice + out.append('/*\n') + out.append(' * Copyright (c) 2015-2025 The Khronos Group Inc.\n') + out.append(' * Copyright (c) 2015-2025 Valve Corporation\n') + out.append(' * Copyright (c) 2015-2025 LunarG, Inc.\n') + out.append(' *\n') + out.append(' * Licensed under the Apache License, Version 2.0 (the "License");\n') + out.append(' * you may not use this file except in compliance with the License.\n') + out.append(' * You may obtain a copy of the License at\n') + out.append(' *\n') + out.append(' * http://www.apache.org/licenses/LICENSE-2.0\n') + out.append(' *\n') + out.append(' * Unless required by applicable law or agreed to in writing, software\n') + out.append(' * distributed under the License is distributed on an "AS IS" BASIS,\n') + out.append(' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n') + out.append(' * See the License for the specific language governing permissions and\n') + out.append(' * limitations under the License.\n') + out.append(' *\n') + out.append(' * Author: Courtney Goeltzenleuchter \n') + out.append(' * Author: Jon Ashburn \n') + out.append(' * Author: Mark Lobodzinski \n') + out.append(' * Author: Charles Giessen \n') + out.append(' */\n') + out.append('\n') + out.append('#include \n') + out.append('#include \n') + out.append('#include \n') + out.append('#include "loader/generated/vk_layer_dispatch_table.h"\n') + out.append('\n') + + self.OutputDispatchTableHelper(out, 'device') + out.append('\n\n') + self.OutputDispatchTableHelper(out, 'instance') + + self.write(''.join(out)) + + # Create a dispatch table from the corresponding table_type and append it to out + def OutputDispatchTableHelper(self, out: list, table_type: str): if table_type == 'device': - entries = self.device_dispatch_list - table += 'static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDispatchTable *table, PFN_vkGetDeviceProcAddr gpa) {\n' - table += ' memset(table, 0, sizeof(*table));\n' - table += ' table->magic = DEVICE_DISP_TABLE_MAGIC_NUMBER;\n\n' - table += ' // Device function pointers\n' + out.append('static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDispatchTable *table, PFN_vkGetDeviceProcAddr gpa) {\n') + out.append(' memset(table, 0, sizeof(*table));\n') + out.append(' table->magic = DEVICE_DISP_TABLE_MAGIC_NUMBER;\n\n') + out.append(' // Device function pointers\n') else: - entries = self.instance_dispatch_list - table += 'static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa) {\n' - table += ' memset(table, 0, sizeof(*table));\n\n' - table += ' // Instance function pointers\n' + out.append('static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa) {\n') + out.append(' memset(table, 0, sizeof(*table));\n\n') + out.append(' // Instance function pointers\n') - for item in entries: - # Remove 'vk' from proto name - base_name = item[0][2:] + for command_name, command in self.vk.commands.items(): + if (table_type == 'device' and not command.device) or (table_type == 'instance' and command.device): + continue - if item[1] is not None: - table += '#if defined(%s)\n' % item[1] + if command.protect is not None: + out.append( f'#if defined({command.protect})\n') # If we're looking for the proc we are passing in, just point the table to it. This fixes the issue where # a layer overrides the function name for the loader. - if (table_type == 'device' and base_name == 'GetDeviceProcAddr'): - table += ' table->GetDeviceProcAddr = gpa;\n' - elif (table_type != 'device' and base_name == 'GetInstanceProcAddr'): - table += ' table->GetInstanceProcAddr = gpa;\n' + if (table_type == 'device' and command_name == 'vkGetDeviceProcAddr'): + out.append( ' table->GetDeviceProcAddr = gpa;\n') + elif (table_type != 'device' and command_name == 'vkGetInstanceProcAddr'): + out.append( ' table->GetInstanceProcAddr = gpa;\n') else: - table += ' table->%s = (PFN_%s) gpa(%s, "%s");\n' % (base_name, item[0], table_type, item[0]) - if item[1] is not None: - table += '#endif // %s\n' % item[1] - - table += '}' - return table + out.append( f' table->{command_name[2:]} = (PFN_{command_name})gpa({table_type}, "{command_name}");\n') + if command.protect is not None: + out.append( f'#endif // {command.protect}\n') + out.append('}') diff --git a/scripts/generate_source.py b/scripts/generate_source.py index f1dbfc848..db26a29ed 100755 --- a/scripts/generate_source.py +++ b/scripts/generate_source.py @@ -25,12 +25,116 @@ import filecmp import os import shutil -import subprocess import sys import tempfile import datetime import re +from xml.etree import ElementTree + +def RunGenerators(api: str, registry: str, directory: str, targetFilter: str, caching: bool): + + # These live in the Vulkan-Docs repo, but are pulled in via the + # Vulkan-Headers/registry folder + # At runtime we inject python path to find these helper scripts + scripts = os.path.dirname(registry) + scripts_directory_path = os.path.dirname(os.path.abspath(__file__)) + registry_headers_path = os.path.join(scripts_directory_path, scripts) + sys.path.insert(0, registry_headers_path) + try: + from reg import Registry + except: + print("ModuleNotFoundError: No module named 'reg'") # normal python error message + print(f'{registry_headers_path} is not pointing to the Vulkan-Headers registry directory.') + print("Inside Vulkan-Headers there is a registry/reg.py file that is used.") + sys.exit(1) # Return without call stack so easy to spot error + + from base_generator import BaseGeneratorOptions + from dispatch_table_helper_generator import DispatchTableHelperGenerator + from helper_file_generator import HelperFileGenerator + from loader_extension_generator import LoaderExtensionGenerator + + # 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 + from base_generator import (SetTargetApiName, SetMergedApiNames) + SetTargetApiName(api) + + generators = { + 'vk_layer_dispatch_table.h': { + 'generator' : LoaderExtensionGenerator, + 'genCombined': True, + 'directory' : 'loader/generated', + }, + 'vk_loader_extensions.c': { + 'generator' : LoaderExtensionGenerator, + 'genCombined': True, + 'directory' : 'loader/generated', + }, + 'vk_loader_extensions.h': { + 'generator' : LoaderExtensionGenerator, + 'genCombined': True, + 'directory' : 'loader/generated', + }, + 'vk_object_types.h': { + 'generator' : HelperFileGenerator, + 'genCombined': True, + 'directory' : 'loader/generated', + }, + 'vk_dispatch_table_helper.h': { + 'generator' : DispatchTableHelperGenerator, + 'genCombined': True, + 'directory' : 'tests/framework/layer', + } + } + + unknownTargets = [x for x in (targetFilter if targetFilter else []) if x not in generators.keys()] + if unknownTargets: + print(f'ERROR: No generator options for unknown target(s): {", ".join(unknownTargets)}', file=sys.stderr) + return 1 + + # Filter if --target is passed in + targets = [x for x in generators.keys() if not targetFilter or x in targetFilter] + + for index, target in enumerate(targets, start=1): + print(f'[{index}|{len(targets)}] Generating {target}') + + # First grab a class contructor object and create an instance + generator = generators[target]['generator'] + gen = generator() + + # This code and the 'genCombined' generator metadata is used by downstream + # users to generate code with all Vulkan APIs merged into the target API variant + # (e.g. Vulkan SC) when needed. The constructed apiList is also used to filter + # out non-applicable extensions later below. + apiList = [api] + if api != 'vulkan' and generators[target]['genCombined']: + SetMergedApiNames('vulkan') + apiList.append('vulkan') + else: + SetMergedApiNames(None) + + outDirectory = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', generators[target]['directory'])) + options = BaseGeneratorOptions( + customFileName = target, + customDirectory = outDirectory) + + # Create the registry object with the specified generator and generator + # options. The options are set before XML loading as they may affect it. + reg = Registry(gen, options) + + # Parse the specified registry XML into an ElementTree object + tree = ElementTree.parse(registry) + + # Filter out extensions that are not on the API list + [exts.remove(e) for exts in tree.findall('extensions') for e in exts.findall('extension') if (sup := e.get('supported')) is not None and all(api not in sup.split(',') for api in apiList)] + + # Load the XML tree into the registry object + reg.loadElementTree(tree) + + # Finally, use the output generator to create the requested target + reg.apiGen() + + def main(argv): parser = argparse.ArgumentParser(description='Generate source code for this repository') parser.add_argument('registry', metavar='REGISTRY_PATH', help='path to the Vulkan-Headers registry directory') @@ -40,10 +144,14 @@ def main(argv): help='Specify API name to generate') parser.add_argument('--generated-version', help='sets the header version used to generate the repo') group = parser.add_mutually_exclusive_group() + group.add_argument('--target', nargs='+', help='only generate file names passed in') group.add_argument('-i', '--incremental', action='store_true', help='only update repo files that change') group.add_argument('-v', '--verify', action='store_true', help='verify repo files match generator output') + group.add_argument('--no-caching', action='store_true', help='Do not try to cache generator objects') args = parser.parse_args(argv) + repo_dir = common_codegen.repo_relative(f'loader/{args.api}/generated') + registry = os.path.abspath(os.path.join(args.registry, 'vk.xml')) if not os.path.isfile(registry): registry = os.path.abspath(os.path.join(args.registry, 'Vulkan-Headers/registry/vk.xml')) @@ -51,13 +159,6 @@ def main(argv): print(f'cannot find vk.xml in {args.registry}') return -1 - gen_cmds = [[common_codegen.repo_relative('scripts/loader_genvk.py'), - '-registry', registry, - '-quiet', - filename] for filename in ['vk_layer_dispatch_table.h', - 'vk_loader_extensions.h', - 'vk_loader_extensions.c', - 'vk_object_types.h']] repo_dir = common_codegen.repo_relative('loader/generated') @@ -71,17 +172,8 @@ def main(argv): # generate directly in the repo gen_dir = repo_dir - # run each code generator - for cmd in gen_cmds: - print(' '.join(cmd)) - try: - subprocess.check_call([sys.executable] + cmd, - # ignore generator output, vk_validation_stats.py is especially noisy - stdout=subprocess.DEVNULL, - cwd=gen_dir) - except Exception as e: - print('ERROR:', str(e)) - return 1 + caching = not args.no_caching + RunGenerators(args.api, registry, gen_dir, args.target, caching) # optional post-generation steps if args.verify: diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py index a2b9c59fb..e04c499df 100644 --- a/scripts/helper_file_generator.py +++ b/scripts/helper_file_generator.py @@ -20,482 +20,184 @@ # Author: Mark Lobodzinski # Author: Tobin Ehlis # Author: John Zulauf - -import os,re,sys -import xml.etree.ElementTree as etree -from generator import * -from collections import namedtuple -from common_codegen import * - -# -# HelperFileOutputGeneratorOptions - subclass of GeneratorOptions. -class HelperFileOutputGeneratorOptions(GeneratorOptions): - def __init__(self, - conventions = None, - filename = None, - directory = '.', - genpath = None, - apiname = None, - profile = None, - versions = '.*', - emitversions = '.*', - defaultExtensions = None, - addExtensions = None, - removeExtensions = None, - emitExtensions = None, - sortProcedure = regSortFeatures, - prefixText = "", - genFuncPointers = True, - protectFile = True, - protectFeature = True, - apicall = '', - apientry = '', - apientryp = '', - alignFuncParam = 0, - library_name = '', - expandEnumerants = True, - helper_file_type = ''): - GeneratorOptions.__init__(self, - conventions = conventions, - filename = filename, - directory = directory, - genpath = genpath, - apiname = apiname, - profile = profile, - versions = versions, - emitversions = emitversions, - defaultExtensions = defaultExtensions, - addExtensions = addExtensions, - removeExtensions = removeExtensions, - emitExtensions = emitExtensions, - sortProcedure = sortProcedure) - self.prefixText = prefixText - self.genFuncPointers = genFuncPointers - self.protectFile = protectFile - self.protectFeature = protectFeature - self.apicall = apicall - self.apientry = apientry - self.apientryp = apientryp - self.alignFuncParam = alignFuncParam - self.library_name = library_name - self.helper_file_type = helper_file_type -# -# HelperFileOutputGenerator - subclass of OutputGenerator. Outputs Vulkan helper files -class HelperFileOutputGenerator(OutputGenerator): - """Generate helper file based on XML element attributes""" - def __init__(self, - errFile = sys.stderr, - warnFile = sys.stderr, - diagFile = sys.stdout): - OutputGenerator.__init__(self, errFile, warnFile, diagFile) - # Internal state - accumulators for different inner block text - self.enum_output = '' # string built up of enum string routines - # Internal state - accumulators for different inner block text - self.structNames = [] # List of Vulkan struct typenames - self.structTypes = dict() # Map of Vulkan struct typename to required VkStructureType - self.structMembers = [] # List of StructMemberData records for all Vulkan structs - self.object_types = [] # List of all handle types - self.object_type_aliases = [] # Aliases to handles types (for handles that were extensions) - self.debug_report_object_types = [] # Handy copy of debug_report_object_type enum data - self.core_object_types = [] # Handy copy of core_object_type enum data - self.device_extension_info = dict() # Dict of device extension name defines and ifdef values - self.instance_extension_info = dict() # Dict of instance extension name defines and ifdef values - - # Named tuples to store struct and command data - self.StructType = namedtuple('StructType', ['name', 'value']) - self.CommandParam = namedtuple('CommandParam', ['type', 'name', 'ispointer', 'isstaticarray', 'isconst', 'iscount', 'len', 'extstructs', 'cdecl']) - self.StructMemberData = namedtuple('StructMemberData', ['name', 'members', 'ifdef_protect']) - - self.custom_construct_params = { - # safe_VkGraphicsPipelineCreateInfo needs to know if subpass has color and\or depth\stencil attachments to use its pointers - 'VkGraphicsPipelineCreateInfo' : - ', const bool uses_color_attachment, const bool uses_depthstencil_attachment', - # safe_VkPipelineViewportStateCreateInfo needs to know if viewport and scissor is dynamic to use its pointers - 'VkPipelineViewportStateCreateInfo' : - ', const bool is_dynamic_viewports, const bool is_dynamic_scissors', - } - # - # Called once at the beginning of each run - def beginFile(self, genOpts): - OutputGenerator.beginFile(self, genOpts) - # User-supplied prefix text, if any (list of strings) - self.helper_file_type = genOpts.helper_file_type - self.library_name = genOpts.library_name - - write("// clang-format off", file=self.outFile) - - # File Comment - file_comment = '// *** THIS FILE IS GENERATED - DO NOT EDIT ***\n' - file_comment += '// See helper_file_generator.py for modifications\n' - write(file_comment, file=self.outFile) - # Copyright Notice - copyright = '' - copyright += '\n' - copyright += '/***************************************************************************\n' - copyright += ' *\n' - copyright += ' * Copyright (c) 2015-2017 The Khronos Group Inc.\n' - copyright += ' * Copyright (c) 2015-2017 Valve Corporation\n' - copyright += ' * Copyright (c) 2015-2017 LunarG, Inc.\n' - copyright += ' * Copyright (c) 2015-2017 Google Inc.\n' - copyright += ' *\n' - copyright += ' * Licensed under the Apache License, Version 2.0 (the "License");\n' - copyright += ' * you may not use this file except in compliance with the License.\n' - copyright += ' * You may obtain a copy of the License at\n' - copyright += ' *\n' - copyright += ' * http://www.apache.org/licenses/LICENSE-2.0\n' - copyright += ' *\n' - copyright += ' * Unless required by applicable law or agreed to in writing, software\n' - copyright += ' * distributed under the License is distributed on an "AS IS" BASIS,\n' - copyright += ' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' - copyright += ' * See the License for the specific language governing permissions and\n' - copyright += ' * limitations under the License.\n' - copyright += ' *\n' - copyright += ' * Author: Mark Lobodzinski \n' - copyright += ' * Author: Courtney Goeltzenleuchter \n' - copyright += ' * Author: Tobin Ehlis \n' - copyright += ' * Author: Chris Forbes \n' - copyright += ' * Author: John Zulauf\n' - copyright += ' *\n' - copyright += ' ****************************************************************************/\n' - write(copyright, file=self.outFile) - # - # Write generated file content to output file - def endFile(self): - dest_file = '' - dest_file += self.OutputDestFile() - # Remove blank lines at EOF - if dest_file.endswith('\n'): - dest_file = dest_file[:-1] - write(dest_file, file=self.outFile) - write("// clang-format on", file=self.outFile) - # Finish processing in superclass - OutputGenerator.endFile(self) - # - # Override parent class to be notified of the beginning of an extension - def beginFeature(self, interface, emit): - # Start processing in superclass - OutputGenerator.beginFeature(self, interface, emit) - self.featureExtraProtect = GetFeatureProtect(interface) - - if interface.tag != 'extension': - return - name = self.featureName - name_define = next(enum.get('name') for enum in interface.findall('require/enum') if enum.get('name').endswith('_EXTENSION_NAME')) - requires = interface.get('requires') - if requires is not None: - required_extensions = requires.split(',') +# Author: Charles Giessen + +import re +from base_generator import BaseGenerator + +class HelperFileGenerator(BaseGenerator): + def __init__(self): + BaseGenerator.__init__(self) + + # Helper for VkDebugReportObjectTypeEXT + # Maps [ 'VkBuffer' : 'VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT' ] + # Will be 'VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT' if no type + self.debugReportObject = dict() + # Maps [ 'VkBuffer' : 'VK_OBJECT_TYPE_BUFFER' ] + self.objectType = dict() + + # Takes a VK_OBJECT_TYPE_THE_TYP_EXT and turns it into TheTypeEXT + def get_kVulkanObjectName(self, str_to_process): + removed_prefix = str_to_process.split('_')[3:] + if ''.join(removed_prefix[-1:]) in self.vk.vendorTags: + return ''.join(str_to_process.title().split('_')[3:-1] + removed_prefix[-1:]) else: - required_extensions = list() - info = { 'define': name_define, 'ifdef':self.featureExtraProtect, 'reqs':required_extensions } - if interface.get('type') == 'instance': - self.instance_extension_info[name] = info - else: - self.device_extension_info[name] = info - - # - # Override parent class to be notified of the end of an extension - def endFeature(self): - # Finish processing in superclass - OutputGenerator.endFeature(self) - # - # Grab group (e.g. C "enum" type) info to output for enum-string conversion helper - def genGroup(self, groupinfo, groupName, alias): - OutputGenerator.genGroup(self, groupinfo, groupName, alias) - groupElem = groupinfo.elem - # For enum_string_header - if self.helper_file_type == 'enum_string_header': - value_set = set() - for elem in groupElem.findall('enum'): - if elem.get('supported') != 'disabled' and elem.get('alias') is None: - value_set.add(elem.get('name')) - self.enum_output += self.GenerateEnumStringConversion(groupName, value_set) - elif self.helper_file_type == 'object_types_header': - if groupName == 'VkDebugReportObjectTypeEXT': - for elem in groupElem.findall('enum'): - if elem.get('supported') != 'disabled': - item_name = elem.get('name') - self.debug_report_object_types.append(item_name) - elif groupName == 'VkObjectType': - for elem in groupElem.findall('enum'): - if elem.get('supported') != 'disabled': - item_name = elem.get('name') - self.core_object_types.append(item_name) - - # - # Called for each type -- if the type is a struct/union, grab the metadata - def genType(self, typeinfo, name, alias): - OutputGenerator.genType(self, typeinfo, name, alias) - typeElem = typeinfo.elem - # If the type is a struct type, traverse the imbedded tags generating a structure. - # Otherwise, emit the tag text. - category = typeElem.get('category') - if category == 'handle': - if alias: - self.object_type_aliases.append((name,alias)) - else: - self.object_types.append(name) - elif (category == 'struct' or category == 'union'): - self.structNames.append(name) - self.genStruct(typeinfo, name, alias) - # - # Generate a VkStructureType based on a structure typename - def genVkStructureType(self, typename): - # Add underscore between lowercase then uppercase - value = re.sub('([a-z0-9])([A-Z])', r'\1_\2', typename) - # Change to uppercase - value = value.upper() - # Add STRUCTURE_TYPE_ - return re.sub('VK_', 'VK_STRUCTURE_TYPE_', value) - # - # Check if the parameter passed in is a pointer - def paramIsPointer(self, param): - ispointer = False - for elem in param: - if ((elem.tag != 'type') and (elem.tail is not None)) and '*' in elem.tail: - ispointer = True - return ispointer - # - # Check if the parameter passed in is a static array - def paramIsStaticArray(self, param): - isstaticarray = 0 - paramname = param.find('name') - if (paramname.tail is not None) and ('[' in paramname.tail): - isstaticarray = paramname.tail.count('[') - return isstaticarray - # - # Retrieve the type and name for a parameter - def getTypeNameTuple(self, param): - type = '' - name = '' - for elem in param: - if elem.tag == 'type': - type = noneStr(elem.text) - elif elem.tag == 'name': - name = noneStr(elem.text) - return (type, name) - # - # Retrieve the value of the len tag - def getLen(self, param): - result = None - len = param.attrib.get('len') - if len and len != 'null-terminated': - # For string arrays, 'len' can look like 'count,null-terminated', indicating that we - # have a null terminated array of strings. We strip the null-terminated from the - # 'len' field and only return the parameter specifying the string count - if 'null-terminated' in len: - result = len.split(',')[0] + return ''.join(str_to_process.title().split('_')[3:]) + + def split_handle_by_capital_case(self, str_to_split): + name = str_to_split[2:] + name = name.replace('NVX', 'Nvx') + # Force vendor tags to be title case so we can split by capital letter + for tag in self.vk.vendorTags: + name = name.replace(tag, tag.title()) + # Split by capital letters so we can concoct a VK_DEBUG_REPORT_<>_EXT string out of it + return re.split('(?<=.)(?=[A-Z])', f'{name}') + + + def convert_to_VK_OBJECT_TYPE(self, str_to_convert): + return '_'.join(['VK', 'OBJECT', 'TYPE'] + self.split_handle_by_capital_case(str_to_convert)).upper() + + def convert_to_VK_DEBUG_REPORT_OBJECT_TYPE(self, str_to_convert): + return '_'.join(['VK', 'DEBUG', 'REPORT', 'OBJECT', 'TYPE'] + self.split_handle_by_capital_case(str_to_convert) + ['EXT']).upper() + + def generate(self): + # Search all fields of the Enum to see if has a DEBUG_REPORT_OBJECT + for handle in self.vk.handles.values(): + debugObjects = ([enum.name for enum in self.vk.enums['VkDebugReportObjectTypeEXT'].fields if f'{handle.type[3:]}_EXT' in enum.name]) + object = 'VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT' if len(debugObjects) == 0 else debugObjects[0] + self.debugReportObject[handle.name] = object + + + + out = [] + out.append('''// clang-format off +// *** THIS FILE IS GENERATED - DO NOT EDIT *** +// See helper_file_generator.py for modifications + + +/*************************************************************************** + * + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. + * Copyright (c) 2015-2017 Google 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: Mark Lobodzinski + * Author: Courtney Goeltzenleuchter + * Author: Tobin Ehlis + * Author: Chris Forbes + * Author: John Zulauf + * Author: Charles Giessen + * + ****************************************************************************/ + + +#pragma once + +#include + +''') + + # Get the list of field names from VkDebugReportObjectTypeEXT + VkDebugReportObjectTypeEXT_field_names = [] + for field in self.vk.enums['VkDebugReportObjectTypeEXT'].fields: + VkDebugReportObjectTypeEXT_field_names.append(field.name) + + # Create a list with the needed information so that when we print, we print in the exact same order, as we are printing arrays where external code may index into it + object_types = [] + enum_num = 1 # start at one since the zero place is manually printed with the UNKNOWN value + for handle in self.vk.handles.values(): + debug_report_object_name = self.convert_to_VK_DEBUG_REPORT_OBJECT_TYPE(handle.name) + if debug_report_object_name in VkDebugReportObjectTypeEXT_field_names: + object_types.append((f'{handle.name[2:]}', enum_num, debug_report_object_name)) else: - result = len - if 'altlen' in param.attrib: - # Elements with latexmath 'len' also contain a C equivalent 'altlen' attribute - # Use indexing operator instead of get() so we fail if the attribute is missing - result = param.attrib['altlen'] - # Spec has now notation for len attributes, using :: instead of platform specific pointer symbol - result = str(result).replace('::', '->') - return result - # - # Check if a structure is or contains a dispatchable (dispatchable = True) or - # non-dispatchable (dispatchable = False) handle - def TypeContainsObjectHandle(self, handle_type, dispatchable): - if dispatchable: - type_key = 'VK_DEFINE_HANDLE' - else: - type_key = 'VK_DEFINE_NON_DISPATCHABLE_HANDLE' - handle = self.registry.tree.find("types/type/[name='" + handle_type + "'][@category='handle']") - if handle is not None and handle.find('type').text == type_key: - return True - # if handle_type is a struct, search its members - if handle_type in self.structNames: - member_index = next((i for i, v in enumerate(self.structMembers) if v[0] == handle_type), None) - if member_index is not None: - for item in self.structMembers[member_index].members: - handle = self.registry.tree.find("types/type/[name='" + item.type + "'][@category='handle']") - if handle is not None and handle.find('type').text == type_key: - return True - return False - # - # Generate local ready-access data describing Vulkan structures and unions from the XML metadata - def genStruct(self, typeinfo, typeName, alias): - OutputGenerator.genStruct(self, typeinfo, typeName, alias) - members = typeinfo.elem.findall('.//member') - # Iterate over members once to get length parameters for arrays - lens = set() - for member in members: - len = self.getLen(member) - if len: - lens.add(len) - # Generate member info - membersInfo = [] - for member in members: - # Get the member's type and name - info = self.getTypeNameTuple(member) - type = info[0] - name = info[1] - cdecl = self.makeCParamDecl(member, 1) - # Process VkStructureType - if type == 'VkStructureType': - # Extract the required struct type value from the comments - # embedded in the original text defining the 'typeinfo' element - rawXml = etree.tostring(typeinfo.elem).decode('ascii') - result = re.search(r'VK_STRUCTURE_TYPE_\w+', rawXml) - if result: - value = result.group(0) - else: - value = self.genVkStructureType(typeName) - # Store the required type value - self.structTypes[typeName] = self.StructType(name=name, value=value) - # Store pointer/array/string info - isstaticarray = self.paramIsStaticArray(member) - membersInfo.append(self.CommandParam(type=type, - name=name, - ispointer=self.paramIsPointer(member), - isstaticarray=isstaticarray, - isconst=True if 'const' in cdecl else False, - iscount=True if name in lens else False, - len=self.getLen(member), - extstructs=self.registry.validextensionstructs[typeName] if name == 'pNext' else None, - cdecl=cdecl)) - self.structMembers.append(self.StructMemberData(name=typeName, members=membersInfo, ifdef_protect=self.featureExtraProtect)) - # - # Enum_string_header: Create a routine to convert an enumerated value into a string - def GenerateEnumStringConversion(self, groupName, value_list): - outstring = '\n' - outstring += 'static inline const char* string_%s(%s input_value)\n' % (groupName, groupName) - outstring += '{\n' - outstring += ' switch ((%s)input_value)\n' % groupName - outstring += ' {\n' - for item in value_list: - outstring += ' case %s:\n' % item - outstring += ' return "%s";\n' % item - outstring += ' default:\n' - outstring += ' return "Unhandled %s";\n' % groupName - outstring += ' }\n' - outstring += '}\n' - return outstring - # - # Combine object types helper header file preamble with body text and return - def GenerateObjectTypesHelperHeader(self): - object_types_helper_header = '\n' - object_types_helper_header += '#pragma once\n' - object_types_helper_header += '\n' - object_types_helper_header += '#include \n\n' - object_types_helper_header += self.GenerateObjectTypesHeader() - return object_types_helper_header - # - # Object types header: create object enum type header file - def GenerateObjectTypesHeader(self): - object_types_header = '' - object_types_header += '// Object Type enum for validation layer internal object handling\n' - object_types_header += 'typedef enum VulkanObjectType {\n' - object_types_header += ' kVulkanObjectTypeUnknown = 0,\n' - enum_num = 1 - type_list = []; - enum_entry_map = {} - - # Output enum definition as each handle is processed, saving the names to use for the conversion routine - for item in self.object_types: - fixup_name = item[2:] - enum_entry = 'kVulkanObjectType%s' % fixup_name - enum_entry_map[item] = enum_entry - object_types_header += ' ' + enum_entry - object_types_header += ' = %d,\n' % enum_num + object_types.append((f'{handle.name[2:]}', enum_num, 'VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT')) enum_num += 1 - type_list.append(enum_entry) - object_types_header += ' kVulkanObjectTypeMax = %d,\n' % enum_num - object_types_header += ' // Aliases for backwards compatibilty of "promoted" types\n' - for (name, alias) in self.object_type_aliases: - fixup_name = name[2:] - object_types_header += ' kVulkanObjectType{} = {},\n'.format(fixup_name, enum_entry_map[alias]) - object_types_header += '} VulkanObjectType;\n\n' - - # Output name string helper - object_types_header += '// Array of object name strings for OBJECT_TYPE enum conversion\n' - object_types_header += 'static const char * const object_string[kVulkanObjectTypeMax] = {\n' - object_types_header += ' "Unknown",\n' - for item in self.object_types: - fixup_name = item[2:] - object_types_header += ' "%s",\n' % fixup_name - object_types_header += '};\n' - - # Key creation helper for map comprehensions that convert between k and VK symbols - def to_key(regex, raw_key): return re.search(regex, raw_key).group(1).lower().replace("_","") - # Output a conversion routine from the layer object definitions to the debug report definitions - # As the VK_DEBUG_REPORT types are not being updated, specify UNKNOWN for unmatched types - object_types_header += '\n' - object_types_header += '// Helper array to get Vulkan VK_EXT_debug_report object type enum from the internal layers version\n' - object_types_header += 'const VkDebugReportObjectTypeEXT get_debug_report_enum[] = {\n' - object_types_header += ' VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypeUnknown\n' - dbg_re = '^VK_DEBUG_REPORT_OBJECT_TYPE_(.*?)(_EXT)?$' - dbg_map = {to_key(dbg_re, dbg) : dbg for dbg in self.debug_report_object_types} - dbg_default = 'VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT' - for object_type in type_list: - vk_object_type = dbg_map.get(object_type.replace("kVulkanObjectType", "").lower(), dbg_default) - object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) - object_types_header += '};\n' - - # Output a conversion routine from the layer object definitions to the core object type definitions - # This will intentionally *fail* for unmatched types as the VK_OBJECT_TYPE list should match the kVulkanObjectType list - object_types_header += '\n' - object_types_header += '// Helper array to get Official Vulkan VkObjectType enum from the internal layers version\n' - object_types_header += 'const VkObjectType get_object_type_enum[] = {\n' - object_types_header += ' VK_OBJECT_TYPE_UNKNOWN, // kVulkanObjectTypeUnknown\n' - - vko_re = '^VK_OBJECT_TYPE_(.*)' - vko_map = {to_key(vko_re, vko) : vko for vko in self.core_object_types} - for object_type in type_list: - vk_object_type = vko_map[object_type.replace("kVulkanObjectType", "").lower()] - object_types_header += ' %s, // %s\n' % (vk_object_type, object_type) - object_types_header += '};\n' - - # Create a function to convert from VkDebugReportObjectTypeEXT to VkObjectType - object_types_header += '\n' - object_types_header += '// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n' - object_types_header += 'static inline VkObjectType convertDebugReportObjectToCoreObject(VkDebugReportObjectTypeEXT debug_report_obj){\n' - object_types_header += ' if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT) {\n' - object_types_header += ' return VK_OBJECT_TYPE_UNKNOWN;\n' - for core_object_type in self.core_object_types: - core_target_type = core_object_type.replace("VK_OBJECT_TYPE_", "").lower() - core_target_type = core_target_type.replace("_", "") - for dr_object_type in self.debug_report_object_types: - dr_target_type = dr_object_type.replace("VK_DEBUG_REPORT_OBJECT_TYPE_", "").lower() - dr_target_type = dr_target_type[:-4] - dr_target_type = dr_target_type.replace("_", "") - if core_target_type == dr_target_type: - object_types_header += ' } else if (debug_report_obj == %s) {\n' % dr_object_type - object_types_header += ' return %s;\n' % core_object_type + out.append('// Object Type enum for validation layer internal object handling\n') + out.append('typedef enum VulkanObjectType {\n') + out.append(' kVulkanObjectTypeUnknown = 0,\n') + for name, number, debug_report in object_types: + out.append(f' kVulkanObjectType{name} = {number},\n') + out.append(f' kVulkanObjectTypeMax = {enum_num},\n') + + # Hardcode the alises as Vulkan Object lacks this information currently + out.append(' // Aliases for backwards compatibilty of "promoted" types\n') + out.append(' kVulkanObjectTypeDescriptorUpdateTemplateKHR = kVulkanObjectTypeDescriptorUpdateTemplate,\n') + out.append(' kVulkanObjectTypeSamplerYcbcrConversionKHR = kVulkanObjectTypeSamplerYcbcrConversion,\n') + out.append(' kVulkanObjectTypePrivateDataSlotEXT = kVulkanObjectTypePrivateDataSlot,\n') + + out.append('} VulkanObjectType;\n') + out.append('\n') + + out.append('// Array of object name strings for OBJECT_TYPE enum conversion\n') + out.append('static const char * const object_string[kVulkanObjectTypeMax] = {\n') + out.append(' \"Unknown\",\n') + for name, number, debug_report in object_types: + out.append(f' \"{name}\",\n') + out.append('};\n') + out.append('\n') + + out.append('// Helper array to get Vulkan VK_EXT_debug_report object type enum from the internal layers version\n') + out.append('const VkDebugReportObjectTypeEXT get_debug_report_enum[] = {\n') + out.append(' VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypeUnknown\n') + for name, number, debug_report in object_types: + out.append(f' {debug_report}, // kVulkanObjectType{name}\n') + out.append('};\n') + out.append('\n') + + out.append('// Helper array to get Official Vulkan VkObjectType enum from the internal layers version\n') + out.append('const VkObjectType get_object_type_enum[] = {\n') + out.append(' VK_OBJECT_TYPE_UNKNOWN, // kVulkanObjectTypeUnknown\n') + for handle in self.vk.handles.values(): + object_name = self.convert_to_VK_OBJECT_TYPE(handle.name) + out.append(f' {object_name}, // kVulkanObjectType{handle.name[2:]}\n') + out.append('};\n') + out.append('\n') + + out.append('// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n') + out.append('static inline VkObjectType convertDebugReportObjectToCoreObject(VkDebugReportObjectTypeEXT debug_report_obj){\n') + out.append(' if (debug_report_obj == VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT) {\n') + out.append(' return VK_OBJECT_TYPE_UNKNOWN;\n') + for field in self.vk.enums['VkObjectType'].fields: + enum_field_name = f'VK_DEBUG_REPORT_{field.name[3:]}_EXT' + for debug_report_field in self.vk.enums['VkDebugReportObjectTypeEXT'].fields: + if enum_field_name == debug_report_field.name: + out.append(f' }} else if (debug_report_obj == VK_DEBUG_REPORT_{field.name[3:]}_EXT) {{\n') + out.append(f' return {field.name};\n') break - object_types_header += ' }\n' - object_types_header += ' return VK_OBJECT_TYPE_UNKNOWN;\n' - object_types_header += '}\n' - - # Create a function to convert from VkObjectType to VkDebugReportObjectTypeEXT - object_types_header += '\n' - object_types_header += '// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n' - object_types_header += 'static inline VkDebugReportObjectTypeEXT convertCoreObjectToDebugReportObject(VkObjectType core_report_obj){\n' - object_types_header += ' if (core_report_obj == VK_OBJECT_TYPE_UNKNOWN) {\n' - object_types_header += ' return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n' - for core_object_type in self.core_object_types: - core_target_type = core_object_type.replace("VK_OBJECT_TYPE_", "").lower() - core_target_type = core_target_type.replace("_", "") - for dr_object_type in self.debug_report_object_types: - dr_target_type = dr_object_type.replace("VK_DEBUG_REPORT_OBJECT_TYPE_", "").lower() - dr_target_type = dr_target_type[:-4] - dr_target_type = dr_target_type.replace("_", "") - if core_target_type == dr_target_type: - object_types_header += ' } else if (core_report_obj == %s) {\n' % core_object_type - object_types_header += ' return %s;\n' % dr_object_type + out.append(' }\n') + out.append(' return VK_OBJECT_TYPE_UNKNOWN;\n') + out.append('}\n') + out.append('\n') + + out.append('// Helper function to convert from VkDebugReportObjectTypeEXT to VkObjectType\n') + out.append('static inline VkDebugReportObjectTypeEXT convertCoreObjectToDebugReportObject(VkObjectType core_report_obj){\n') + out.append(' if (core_report_obj == VK_OBJECT_TYPE_UNKNOWN) {\n') + out.append(' return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n') + for field in self.vk.enums['VkObjectType'].fields: + enum_field_name = f'VK_DEBUG_REPORT_{field.name[3:]}_EXT' + for debug_report_field in self.vk.enums['VkDebugReportObjectTypeEXT'].fields: + if enum_field_name == debug_report_field.name: + out.append(f' }} else if (core_report_obj == {field.name}) {{\n') + out.append(f' return VK_DEBUG_REPORT_{field.name[3:]}_EXT;\n') break - object_types_header += ' }\n' - object_types_header += ' return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n' - object_types_header += '}\n' - return object_types_header + out.append(' }\n') + out.append(' return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;\n') + out.append('}\n') - # - # Create a helper file and return it as a string - def OutputDestFile(self): - if self.helper_file_type == 'object_types_header': - return self.GenerateObjectTypesHelperHeader() - else: - return 'Bad Helper File Generator Option %s' % self.helper_file_type + out.append('// clang-format on') + self.write("".join(out)) diff --git a/scripts/loader_extension_generator.py b/scripts/loader_extension_generator.py index 2b77ba436..9f7310483 100644 --- a/scripts/loader_extension_generator.py +++ b/scripts/loader_extension_generator.py @@ -21,13 +21,10 @@ # # Author: Mark Young # Author: Mark Lobodzinski +# Author: Charles Giessen import re -import sys -from collections import namedtuple -from generator import * -from common_codegen import * - +from base_generator import BaseGenerator WSI_EXT_NAMES = ['VK_KHR_surface', 'VK_KHR_display', @@ -105,745 +102,427 @@ 'vkEnumerateInstanceLayerProperties', 'vkEnumerateInstanceVersion'] -# -# API Version -class APIVersion: - def __init__(self, token, apiname = 'Vulkan', supported = True): - self.token = token - self.constant = token.replace('_VERSION_', '_API_VERSION_') - self.number = token[token.find('_VERSION_') + len('_VERSION_'):].replace('_', '.') - self.name = f'{apiname} {self.number}' - self.supported = supported +class LoaderExtensionGenerator(BaseGenerator): + def __init__(self): + BaseGenerator.__init__(self) + + self.core_commands = [] + self.extension_commands = [] + self.instance_extensions = [] + + def generate(self): + + self.core_commands = [x for x in self.vk.commands.values() if len(x.extensions) == 0] + self.extension_commands = [x for x in self.vk.commands.values() if len(x.extensions) > 0] + + self.instance_extensions = [x for x in self.vk.extensions.values() if x.instance] + + out = [] + self.add_preamble(out) + + if self.filename == 'vk_loader_extensions.h': + self.print_vk_loader_extensions_h(out) + elif self.filename == 'vk_loader_extensions.c': + self.print_vk_loader_extensions_c(out) + elif self.filename == 'vk_layer_dispatch_table.h': + self.print_vk_layer_dispatch_table(out) + + out.append('// clang-format on') + + self.write(''.join(out)) + + def add_preamble(self, out): + out.append('''// *** THIS FILE IS GENERATED - DO NOT EDIT *** +// See loader_extension_generator.py for modifications + +/* + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. + * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2023-2023 RasterGrid Kft. + * + * 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: Mark Lobodzinski + * Author: Mark Young + * Author: Charles Giessen + */ + +// clang-format off +''') + + def print_vk_loader_extensions_h(self, out): + out.append('#pragma once\n') + out.append('\n') + out.append('#include \n') + out.append('#include \n') + out.append('#include \n') + out.append('#include "vk_layer_dispatch_table.h"\n') + out.append('\n\n') + + self.OutputPrototypesInHeader(out) + self.OutputLoaderTerminators(out) + self.OutputIcdDispatchTable(out) + self.OutputIcdExtensionEnableUnion(out) + self.OutputDeviceFunctionTerminatorDispatchTable(out) + + + def print_vk_loader_extensions_c(self, out): + out.append('#include \n') + out.append('#include \n') + out.append('#include \n') + out.append('#include "loader.h"\n') + out.append('#include "vk_loader_extensions.h"\n') + out.append('#include \n') + out.append('#include "wsi.h"\n') + out.append('#include "debug_utils.h"\n') + out.append('#include "extension_manual.h"\n') + self.OutputUtilitiesInSource(out) + self.OutputIcdDispatchTableInit(out) + self.OutputLoaderDispatchTables(out) + self.InitDeviceFunctionTerminatorDispatchTable(out) + self.OutputDeviceFunctionTrampolinePrototypes(out) + self.OutputLoaderLookupFunc(out) + self.CreateTrampTermFuncs(out) + self.InstExtensionGPA(out) + self.InstantExtensionCreate(out) + self.DeviceExtensionGetTerminator(out) + self.InitInstLoaderExtensionDispatchTable(out) + self.OutputInstantExtensionWhitelistArray(out) + + def print_vk_layer_dispatch_table(self, out): + out.append('#pragma once\n') + out.append('\n') + out.append('#include \n') + out.append('\n') + out.append('#if !defined(PFN_GetPhysicalDeviceProcAddr)\n') + out.append('typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);\n') + out.append('#endif\n\n') + self.OutputLayerInstanceDispatchTable(out) + self.OutputLayerDeviceDispatchTable(out) -# -# LoaderExtensionGeneratorOptions - subclass of GeneratorOptions. -class LoaderExtensionGeneratorOptions(GeneratorOptions): - def __init__(self, - conventions = None, - filename = None, - directory = '.', - genpath = None, - apiname = None, - profile = None, - versions = '.*', - emitversions = '.*', - defaultExtensions = None, - addExtensions = None, - removeExtensions = None, - emitExtensions = None, - sortProcedure = regSortFeatures, - prefixText = "", - genFuncPointers = True, - protectFile = True, - protectFeature = True, - apicall = '', - apientry = '', - apientryp = '', - indentFuncProto = True, - indentFuncPointer = False, - alignFuncParam = 0, - expandEnumerants = True): - GeneratorOptions.__init__(self, - conventions = conventions, - filename = filename, - directory = directory, - genpath = genpath, - apiname = apiname, - profile = profile, - versions = versions, - emitversions = emitversions, - defaultExtensions = defaultExtensions, - addExtensions = addExtensions, - removeExtensions = removeExtensions, - emitExtensions = emitExtensions, - sortProcedure = sortProcedure) - self.prefixText = prefixText - self.prefixText = None - self.apicall = apicall - self.apientry = apientry - self.apientryp = apientryp - self.alignFuncParam = alignFuncParam - self.expandEnumerants = expandEnumerants + # Convert an XML dependency expression to a C expression, taking a callback to replace extension names + # See https://registry.khronos.org/vulkan/specs/1.4/registry.html#depends-expressions + @staticmethod + def ConvertDependencyExpression(expr, replace_func): + # '(' and ')' can pass through unchanged + expr = re.sub(',', ' || ', expr) + expr = re.sub(r'\+', ' && ', expr) + expr = re.sub(r'\w+', lambda match: replace_func(match.group()), expr) + return expr -# -# LoaderExtensionOutputGenerator - subclass of OutputGenerator. -# Generates dispatch table helper header files for LVL -class LoaderExtensionOutputGenerator(OutputGenerator): - """Generate dispatch table helper header based on XML element attributes""" - def __init__(self, - errFile = sys.stderr, - warnFile = sys.stderr, - diagFile = sys.stdout): - OutputGenerator.__init__(self, errFile, warnFile, diagFile) - - # Internal state - accumulators for different inner block text - self.ext_instance_dispatch_list = [] # List of extension entries for instance dispatch list - self.ext_device_dispatch_list = [] # List of extension entries for device dispatch list - self.core_commands = [] # List of CommandData records for core Vulkan commands - self.ext_commands = [] # List of CommandData records for extension Vulkan commands - self.CommandParam = namedtuple('CommandParam', ['type', 'name', 'cdecl']) - self.CommandData = namedtuple('CommandData', ['name', 'ext_name', 'ext_type', 'require', 'protect', 'return_type', 'handle_type', 'params', 'cdecl']) - self.instanceExtensions = [] - self.ExtensionData = namedtuple('ExtensionData', ['name', 'type', 'protect', 'define', 'num_commands']) + def DescribeBlock(self, command, current_block, out, custom_commands_string = ' commands', indent = ' '): + if command.extensions != current_block and command.version != current_block: + if command.version is None and len(command.extensions) == 0: # special case for 1.0 + out.append(f'\n{indent}// ---- Core Vulkan 1.0{custom_commands_string}\n') + return None + elif command.version is not None: + if command.version != current_block: + out.append(f'\n{indent}// ---- Core Vulkan 1.{command.version.name.split('_')[-1]}{custom_commands_string}\n') + return command.version + else: + # don't repeat unless the first extension is different (while rest can vary) + if not isinstance(current_block, list) or current_block[0].name != command.extensions[0].name: + out.append(f'\n{indent}// ---- {command.extensions[0].name if len(command.extensions) > 0 else ''} extension{custom_commands_string}\n') + return command.extensions + else: + return current_block - # - # Called once at the beginning of each run - def beginFile(self, genOpts): - OutputGenerator.beginFile(self, genOpts) - - # User-supplied prefix text, if any (list of strings) - if genOpts.prefixText: - for s in genOpts.prefixText: - write(s, file=self.outFile) - - # File Comment - file_comment = '// *** THIS FILE IS GENERATED - DO NOT EDIT ***\n' - file_comment += '// See loader_extension_generator.py for modifications\n' - write(file_comment, file=self.outFile) - - # Copyright Notice - copyright = '/*\n' - copyright += ' * Copyright (c) 2015-2022 The Khronos Group Inc.\n' - copyright += ' * Copyright (c) 2015-2022 Valve Corporation\n' - copyright += ' * Copyright (c) 2015-2022 LunarG, Inc.\n' - copyright += ' * Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n' - copyright += ' * Copyright (c) 2023-2023 RasterGrid Kft.\n' - copyright += ' *\n' - copyright += ' * Licensed under the Apache License, Version 2.0 (the "License");\n' - copyright += ' * you may not use this file except in compliance with the License.\n' - copyright += ' * You may obtain a copy of the License at\n' - copyright += ' *\n' - copyright += ' * http://www.apache.org/licenses/LICENSE-2.0\n' - copyright += ' *\n' - copyright += ' * Unless required by applicable law or agreed to in writing, software\n' - copyright += ' * distributed under the License is distributed on an "AS IS" BASIS,\n' - copyright += ' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n' - copyright += ' * See the License for the specific language governing permissions and\n' - copyright += ' * limitations under the License.\n' - copyright += ' *\n' - copyright += ' * Author: Mark Lobodzinski \n' - copyright += ' * Author: Mark Young \n' - copyright += ' */\n' - - preamble = '' - - preamble += '// clang-format off\n' - - if self.genOpts.filename == 'vk_loader_extensions.h': - preamble += '#pragma once\n' - preamble += '\n' - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include "vk_layer_dispatch_table.h"\n' - preamble += '\n' - - - elif self.genOpts.filename == 'vk_loader_extensions.c': - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include \n' - preamble += '#include "loader.h"\n' - preamble += '#include "vk_loader_extensions.h"\n' - preamble += '#include \n' - preamble += '#include "wsi.h"\n' - preamble += '#include "debug_utils.h"\n' - preamble += '#include "extension_manual.h"\n' - - elif self.genOpts.filename == 'vk_layer_dispatch_table.h': - preamble += '#pragma once\n' - preamble += '\n' - preamble += '#include \n' - preamble += '\n' - preamble += '#if !defined(PFN_GetPhysicalDeviceProcAddr)\n' - preamble += 'typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);\n' - preamble += '#endif\n' - - write(copyright, file=self.outFile) - write(preamble, file=self.outFile) + def OutputPrototypesInHeader(self, out: list): + out.append('''// Structures defined externally, but used here +struct loader_instance; +struct loader_device; +struct loader_icd_term; +struct loader_dev_dispatch_table; - # - # Write generate and write dispatch tables to output file - def endFile(self): - file_data = '' - - if self.genOpts.filename == 'vk_loader_extensions.h': - file_data += self.OutputPrototypesInHeader() - file_data += self.OutputLoaderTerminators() - file_data += self.OutputIcdDispatchTable() - file_data += self.OutputIcdExtensionEnableUnion() - file_data += self.OutputDeviceFunctionTerminatorDispatchTable() - - elif self.genOpts.filename == 'vk_loader_extensions.c': - file_data += self.OutputUtilitiesInSource() - file_data += self.OutputIcdDispatchTableInit() - file_data += self.OutputLoaderDispatchTables() - file_data += self.InitDeviceFunctionTerminatorDispatchTable() - file_data += self.OutputDeviceFunctionTrampolinePrototypes() - file_data += self.OutputLoaderLookupFunc() - file_data += self.CreateTrampTermFuncs() - file_data += self.InstExtensionGPA() - file_data += self.InstantExtensionCreate() - file_data += self.DeviceExtensionGetTerminator() - file_data += self.InitInstLoaderExtensionDispatchTable() - file_data += self.OutputInstantExtensionWhitelistArray() - - elif self.genOpts.filename == 'vk_layer_dispatch_table.h': - file_data += self.OutputLayerInstanceDispatchTable() - file_data += self.OutputLayerDeviceDispatchTable() - - file_data += '// clang-format on' - - write(file_data, file=self.outFile) - - # Finish processing in superclass - OutputGenerator.endFile(self) - - def beginFeature(self, interface, emit): - # Start processing in superclass - OutputGenerator.beginFeature(self, interface, emit) - self.featureExtraProtect = GetFeatureProtect(interface) - - enums = interface[0].findall('enum') - self.currentExtension = '' - self.name_definition = '' - - for item in enums: - name_definition = item.get('name') - if 'EXTENSION_NAME' in name_definition: - self.name_definition = name_definition - - self.type = interface.get('type') - self.num_commands = 0 - name = interface.get('name') - self.currentExtension = name +// Device extension error function +VKAPI_ATTR VkResult VKAPI_CALL vkDevExtError(VkDevice dev); - # - # Process commands, adding to appropriate dispatch tables - def genCmd(self, cmdinfo, name, alias): - OutputGenerator.genCmd(self, cmdinfo, name, alias) +// Extension interception for vkGetInstanceProcAddr function, so we can return +// the appropriate information for any instance extensions we know about. +bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr); - # Get first param type - params = cmdinfo.elem.findall('param') - info = self.getTypeNameTuple(params[0]) +// Extension interception for vkCreateInstance function, so we can properly +// detect and enable any instance extension information for extensions we know +// about. +void extensions_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo); - self.num_commands += 1 +// Extension interception for vkGetDeviceProcAddr function, so we can return +// an appropriate terminator if this is one of those few device commands requiring +// a terminator. +PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *name, bool* found_name); - if 'android' not in name: - self.AddCommandToDispatchList(self.currentExtension, self.type, name, cmdinfo, info[0]) +// Dispatch table properly filled in with appropriate terminators for the +// supported extensions. +extern const VkLayerInstanceDispatchTable instance_disp; - def endFeature(self): +// Array of extension strings for instance extensions we support. +extern const char *const LOADER_INSTANCE_EXTENSIONS[]; - if 'android' not in self.currentExtension: - self.instanceExtensions.append(self.ExtensionData(name=self.currentExtension, - type=self.type, - protect=self.featureExtraProtect, - define=self.name_definition, - num_commands=self.num_commands)) +VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_instance* inst, struct loader_icd_term *icd_term); - # Finish processing in superclass - OutputGenerator.endFeature(self) +// Init Device function pointer dispatch table with core commands +VKAPI_ATTR void VKAPI_CALL loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa, + VkDevice dev); - # - # Retrieve the value of the len tag - def getLen(self, param): - result = None - length = param.attrib.get('len') - if length and length != 'null-terminated': - # For string arrays, 'len' can look like 'count,null-terminated', - # indicating that we have a null terminated array of strings. We - # strip the null-terminated from the 'len' field and only return - # the parameter specifying the string count - if 'null-terminated' in length: - result = length.split(',')[0] - else: - result = length - result = str(result).replace('::', '->') - return result +// Init Device function pointer dispatch table with extension commands +VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table, + PFN_vkGetInstanceProcAddr gipa, + PFN_vkGetDeviceProcAddr gdpa, + VkInstance inst, + VkDevice dev); - # - # Returns an APIVersion object corresponding to the specified version token or None - def getAPIVersion(self, token): - if self.genOpts.apiname == 'vulkansc': - if token in ['VK_VERSION_1_0', 'VK_VERSION_1_1', 'VK_VERSION_1_2']: - # Vulkan 1.0-1.2 is included in Vulkan SC 1.0 - token = 'VKSC_VERSION_1_0' - - if token.startswith('VKSC_VERSION_'): - return APIVersion(token, 'Vulkan SC', True) - elif token.startswith('VK_VERSION_'): - # Unsupported Vulkan version - return APIVersion(token, 'Vulkan', False) - else: - return None +// Init Instance function pointer dispatch table with core commands +VKAPI_ATTR void VKAPI_CALL loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa, + VkInstance inst); - if token.startswith('VK_VERSION_'): - return APIVersion(token) - return None +// Init Instance function pointer dispatch table with core commands +VKAPI_ATTR void VKAPI_CALL loader_init_instance_extension_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa, + VkInstance inst); - # - # Determine if this API should be ignored or added to the instance or device dispatch table - def AddCommandToDispatchList(self, extension_name, extension_type, name, cmdinfo, handle_type): - handle = self.registry.tree.find("types/type/[name='" + handle_type + "'][@category='handle']") - - return_type = cmdinfo.elem.find('proto/type') - if (return_type is not None and return_type.text == 'void'): - return_type = None - - require = None - if name == 'vkGetDeviceGroupSurfacePresentModes2EXT': - require_node = self.registry.tree.find(f"./extensions/extension[@name='{extension_name}']/require/command[@name='{name}']/..") - if 'depends' in require_node.attrib: - require = require_node.attrib['depends'] - - cmd_params = [] - - # Generate a list of commands for use in printing the necessary - # core instance terminator prototypes - params = cmdinfo.elem.findall('param') - lens = set() - for param in params: - length = self.getLen(param) - if length: - lens.add(length) - - for param in params: - paramInfo = self.getTypeNameTuple(param) - param_type = paramInfo[0] - param_name = paramInfo[1] - param_cdecl = self.makeCParamDecl(param, 0) - cmd_params.append(self.CommandParam(type=param_type, name=param_name, - cdecl=param_cdecl)) - - version = self.getAPIVersion(extension_name) - if version and not version.supported: - # Skip commands in unsupported versions - return - - if handle is not None and handle_type != 'VkInstance' and handle_type != 'VkPhysicalDevice': - # The Core Vulkan code will be wrapped in a feature called VK_VERSION_#_# - # For example: VK_VERSION_1_0 wraps the core 1.0 Vulkan functionality - if version: - self.core_commands.append( - self.CommandData(name=name, ext_name=version.token, - ext_type='device', - require=require, - protect=self.featureExtraProtect, - return_type = return_type, - handle_type = handle_type, - params = cmd_params, - cdecl=self.makeCDecls(cmdinfo.elem)[0])) - else: - self.ext_device_dispatch_list.append((name, self.featureExtraProtect)) - self.ext_commands.append( - self.CommandData(name=name, ext_name=extension_name, - ext_type=extension_type, - require=require, - protect=self.featureExtraProtect, - return_type = return_type, - handle_type = handle_type, - params = cmd_params, - cdecl=self.makeCDecls(cmdinfo.elem)[0])) - else: - # The Core Vulkan code will be wrapped in a feature called VK_VERSION_#_# - # For example: VK_VERSION_1_0 wraps the core 1.0 Vulkan functionality - if version: - self.core_commands.append( - self.CommandData(name=name, ext_name=version.token, - ext_type='instance', - require=require, - protect=self.featureExtraProtect, - return_type = return_type, - handle_type = handle_type, - params = cmd_params, - cdecl=self.makeCDecls(cmdinfo.elem)[0])) +// Device command lookup function +VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table, const char *name, bool* name_found); - else: - self.ext_instance_dispatch_list.append((name, self.featureExtraProtect)) - self.ext_commands.append( - self.CommandData(name=name, ext_name=extension_name, - ext_type=extension_type, - require=require, - protect=self.featureExtraProtect, - return_type = return_type, - handle_type = handle_type, - params = cmd_params, - cdecl=self.makeCDecls(cmdinfo.elem)[0])) +// Instance command lookup function +VKAPI_ATTR void* VKAPI_CALL loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name, + bool *found_name); - # - # Retrieve the type and name for a parameter - def getTypeNameTuple(self, param): - t = '' - n = '' - for elem in param: - if elem.tag == 'type': - t = noneStr(elem.text) - elif elem.tag == 'name': - n = noneStr(elem.text) - return (t, n) +''') - # Convert an XML dependency expression to a C expression, taking a callback to replace extension names - # See https://registry.khronos.org/vulkan/specs/1.4/registry.html#depends-expressions - @staticmethod - def ConvertDependencyExpression(expr, replace_func): - # '(' and ')' can pass through unchanged - expr = re.sub(',', ' || ', expr) - expr = re.sub(r'\+', ' && ', expr) - expr = re.sub(r'\w+', lambda match: replace_func(match.group()), expr) - return expr + # Creates the prototypes for the loader's core instance command terminators + def OutputLoaderTerminators(self, out): + out.append('// Loader core instance terminators\n') - def OutputPrototypesInHeader(self): - protos = '' - protos += '// Structures defined externally, but used here\n' - protos += 'struct loader_instance;\n' - protos += 'struct loader_device;\n' - protos += 'struct loader_icd_term;\n' - protos += 'struct loader_dev_dispatch_table;\n' - protos += '\n' - protos += '// Device extension error function\n' - protos += 'VKAPI_ATTR VkResult VKAPI_CALL vkDevExtError(VkDevice dev);\n' - protos += '\n' - protos += '// Extension interception for vkGetInstanceProcAddr function, so we can return\n' - protos += '// the appropriate information for any instance extensions we know about.\n' - protos += 'bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr);\n' - protos += '\n' - protos += '// Extension interception for vkCreateInstance function, so we can properly\n' - protos += '// detect and enable any instance extension information for extensions we know\n' - protos += '// about.\n' - protos += 'void extensions_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo);\n' - protos += '\n' - protos += '// Extension interception for vkGetDeviceProcAddr function, so we can return\n' - protos += '// an appropriate terminator if this is one of those few device commands requiring\n' - protos += '// a terminator.\n' - protos += 'PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *name, bool* found_name);\n' - protos += '\n' - protos += '// Dispatch table properly filled in with appropriate terminators for the\n' - protos += '// supported extensions.\n' - protos += 'extern const VkLayerInstanceDispatchTable instance_disp;\n' - protos += '\n' - protos += '// Array of extension strings for instance extensions we support.\n' - protos += 'extern const char *const LOADER_INSTANCE_EXTENSIONS[];\n' - protos += '\n' - protos += 'VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_instance* inst, struct loader_icd_term *icd_term);\n' - protos += '\n' - protos += '// Init Device function pointer dispatch table with core commands\n' - protos += 'VKAPI_ATTR void VKAPI_CALL loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa,\n' - protos += ' VkDevice dev);\n' - protos += '\n' - protos += '// Init Device function pointer dispatch table with extension commands\n' - protos += 'VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table,\n' - protos += ' PFN_vkGetInstanceProcAddr gipa,\n' - protos += ' PFN_vkGetDeviceProcAddr gdpa,\n' - protos += ' VkInstance inst,\n' - protos += ' VkDevice dev);\n' - protos += '\n' - protos += '// Init Instance function pointer dispatch table with core commands\n' - protos += 'VKAPI_ATTR void VKAPI_CALL loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n' - protos += ' VkInstance inst);\n' - protos += '\n' - protos += '// Init Instance function pointer dispatch table with core commands\n' - protos += 'VKAPI_ATTR void VKAPI_CALL loader_init_instance_extension_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n' - protos += ' VkInstance inst);\n' - protos += '\n' - protos += '// Device command lookup function\n' - protos += 'VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table, const char *name, bool* name_found);\n' - protos += '\n' - protos += '// Instance command lookup function\n' - protos += 'VKAPI_ATTR void* VKAPI_CALL loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name,\n' - protos += ' bool *found_name);\n' - protos += '\n' - return protos - - def OutputUtilitiesInSource(self): - protos = '' - protos += '// Device extension error function\n' - protos += 'VKAPI_ATTR VkResult VKAPI_CALL vkDevExtError(VkDevice dev) {\n' - protos += ' struct loader_device *found_dev;\n' - protos += ' // The device going in is a trampoline device\n' - protos += ' struct loader_icd_term *icd_term = loader_get_icd_and_device(dev, &found_dev);\n' - protos += '\n' - protos += ' if (icd_term)\n' - protos += ' loader_log(icd_term->this_instance, VULKAN_LOADER_ERROR_BIT, 0,\n' - protos += ' "Bad destination in loader trampoline dispatch,"\n' - protos += ' "Are layers and extensions that you are calling enabled?");\n' - protos += ' return VK_ERROR_EXTENSION_NOT_PRESENT;\n' - protos += '}\n\n' - return protos + for command in self.vk.commands.values(): + if len(command.extensions) > 0: + continue + if not (command.name in ADD_INST_CMDS) and not (command.params[0].type in ['VkInstance', 'VkPhysicalDevice']): + continue - # - # Create a layer instance dispatch table from the appropriate list and return it as a string - def OutputLayerInstanceDispatchTable(self): - commands = [] - table = '' - cur_extension_name = '' + mod_string = '' + new_terminator = command.cPrototype + mod_string = new_terminator.replace("VKAPI_CALL vk", "VKAPI_CALL terminator_") - table += '// Instance function pointer dispatch table\n' - table += 'typedef struct VkLayerInstanceDispatchTable_ {\n' + if command.name in PRE_INSTANCE_FUNCTIONS: + pre_instance_basic_version = mod_string + mod_string = mod_string.replace("terminator_", "terminator_pre_instance_") + mod_string = mod_string.replace(command.name[2:] + '(\n', command.name[2:] + '(\n const Vk' + command.name[2:] + 'Chain* chain,\n') - # First add in an entry for GetPhysicalDeviceProcAddr. This will not - # ever show up in the XML or header, so we have to manually add it. - table += ' // Manually add in GetPhysicalDeviceProcAddr entry\n' - table += ' PFN_GetPhysicalDeviceProcAddr GetPhysicalDeviceProcAddr;\n' + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') - for x in range(0, 2): - if x == 0: - commands = self.core_commands - else: - commands = self.ext_commands + if command.name in PRE_INSTANCE_FUNCTIONS: + out.append(pre_instance_basic_version) + out.append('\n') - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - is_inst_handle_type = cur_cmd.name in ADD_INST_CMDS or cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice' - if is_inst_handle_type: + out.append(mod_string) + out.append('\n') - if cur_cmd.ext_name != cur_extension_name: - if version: - table += f'\n // ---- Core {version.name} commands\n' - else: - table += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') - # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + out.append('\n') - if cur_cmd.protect is not None: - table += f'#if defined({cur_cmd.protect})\n' + # Create a dispatch table from the appropriate list + def OutputIcdDispatchTable(self, out): + skip_commands = ['vkGetInstanceProcAddr', + 'vkEnumerateDeviceLayerProperties', + ] - table += f' PFN_{cur_cmd.name} {base_name};\n' + out.append('// ICD function pointer dispatch table\n') + out.append('struct loader_icd_term_dispatch {\n') - if cur_cmd.protect is not None: - table += f'#endif // {cur_cmd.protect}\n' + current_block = '' + for command in self.vk.commands.values(): + if (command.name in skip_commands or command.device )and command.name != 'vkGetDeviceProcAddr': + continue - table += '} VkLayerInstanceDispatchTable;\n\n' - return table + current_block = self.DescribeBlock(command, current_block, out) - # - # Create a layer device dispatch table from the appropriate list and return it as a string - def OutputLayerDeviceDispatchTable(self): - commands = [] - table = '' - cur_extension_name = '' + if command.protect: + out.append(f'#if defined({command.protect})\n') - table += '// Device function pointer dispatch table\n' - table += '#define DEVICE_DISP_TABLE_MAGIC_NUMBER 0x10ADED040410ADEDUL\n' - table += 'typedef struct VkLayerDispatchTable_ {\n' - table += ' uint64_t magic; // Should be DEVICE_DISP_TABLE_MAGIC_NUMBER\n' + out.append(f' PFN_{command.name} {command.name[2:]};\n') - for x in range(0, 2): - if x == 0: - commands = self.core_commands - else: - commands = self.ext_commands + if command.protect: + out.append(f'#endif // {command.protect}\n') + out.append('};\n\n') - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - is_inst_handle_type = cur_cmd.name in ADD_INST_CMDS or cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice' - if not is_inst_handle_type: + # Create the extension enable union + def OutputIcdExtensionEnableUnion(self, out): - if cur_cmd.ext_name != cur_extension_name: - if version: - table += f'\n // ---- Core {version.name} commands\n' - else: - table += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name + out.append( 'struct loader_instance_extension_enables {\n') + for extension in self.instance_extensions: + if len(extension.commands) == 0 or extension.name in WSI_EXT_NAMES: + continue + out.append( f' uint8_t {extension.name[3:].lower()};\n') - # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + out.append( '};\n\n') - if cur_cmd.protect is not None: - table += f'#if defined({cur_cmd.protect})\n' + # Create a dispatch table solely for device functions which have custom terminators + def OutputDeviceFunctionTerminatorDispatchTable(self, out): + out.append('// Functions that required a terminator need to have a separate dispatch table which contains their corresponding\n') + out.append('// device function. This is used in the terminators themselves.\n') + out.append('struct loader_device_terminator_dispatch {\n') + + # last_protect = None + current_block = '' + for command in self.vk.commands.values(): + if len(command.extensions) == 0: + continue + if command.name in DEVICE_CMDS_NEED_TERM: + if command.protect is not None: + out.append( f'#if defined({command.protect})\n') - table += f' PFN_{cur_cmd.name} {base_name};\n' - if cur_cmd.protect is not None: - table += f'#endif // {cur_cmd.protect}\n' + current_block = self.DescribeBlock(command, current_block, out) - table += '} VkLayerDispatchTable;\n\n' - return table + out.append( f' PFN_{command.name} {command.name[2:]};\n') - # - # Common code between the dispatch table struct and the function filling out said struct - def ShouldPrintInIcdDispatchTable(self, cur_cmd, skip_list): - return cur_cmd.name == 'vkGetDeviceProcAddr' or \ - (cur_cmd.handle_type not in ['VkDevice', 'VkCommandBuffer', 'VkQueue'] and cur_cmd.name not in skip_list) + if command.protect is not None: + out.append( f'#endif // {command.protect}\n') - # - # Create a dispatch table from the appropriate list and return it as a string - def OutputIcdDispatchTable(self): - commands = [] - table = '' - cur_extension_name = '' + out.append( '};\n\n') - skip_commands = ['vkGetInstanceProcAddr', - 'vkEnumerateDeviceLayerProperties', - ] - table += '// ICD function pointer dispatch table\n' - table += 'struct loader_icd_term_dispatch {\n' + # Create a layer instance dispatch table from the appropriate list + def OutputLayerInstanceDispatchTable(self, out): - for x in range(0, 2): - if x == 0: - commands = self.core_commands - else: - commands = self.ext_commands - - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - if self.ShouldPrintInIcdDispatchTable(cur_cmd, skip_commands): - if cur_cmd.ext_name != cur_extension_name: - if version: - table += f'\n // ---- Core {version.name} commands\n' - else: - table += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name + out.append('// Instance function pointer dispatch table\n') + out.append('typedef struct VkLayerInstanceDispatchTable_ {\n') - # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + # First add in an entry for GetPhysicalDeviceProcAddr. This will not + # ever show up in the XML or header, so we have to manually add it. + out.append(' // Manually add in GetPhysicalDeviceProcAddr entry\n') + out.append(' PFN_GetPhysicalDeviceProcAddr GetPhysicalDeviceProcAddr;\n') - if cur_cmd.protect is not None: - table += f'#if defined({cur_cmd.protect})\n' + current_block = '' + for command_name, command in self.vk.commands.items(): + if not command.instance: + continue - table += f' PFN_{cur_cmd.name} {base_name};\n' + current_block = self.DescribeBlock(command, current_block, out) - if cur_cmd.protect is not None: - table += f'#endif // {cur_cmd.protect}\n' + if command.protect: + out.append(f'#if defined({command.protect})\n') - table += '};\n\n' - return table + out.append(f' PFN_{command_name} {command_name[2:]};\n') - # - # Init a dispatch table from the appropriate list and return it as a string - def OutputIcdDispatchTableInit(self): - commands = [] - cur_extension_name = '' + if command.protect: + out.append(f'#endif // {command.protect}\n') - table = '' - table += 'VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_instance* inst, struct loader_icd_term *icd_term) {\n' - table += ' const PFN_vkGetInstanceProcAddr fp_gipa = icd_term->scanned_icd->GetInstanceProcAddr;\n' - table += '\n' - table += '#define LOOKUP_GIPA(func) icd_term->dispatch.func = (PFN_vk##func)fp_gipa(icd_term->instance, "vk" #func);\n' - table += '\n' - table += '#define LOOKUP_REQUIRED_GIPA(func) \\\n' - table += ' do { \\\n' - table += ' LOOKUP_GIPA(func); \\\n' - table += ' if (!icd_term->dispatch.func) { \\\n' - table += ' loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, "Unable to load %s from ICD %s",\\\n' - table += ' "vk"#func, icd_term->scanned_icd->lib_name); \\\n' - table += ' return false; \\\n' - table += ' } \\\n' - table += ' } while (0)\n' - table += '\n' + out.append('} VkLayerInstanceDispatchTable;\n\n') + # Create a layer device dispatch table from the appropriate list + def OutputLayerDeviceDispatchTable(self, out): - skip_gipa_commands = ['vkGetInstanceProcAddr', - 'vkEnumerateDeviceLayerProperties', - 'vkCreateInstance', - 'vkEnumerateInstanceExtensionProperties', - 'vkEnumerateInstanceLayerProperties', - 'vkEnumerateInstanceVersion', - ] + out.append('// Device function pointer dispatch table\n') + out.append('#define DEVICE_DISP_TABLE_MAGIC_NUMBER 0x10ADED040410ADEDUL\n') + out.append('typedef struct VkLayerDispatchTable_ {\n') + out.append(' uint64_t magic; // Should be DEVICE_DISP_TABLE_MAGIC_NUMBER\n') - for x in range(0, 2): - if x == 0: - commands = self.core_commands - else: - commands = self.ext_commands + current_block = '' + for command in [x for x in self.vk.commands.values() if x.device]: - required = False - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - if self.ShouldPrintInIcdDispatchTable(cur_cmd, skip_gipa_commands): + current_block = self.DescribeBlock(command, current_block, out) - if cur_cmd.ext_name != cur_extension_name: - if version: - table += f'\n // ---- Core {version.name}\n' - required = version.number == '1.0' - else: - table += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - required = False - cur_extension_name = cur_cmd.ext_name + if command.protect: + out.append(f'#if defined({command.protect})\n') - # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + out.append(f' PFN_{command.name} {command.name[2:]};\n') - if cur_cmd.protect is not None: - table += f'#if defined({cur_cmd.protect})\n' + if command.protect: + out.append(f'#endif // {command.protect}\n') + out.append('} VkLayerDispatchTable;\n\n') - if required: - # The Core Vulkan code will be wrapped in a feature called VK_VERSION_#_# - # For example: VK_VERSION_1_0 wraps the core 1.0 Vulkan functionality - table += f' LOOKUP_REQUIRED_GIPA({base_name});\n' - else: - table += f' LOOKUP_GIPA({base_name});\n' - if cur_cmd.protect is not None: - table += f'#endif // {cur_cmd.protect}\n' - - table += '\n' - table += '#undef LOOKUP_REQUIRED_GIPA\n' - table += '#undef LOOKUP_GIPA\n' - table += '\n' - table += ' return true;\n' - table += '};\n\n' - return table + def OutputUtilitiesInSource(self, out): + out.append(''' +// Device extension error function +VKAPI_ATTR VkResult VKAPI_CALL vkDevExtError(VkDevice dev) { + struct loader_device *found_dev; + // The device going in is a trampoline device + struct loader_icd_term *icd_term = loader_get_icd_and_device(dev, &found_dev); - # - # Create the extension enable union - def OutputIcdExtensionEnableUnion(self): - extensions = self.instanceExtensions - - union = '' - union += 'struct loader_instance_extension_enables {\n' - for ext in extensions: - if (self.getAPIVersion(ext.name) or ext.name in WSI_EXT_NAMES or - ext.type == 'device' or ext.num_commands == 0): - continue + if (icd_term) + loader_log(icd_term->this_instance, VULKAN_LOADER_ERROR_BIT, 0, + "Bad destination in loader trampoline dispatch," + "Are layers and extensions that you are calling enabled?"); + return VK_ERROR_EXTENSION_NOT_PRESENT; +} - union += f' uint8_t {ext.name[3:].lower()};\n' +''') - union += '};\n\n' - return union - # - # Creates the prototypes for the loader's core instance command terminators - def OutputLoaderTerminators(self): - terminators = '' - terminators += '// Loader core instance terminators\n' + # Init a dispatch table from the appropriate list + def OutputIcdDispatchTableInit(self, out): + out.append('VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_instance* inst, struct loader_icd_term *icd_term) {\n') + out.append(' const PFN_vkGetInstanceProcAddr fp_gipa = icd_term->scanned_icd->GetInstanceProcAddr;\n') + out.append('\n') + out.append('#define LOOKUP_GIPA(func) icd_term->dispatch.func = (PFN_vk##func)fp_gipa(icd_term->instance, "vk" #func);\n') + out.append('\n') + out.append('#define LOOKUP_REQUIRED_GIPA(func) \\\n') + out.append(' do { \\\n') + out.append(' LOOKUP_GIPA(func); \\\n') + out.append(' if (!icd_term->dispatch.func) { \\\n') + out.append(' loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, "Unable to load %s from ICD %s",\\\n') + out.append(' "vk"#func, icd_term->scanned_icd->lib_name); \\\n') + out.append(' return false; \\\n') + out.append(' } \\\n') + out.append(' } while (0)\n') + out.append('\n') + - for cur_cmd in self.core_commands: - is_inst_handle_type = cur_cmd.name in ADD_INST_CMDS or cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice' - if is_inst_handle_type: - mod_string = '' - new_terminator = cur_cmd.cdecl - mod_string = new_terminator.replace("VKAPI_CALL vk", "VKAPI_CALL terminator_") + skip_gipa_commands = ['vkGetInstanceProcAddr', + 'vkEnumerateDeviceLayerProperties', + 'vkCreateInstance', + 'vkEnumerateInstanceExtensionProperties', + 'vkEnumerateInstanceLayerProperties', + 'vkEnumerateInstanceVersion', + ] - if cur_cmd.name in PRE_INSTANCE_FUNCTIONS: - pre_instance_basic_version = mod_string - mod_string = mod_string.replace("terminator_", "terminator_pre_instance_") - mod_string = mod_string.replace(cur_cmd.name[2:] + '(\n', cur_cmd.name[2:] + '(\n const Vk' + cur_cmd.name[2:] + 'Chain* chain,\n') + current_block = '' + for command in [x for x in self.vk.commands.values() if x.instance or x.name == 'vkGetDeviceProcAddr']: + if command.name in skip_gipa_commands: + continue + custom_commands_string= ' commands' if len(command.extensions) > 0 else '' + current_block = self.DescribeBlock(command, current_block, out, custom_commands_string=custom_commands_string) - if cur_cmd.protect is not None: - terminators += f'#if defined({cur_cmd.protect})\n' + if command.protect is not None: + out.append( f'#if defined({command.protect})\n') - if cur_cmd.name in PRE_INSTANCE_FUNCTIONS: - terminators += pre_instance_basic_version - terminators += '\n' + if command.version is None and len(command.extensions) == 0: + # The Core Vulkan code will be wrapped in a feature called VK_VERSION_#_# + # For example: VK_VERSION_1_0 wraps the core 1.0 Vulkan functionality + out.append(f' LOOKUP_REQUIRED_GIPA({command.name[2:]});\n') + else: + out.append( f' LOOKUP_GIPA({command.name[2:]});\n') - terminators += mod_string - terminators += '\n' + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') - if cur_cmd.protect is not None: - terminators += f'#endif // {cur_cmd.protect}\n' + out.append('\n') + out.append('#undef LOOKUP_REQUIRED_GIPA\n') + out.append('#undef LOOKUP_GIPA\n') + out.append('\n') + out.append(' return true;\n') + out.append('};\n\n') - terminators += '\n' - return terminators - # # Creates code to initialize the various dispatch tables - def OutputLoaderDispatchTables(self): + def OutputLoaderDispatchTables(self, out): commands = [] - tables = '' gpa_param = '' cur_type = '' - cur_extension_name = '' for x in range(0, 4): if x == 0: @@ -851,58 +530,54 @@ def OutputLoaderDispatchTables(self): gpa_param = 'dev' commands = self.core_commands - tables += '// Init Device function pointer dispatch table with core commands\n' - tables += 'VKAPI_ATTR void VKAPI_CALL loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa,\n' - tables += ' VkDevice dev) {\n' - tables += ' VkLayerDispatchTable *table = &dev_table->core_dispatch;\n' - tables += ' if (table->magic != DEVICE_DISP_TABLE_MAGIC_NUMBER) { abort(); }\n' - tables += ' for (uint32_t i = 0; i < MAX_NUM_UNKNOWN_EXTS; i++) dev_table->ext_dispatch[i] = (PFN_vkDevExt)vkDevExtError;\n' + out.append('// Init Device function pointer dispatch table with core commands\n') + out.append('VKAPI_ATTR void VKAPI_CALL loader_init_device_dispatch_table(struct loader_dev_dispatch_table *dev_table, PFN_vkGetDeviceProcAddr gpa,\n') + out.append(' VkDevice dev) {\n') + out.append(' VkLayerDispatchTable *table = &dev_table->core_dispatch;\n') + out.append(' if (table->magic != DEVICE_DISP_TABLE_MAGIC_NUMBER) { abort(); }\n') + out.append(' for (uint32_t i = 0; i < MAX_NUM_UNKNOWN_EXTS; i++) dev_table->ext_dispatch[i] = (PFN_vkDevExt)vkDevExtError;\n') elif x == 1: cur_type = 'device' gpa_param = 'dev' - commands = self.ext_commands + commands = self.extension_commands - tables += '// Init Device function pointer dispatch table with extension commands\n' - tables += 'VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table,\n' - tables += ' PFN_vkGetInstanceProcAddr gipa,\n' - tables += ' PFN_vkGetDeviceProcAddr gdpa,\n' - tables += ' VkInstance inst,\n' - tables += ' VkDevice dev) {\n' - tables += ' VkLayerDispatchTable *table = &dev_table->core_dispatch;\n' - tables += ' table->magic = DEVICE_DISP_TABLE_MAGIC_NUMBER;\n' + out.append('// Init Device function pointer dispatch table with extension commands\n') + out.append('VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table,\n') + out.append(' PFN_vkGetInstanceProcAddr gipa,\n') + out.append(' PFN_vkGetDeviceProcAddr gdpa,\n') + out.append(' VkInstance inst,\n') + out.append(' VkDevice dev) {\n') + out.append(' VkLayerDispatchTable *table = &dev_table->core_dispatch;\n') + out.append(' table->magic = DEVICE_DISP_TABLE_MAGIC_NUMBER;\n') elif x == 2: cur_type = 'instance' gpa_param = 'inst' commands = self.core_commands - tables += '// Init Instance function pointer dispatch table with core commands\n' - tables += 'VKAPI_ATTR void VKAPI_CALL loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n' - tables += ' VkInstance inst) {\n' + out.append('// Init Instance function pointer dispatch table with core commands\n') + out.append('VKAPI_ATTR void VKAPI_CALL loader_init_instance_core_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n') + out.append(' VkInstance inst) {\n') else: cur_type = 'instance' gpa_param = 'inst' - commands = self.ext_commands + commands = self.extension_commands - tables += '// Init Instance function pointer dispatch table with core commands\n' - tables += 'VKAPI_ATTR void VKAPI_CALL loader_init_instance_extension_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n' - tables += ' VkInstance inst) {\n' + out.append('// Init Instance function pointer dispatch table with core commands\n') + out.append('VKAPI_ATTR void VKAPI_CALL loader_init_instance_extension_dispatch_table(VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa,\n') + out.append(' VkInstance inst) {\n') - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - is_inst_handle_type = cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice' + current_block = '' + for command in commands: + is_inst_handle_type = command.params[0].type in ['VkInstance', 'VkPhysicalDevice'] if ((cur_type == 'instance' and is_inst_handle_type) or (cur_type == 'device' and not is_inst_handle_type)): - if cur_cmd.ext_name != cur_extension_name: - if version: - tables += f'\n // ---- Core {version.name} commands\n' - else: - tables += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name + + current_block = self.DescribeBlock(command, current_block, out) # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + base_name = command.name[2:] # Names to skip if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or @@ -911,95 +586,134 @@ def OutputLoaderDispatchTables(self): base_name == 'EnumerateInstanceVersion'): continue - if cur_cmd.protect is not None: - tables += f'#if defined({cur_cmd.protect})\n' + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') # If we're looking for the proc we are passing in, just point the table to it. This fixes the issue where # a layer overrides the function name for the loader. if x == 1: if base_name == 'GetDeviceProcAddr': - tables += ' table->GetDeviceProcAddr = gdpa;\n' - elif cur_cmd.ext_type == 'instance': - tables += f' table->{base_name} = (PFN_{cur_cmd.name})gipa(inst, "{cur_cmd.name}");\n' + out.append(' table->GetDeviceProcAddr = gdpa;\n') + elif len(command.extensions) > 0 and command.extensions[0].instance: + out.append(f' table->{base_name} = (PFN_{command.name})gipa(inst, "{command.name}");\n') else: - tables += f' table->{base_name} = (PFN_{cur_cmd.name})gdpa(dev, "{cur_cmd.name}");\n' + out.append(f' table->{base_name} = (PFN_{command.name})gdpa(dev, "{command.name}");\n') elif (x < 1 and base_name == 'GetDeviceProcAddr'): - tables += ' table->GetDeviceProcAddr = gpa;\n' + out.append(' table->GetDeviceProcAddr = gpa;\n') elif (x > 1 and base_name == 'GetInstanceProcAddr'): - tables += ' table->GetInstanceProcAddr = gpa;\n' + out.append(' table->GetInstanceProcAddr = gpa;\n') else: - tables += f' table->{base_name} = (PFN_{cur_cmd.name})gpa({gpa_param}, "{cur_cmd.name}");\n' + out.append(f' table->{base_name} = (PFN_{command.name})gpa({gpa_param}, "{command.name}");\n') + + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') + + out.append('}\n\n') + +# + # Create code to initialize a dispatch table from the appropriate list of extension entrypoints + def InitDeviceFunctionTerminatorDispatchTable(self, out): + out.append('// Functions that required a terminator need to have a separate dispatch table which contains their corresponding\n') + out.append('// device function. This is used in the terminators themselves.\n') + out.append('void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) {\n') + out.append(' struct loader_device_terminator_dispatch* dispatch = &dev->loader_dispatch.extension_terminator_dispatch;\n') + out.append(' PFN_vkGetDeviceProcAddr gpda = (PFN_vkGetDeviceProcAddr)dev->phys_dev_term->this_icd_term->dispatch.GetDeviceProcAddr;\n') + current_block = '' + for command in [x for x in self.vk.commands.values() if x.extensions or x.version]: + if command.name in DEVICE_CMDS_NEED_TERM: + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') + + current_block = self.DescribeBlock(command, current_block, out) + if command.name == 'vkGetDeviceGroupSurfacePresentModes2EXT': # command.extensions[0].depends in [x for x in self.vk.commands.values() if x.device]: + # Hardcode the dependency expression as vulkan_object.py doesn't expose this information + dep_expr = self.ConvertDependencyExpression('VK_KHR_device_group,VK_VERSION_1_1', lambda ext_name: f'dev->driver_extensions.{ext_name[3:].lower()}_enabled') + out.append(f' if (dev->driver_extensions.{command.extensions[0].name[3:].lower()}_enabled && ({dep_expr}))\n') + out.append(f' dispatch->{command.name[2:]} = (PFN_{(command.name)})gpda(dev->icd_device, "{(command.name)}");\n') + else: + out.append(f' if (dev->driver_extensions.{command.extensions[0].name[3:].lower()}_enabled)\n') + out.append(f' dispatch->{command.name[2:]} = (PFN_{(command.name)})gpda(dev->icd_device, "{(command.name)}");\n') + + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') + + out.append('}\n\n') + + + def OutputDeviceFunctionTrampolinePrototypes(self, out): + out.append('// These are prototypes for functions that need their trampoline called in all circumstances.\n') + out.append('// They are used in loader_lookup_device_dispatch_table but are defined afterwards.\n') + current_block = '' + for command in self.vk.commands.values(): + if command.name in DEVICE_CMDS_MUST_USE_TRAMP: - if cur_cmd.protect is not None: - tables += f'#endif // {cur_cmd.protect}\n' + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') + current_block = self.DescribeBlock(command, current_block, out) + + out.append(f'{command.cPrototype.replace("VKAPI_CALL vk", "VKAPI_CALL ")}\n') + + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') + out.append('\n') - tables += '}\n\n' - return tables # - # Create a lookup table function from the appropriate list of entrypoints and - # return it as a string - def OutputLoaderLookupFunc(self): + # Create a lookup table function from the appropriate list of entrypoints + def OutputLoaderLookupFunc(self, out): commands = [] - tables = '' cur_type = '' - cur_extension_name = '' for x in range(0, 2): if x == 0: cur_type = 'device' - tables += '// Device command lookup function\n' - tables += 'VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table, const char *name, bool* found_name) {\n' - tables += ' if (!name || name[0] != \'v\' || name[1] != \'k\') {\n' - tables += ' *found_name = false;\n' - tables += ' return NULL;\n' - tables += ' }\n' - tables += '\n' - tables += ' name += 2;\n' - tables += ' *found_name = true;\n' - tables += ' struct loader_device* dev = (struct loader_device *)table;\n' - tables += ' const struct loader_instance* inst = dev->phys_dev_term->this_icd_term->this_instance;\n' - tables += ' uint32_t api_version = VK_MAKE_API_VERSION(0, inst->app_api_version.major, inst->app_api_version.minor, inst->app_api_version.patch);\n' - tables += '\n' + out.append('// Device command lookup function\n') + out.append('VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDispatchTable *table, const char *name, bool* found_name) {\n') + out.append(' if (!name || name[0] != \'v\' || name[1] != \'k\') {\n') + out.append(' *found_name = false;\n') + out.append(' return NULL;\n') + out.append(' }\n') + out.append('\n') + out.append(' name += 2;\n') + out.append(' *found_name = true;\n') + out.append(' struct loader_device* dev = (struct loader_device *)table;\n') + out.append(' const struct loader_instance* inst = dev->phys_dev_term->this_icd_term->this_instance;\n') + out.append(' uint32_t api_version = VK_MAKE_API_VERSION(0, inst->app_api_version.major, inst->app_api_version.minor, inst->app_api_version.patch);\n') + out.append('\n') else: cur_type = 'instance' - tables += '// Instance command lookup function\n' - tables += 'VKAPI_ATTR void* VKAPI_CALL loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name,\n' - tables += ' bool *found_name) {\n' - tables += ' if (!name || name[0] != \'v\' || name[1] != \'k\') {\n' - tables += ' *found_name = false;\n' - tables += ' return NULL;\n' - tables += ' }\n' - tables += '\n' - tables += ' *found_name = true;\n' - tables += ' name += 2;\n' - - - for y in range(0, 2): - if y == 0: - commands = self.core_commands - else: - commands = self.ext_commands - - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - is_inst_handle_type = cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice' + out.append('// Instance command lookup function\n') + out.append('VKAPI_ATTR void* VKAPI_CALL loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table, const char *name,\n') + out.append(' bool *found_name) {\n') + out.append(' if (!name || name[0] != \'v\' || name[1] != \'k\') {\n') + out.append(' *found_name = false;\n') + out.append(' return NULL;\n') + out.append(' }\n') + out.append('\n') + out.append(' *found_name = true;\n') + out.append(' name += 2;\n') + + + for command_list in [self.core_commands, self.extension_commands]: + commands = command_list + + version_check = '' + current_block = '' + for command in commands: + is_inst_handle_type = command.params[0].type in ['VkInstance', 'VkPhysicalDevice'] if ((cur_type == 'instance' and is_inst_handle_type) or (cur_type == 'device' and not is_inst_handle_type)): - if cur_cmd.ext_name != cur_extension_name: - if version: - tables += f'\n // ---- Core {version.name} commands\n' - if cur_type == 'device': - version_check = f' if (dev->should_ignore_device_commands_from_newer_version && api_version < {version.constant}) return NULL;\n' - else: - tables += f'\n // ---- {cur_cmd.ext_name} extension commands\n' + current_block = self.DescribeBlock(command, current_block, out) + if len(command.extensions) == 0: + if cur_type == 'device': + version_check = f' if (dev->should_ignore_device_commands_from_newer_version && api_version < {command.version.nameApi if command.version else 'VK_API_VERSION_1_0'}) return NULL;\n' + else: version_check = '' - cur_extension_name = cur_cmd.ext_name # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] + base_name = command.name[2:] if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or base_name == 'EnumerateInstanceExtensionProperties' or @@ -1007,37 +721,34 @@ def OutputLoaderLookupFunc(self): base_name == 'EnumerateInstanceVersion'): continue - if cur_cmd.protect is not None: - tables += f'#if defined({cur_cmd.protect})\n' + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') - tables += f' if (!strcmp(name, "{base_name}")) ' - if cur_cmd.name in DEVICE_CMDS_MUST_USE_TRAMP: + out.append(f' if (!strcmp(name, "{base_name}")) ') + if command.name in DEVICE_CMDS_MUST_USE_TRAMP: if version_check != '': - tables += f'{{\n{version_check} return dev->layer_extensions.{cur_cmd.ext_name[3:].lower()}_enabled ? (void *){base_name} : NULL;\n }}\n' + out.append(f'{{\n{version_check} return dev->layer_extensions.{command.extensions[0].name[3:].lower()}_enabled ? (void *){base_name} : NULL;\n }}\n') else: - tables += f'return dev->layer_extensions.{cur_cmd.ext_name[3:].lower()}_enabled ? (void *){base_name} : NULL;\n' + out.append(f'return dev->layer_extensions.{command.extensions[0].name[3:].lower()}_enabled ? (void *){base_name} : NULL;\n') else: if version_check != '': - tables += f'{{\n{version_check} return (void *)table->{base_name};\n }}\n' + out.append(f'{{\n{version_check} return (void *)table->{base_name};\n }}\n') else: - tables += f'return (void *)table->{base_name};\n' + out.append(f'return (void *)table->{base_name};\n') + + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') - if cur_cmd.protect is not None: - tables += f'#endif // {cur_cmd.protect}\n' + out.append('\n') + out.append(' *found_name = false;\n') + out.append(' return NULL;\n') + out.append('}\n\n') - tables += '\n' - tables += ' *found_name = false;\n' - tables += ' return NULL;\n' - tables += '}\n\n' - return tables # # Create the appropriate trampoline (and possibly terminator) functions - def CreateTrampTermFuncs(self): - funcs = '' - cur_extension_name = '' - + def CreateTrampTermFuncs(self, out): # Some extensions have to be manually added. Skip those in the automatic # generation. They will be manually added later. manual_ext_commands = ['vkEnumeratePhysicalDeviceGroupsKHR', @@ -1066,28 +777,23 @@ def CreateTrampTermFuncs(self): 'vkGetDeviceGroupSurfacePresentModes2EXT', 'vkGetPhysicalDeviceToolPropertiesEXT'] - for ext_cmd in self.ext_commands: - if (ext_cmd.ext_name in WSI_EXT_NAMES or - ext_cmd.ext_name in AVOID_EXT_NAMES or - ext_cmd.name in AVOID_CMD_NAMES or - ext_cmd.name in manual_ext_commands): + current_block = '' + for command in [x for x in self.vk.commands.values() if x.extensions]: + if (command.extensions[0].name in WSI_EXT_NAMES or + command.extensions[0].name in AVOID_EXT_NAMES or + command.name in AVOID_CMD_NAMES or + command.name in manual_ext_commands): continue - version = self.getAPIVersion(ext_cmd.ext_name) - if ext_cmd.ext_name != cur_extension_name: - if version: - funcs += f'\n// ---- Core {version.name} trampoline/terminators\n\n' - else: - funcs += f'\n// ---- {ext_cmd.ext_name} extension trampoline/terminators\n\n' - cur_extension_name = ext_cmd.ext_name + current_block = self.DescribeBlock(command=command, current_block=current_block, out=out, custom_commands_string=' trampoline/terminators\n', indent='') - if ext_cmd.protect is not None: - funcs += f'#if defined({ext_cmd.protect})\n' + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') - func_header = ext_cmd.cdecl.replace(";", " {\n") + func_header = command.cPrototype.replace(";", " {\n") tramp_header = func_header.replace("VKAPI_CALL vk", "VKAPI_CALL ") return_prefix = ' ' - base_name = ext_cmd.name[2:] + base_name = command.name[2:] has_surface = 0 update_structure_surface = 0 update_structure_string = '' @@ -1102,7 +808,7 @@ def CreateTrampTermFuncs(self): physdev_type_to_replace = '' physdev_name_replacement = '' - for param in ext_cmd.params: + for param in command.params: if param.type == 'VkSurfaceKHR': has_surface = 1 surface_var_name = param.name @@ -1130,603 +836,480 @@ def CreateTrampTermFuncs(self): requires_terminator = 1 instance_var_name = param.name - if ext_cmd.return_type is not None: + if command.returnType != 'void': return_prefix += 'return ' has_return_type = True - if (ext_cmd.handle_type == 'VkInstance' or ext_cmd.handle_type == 'VkPhysicalDevice' or - 'DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name or - ext_cmd.name in DEVICE_CMDS_NEED_TERM): + if ( command.params[0].type in ['VkInstance', 'VkPhysicalDevice'] or + 'DebugMarkerSetObject' in command.name or 'SetDebugUtilsObject' in command.name or + command.name in DEVICE_CMDS_NEED_TERM): requires_terminator = 1 if requires_terminator == 1: term_header = tramp_header.replace("VKAPI_CALL ", "VKAPI_CALL terminator_") - funcs += tramp_header - - if ext_cmd.handle_type == 'VkPhysicalDevice': - funcs += ' const VkLayerInstanceDispatchTable *disp;\n' - funcs += f' VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device({phys_dev_var_name});\n' - funcs += ' if (VK_NULL_HANDLE == unwrapped_phys_dev) {\n' - funcs += ' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n' - funcs += f' "{ext_cmd.name}: Invalid {phys_dev_var_name} "\n' - funcs += f' "[VUID-{ext_cmd.name}-{phys_dev_var_name}-parameter]");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - funcs += f' disp = loader_get_instance_layer_dispatch({phys_dev_var_name});\n' - elif ext_cmd.handle_type == 'VkInstance': - funcs += f' struct loader_instance *inst = loader_get_instance({instance_var_name});\n' - funcs += ' if (NULL == inst) {\n' - funcs += ' loader_log(\n' - funcs += ' NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n' - funcs += f' "{ext_cmd.name}: Invalid instance [VUID-{ext_cmd.name}-{instance_var_name}-parameter]");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - funcs += '#error("Not implemented. Likely needs to be manually generated!");\n' + out.append(tramp_header) + + if command.params[0].type == 'VkPhysicalDevice': + out.append(' const VkLayerInstanceDispatchTable *disp;\n') + out.append(f' VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device({phys_dev_var_name});\n') + out.append(' if (VK_NULL_HANDLE == unwrapped_phys_dev) {\n') + out.append(' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n') + out.append(f' "{command.name}: Invalid {phys_dev_var_name} "\n') + out.append(f' "[VUID-{command.name}-{phys_dev_var_name}-parameter]");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + out.append(f' disp = loader_get_instance_layer_dispatch({phys_dev_var_name});\n') + elif command.params[0].type == 'VkInstance': + out.append(f' struct loader_instance *inst = loader_get_instance({instance_var_name});\n') + out.append(' if (NULL == inst) {\n') + out.append(' loader_log(\n') + out.append(' NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n') + out.append(f' "{command.name}: Invalid instance [VUID-{command.name}-{instance_var_name}-parameter]");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + out.append('#error("Not implemented. Likely needs to be manually generated!");\n') else: - funcs += ' const VkLayerDispatchTable *disp = loader_get_dispatch(' - funcs += ext_cmd.params[0].name - funcs += ');\n' - funcs += ' if (NULL == disp) {\n' - funcs += ' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n' - funcs += f' "{ext_cmd.name}: Invalid {ext_cmd.params[0].name} "\n' - funcs += f' "[VUID-{ext_cmd.name}-{ext_cmd.params[0].name}-parameter]");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - - if 'DebugMarkerSetObjectName' in ext_cmd.name: - funcs += ' VkDebugMarkerObjectNameInfoEXT local_name_info;\n' - funcs += ' memcpy(&local_name_info, pNameInfo, sizeof(VkDebugMarkerObjectNameInfoEXT));\n' - funcs += ' // If this is a physical device, we have to replace it with the proper one for the next call.\n' - funcs += ' if (pNameInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT) {\n' - funcs += ' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pNameInfo->object;\n' - funcs += ' local_name_info.object = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n' - funcs += ' }\n' - funcs += ' if (pNameInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT) {\n' - funcs += ' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pNameInfo->object;\n' - funcs += ' local_name_info.object = (uint64_t)(uintptr_t)instance->instance;\n' - funcs += ' }\n' - elif 'DebugMarkerSetObjectTag' in ext_cmd.name: - funcs += ' VkDebugMarkerObjectTagInfoEXT local_tag_info;\n' - funcs += ' memcpy(&local_tag_info, pTagInfo, sizeof(VkDebugMarkerObjectTagInfoEXT));\n' - funcs += ' // If this is a physical device, we have to replace it with the proper one for the next call.\n' - funcs += ' if (pTagInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT) {\n' - funcs += ' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pTagInfo->object;\n' - funcs += ' local_tag_info.object = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n' - funcs += ' }\n' - funcs += ' if (pTagInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT) {\n' - funcs += ' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pTagInfo->object;\n' - funcs += ' local_tag_info.object = (uint64_t)(uintptr_t)instance->instance;\n' - funcs += ' }\n' - elif 'SetDebugUtilsObjectName' in ext_cmd.name: - funcs += ' VkDebugUtilsObjectNameInfoEXT local_name_info;\n' - funcs += ' memcpy(&local_name_info, pNameInfo, sizeof(VkDebugUtilsObjectNameInfoEXT));\n' - funcs += ' // If this is a physical device, we have to replace it with the proper one for the next call.\n' - funcs += ' if (pNameInfo->objectType == VK_OBJECT_TYPE_PHYSICAL_DEVICE) {\n' - funcs += ' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pNameInfo->objectHandle;\n' - funcs += ' local_name_info.objectHandle = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n' - funcs += ' }\n' - funcs += ' if (pNameInfo->objectType == VK_OBJECT_TYPE_INSTANCE) {\n' - funcs += ' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pNameInfo->objectHandle;\n' - funcs += ' local_name_info.objectHandle = (uint64_t)(uintptr_t)instance->instance;\n' - funcs += ' }\n' - elif 'SetDebugUtilsObjectTag' in ext_cmd.name: - funcs += ' VkDebugUtilsObjectTagInfoEXT local_tag_info;\n' - funcs += ' memcpy(&local_tag_info, pTagInfo, sizeof(VkDebugUtilsObjectTagInfoEXT));\n' - funcs += ' // If this is a physical device, we have to replace it with the proper one for the next call.\n' - funcs += ' if (pTagInfo->objectType == VK_OBJECT_TYPE_PHYSICAL_DEVICE) {\n' - funcs += ' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pTagInfo->objectHandle;\n' - funcs += ' local_tag_info.objectHandle = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n' - funcs += ' }\n' - funcs += ' if (pTagInfo->objectType == VK_OBJECT_TYPE_INSTANCE) {\n' - funcs += ' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pTagInfo->objectHandle;\n' - funcs += ' local_tag_info.objectHandle = (uint64_t)(uintptr_t)instance->instance;\n' - funcs += ' }\n' - - if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES: - funcs += ' if (disp->' + base_name + ' != NULL) {\n' - funcs += ' ' - funcs += return_prefix - if ext_cmd.handle_type == 'VkInstance': - funcs += 'inst->' - funcs += 'disp->' - funcs += base_name - funcs += '(' + out.append(' const VkLayerDispatchTable *disp = loader_get_dispatch(') + out.append(command.params[0].name) + out.append(');\n') + out.append(' if (NULL == disp) {\n') + out.append(' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n') + out.append(f' "{command.name}: Invalid {command.params[0].name} "\n') + out.append(f' "[VUID-{command.name}-{command.params[0].name}-parameter]");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + + if 'DebugMarkerSetObjectName' in command.name: + out.append(' VkDebugMarkerObjectNameInfoEXT local_name_info;\n') + out.append(' memcpy(&local_name_info, pNameInfo, sizeof(VkDebugMarkerObjectNameInfoEXT));\n') + out.append(' // If this is a physical device, we have to replace it with the proper one for the next call.\n') + out.append(' if (pNameInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT) {\n') + out.append(' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pNameInfo->object;\n') + out.append(' local_name_info.object = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n') + out.append(' }\n') + out.append(' if (pNameInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT) {\n') + out.append(' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pNameInfo->object;\n') + out.append(' local_name_info.object = (uint64_t)(uintptr_t)instance->instance;\n') + out.append(' }\n') + elif 'DebugMarkerSetObjectTag' in command.name: + out.append(' VkDebugMarkerObjectTagInfoEXT local_tag_info;\n') + out.append(' memcpy(&local_tag_info, pTagInfo, sizeof(VkDebugMarkerObjectTagInfoEXT));\n') + out.append(' // If this is a physical device, we have to replace it with the proper one for the next call.\n') + out.append(' if (pTagInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT) {\n') + out.append(' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pTagInfo->object;\n') + out.append(' local_tag_info.object = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n') + out.append(' }\n') + out.append(' if (pTagInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT) {\n') + out.append(' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pTagInfo->object;\n') + out.append(' local_tag_info.object = (uint64_t)(uintptr_t)instance->instance;\n') + out.append(' }\n') + elif 'SetDebugUtilsObjectName' in command.name: + out.append(' VkDebugUtilsObjectNameInfoEXT local_name_info;\n') + out.append(' memcpy(&local_name_info, pNameInfo, sizeof(VkDebugUtilsObjectNameInfoEXT));\n') + out.append(' // If this is a physical device, we have to replace it with the proper one for the next call.\n') + out.append(' if (pNameInfo->objectType == VK_OBJECT_TYPE_PHYSICAL_DEVICE) {\n') + out.append(' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pNameInfo->objectHandle;\n') + out.append(' local_name_info.objectHandle = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n') + out.append(' }\n') + out.append(' if (pNameInfo->objectType == VK_OBJECT_TYPE_INSTANCE) {\n') + out.append(' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pNameInfo->objectHandle;\n') + out.append(' local_name_info.objectHandle = (uint64_t)(uintptr_t)instance->instance;\n') + out.append(' }\n') + elif 'SetDebugUtilsObjectTag' in command.name: + out.append(' VkDebugUtilsObjectTagInfoEXT local_tag_info;\n') + out.append(' memcpy(&local_tag_info, pTagInfo, sizeof(VkDebugUtilsObjectTagInfoEXT));\n') + out.append(' // If this is a physical device, we have to replace it with the proper one for the next call.\n') + out.append(' if (pTagInfo->objectType == VK_OBJECT_TYPE_PHYSICAL_DEVICE) {\n') + out.append(' struct loader_physical_device_tramp *phys_dev_tramp = (struct loader_physical_device_tramp *)(uintptr_t)pTagInfo->objectHandle;\n') + out.append(' local_tag_info.objectHandle = (uint64_t)(uintptr_t)phys_dev_tramp->phys_dev;\n') + out.append(' }\n') + out.append(' if (pTagInfo->objectType == VK_OBJECT_TYPE_INSTANCE) {\n') + out.append(' struct loader_instance* instance = (struct loader_instance *)(uintptr_t)pTagInfo->objectHandle;\n') + out.append(' local_tag_info.objectHandle = (uint64_t)(uintptr_t)instance->instance;\n') + out.append(' }\n') + + if command.extensions[0].name in NULL_CHECK_EXT_NAMES: + out.append(' if (disp->' + base_name + ' != NULL) {\n') + out.append(' ') + out.append(return_prefix) + if command.params[0].type == 'VkInstance': + out.append('inst->') + out.append('disp->') + out.append(base_name) + out.append('(') count = 0 - for param in ext_cmd.params: + for param in command.params: if count != 0: - funcs += ', ' + out.append(', ') if param.type == 'VkPhysicalDevice': - funcs += 'unwrapped_phys_dev' - elif ('DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name) and param.name == 'pNameInfo': - funcs += '&local_name_info' - elif ('DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name) and param.name == 'pTagInfo': - funcs += '&local_tag_info' + out.append('unwrapped_phys_dev') + elif ('DebugMarkerSetObject' in command.name or 'SetDebugUtilsObject' in command.name) and param.name == 'pNameInfo': + out.append('&local_name_info') + elif ('DebugMarkerSetObject' in command.name or 'SetDebugUtilsObject' in command.name) and param.name == 'pTagInfo': + out.append('&local_tag_info') else: - funcs += param.name + out.append(param.name) count += 1 - funcs += ');\n' - if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES: - if ext_cmd.return_type is not None: - funcs += ' } else {\n' - funcs += ' return VK_SUCCESS;\n' - funcs += ' }\n' - funcs += '}\n\n' - - funcs += term_header - if ext_cmd.handle_type == 'VkPhysicalDevice': - funcs += f' struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *){phys_dev_var_name};\n' - funcs += ' struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;\n' - funcs += ' if (NULL == icd_term->dispatch.' - funcs += base_name - funcs += ') {\n' - fatal_error_bit = '' if ext_cmd.ext_type =='instance' and has_return_type else 'VULKAN_LOADER_FATAL_ERROR_BIT | ' - funcs += f' loader_log(icd_term->this_instance, {fatal_error_bit}VULKAN_LOADER_ERROR_BIT, 0,\n' - funcs += ' "ICD associated with VkPhysicalDevice does not support ' - funcs += base_name - funcs += '");\n' + out.append(');\n') + if command.extensions[0].name in NULL_CHECK_EXT_NAMES: + if command.returnType != 'void': + out.append(' } else {\n') + out.append(' return VK_SUCCESS;\n') + out.append(' }\n') + out.append('}\n\n') + + out.append(term_header) + if command.params[0].type == 'VkPhysicalDevice': + out.append(f' struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *){phys_dev_var_name};\n') + out.append(' struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;\n') + out.append(' if (NULL == icd_term->dispatch.') + out.append(base_name) + out.append(') {\n') + fatal_error_bit = '' if has_return_type and (len(command.extensions) == 0 or command.extensions[0].instance) else 'VULKAN_LOADER_FATAL_ERROR_BIT | ' + out.append(f' loader_log(icd_term->this_instance, {fatal_error_bit}VULKAN_LOADER_ERROR_BIT, 0,\n') + out.append(' "ICD associated with VkPhysicalDevice does not support ') + out.append(base_name) + out.append('");\n') # If this is an instance function taking a physical device (i.e. pre Vulkan 1.1), we need to behave and not crash so return an # error here. - if ext_cmd.ext_type =='instance' and has_return_type: - funcs += ' return VK_ERROR_EXTENSION_NOT_PRESENT;\n' + if has_return_type and (len(command.extensions) == 0 or command.extensions[0].instance): + out.append(' return VK_ERROR_EXTENSION_NOT_PRESENT;\n') else: - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') if has_surface == 1: - funcs += ' VkIcdSurface *icd_surface = NULL;\n' - funcs += f' if (NULL != {surface_var_name}) {{\n' - funcs += f' icd_surface = (VkIcdSurface *)(uintptr_t)({surface_var_name});\n' - funcs += ' }\n' - funcs += ' if (NULL != icd_surface && NULL != icd_term->surface_list.list && icd_term->surface_list.capacity > icd_surface->surface_index * sizeof(VkSurfaceKHR) && icd_term->surface_list[icd_surface->surface_index]) {\n' + out.append(' VkIcdSurface *icd_surface = NULL;\n') + out.append(f' if (NULL != {surface_var_name}) {{\n') + out.append(f' icd_surface = (VkIcdSurface *)(uintptr_t)({surface_var_name});\n') + out.append(' }\n') + out.append(' if (NULL != icd_surface && NULL != icd_term->surface_list.list && icd_term->surface_list.capacity > icd_surface->surface_index * sizeof(VkSurfaceKHR) && icd_term->surface_list[icd_surface->surface_index]) {\n') # If there's a structure with a surface, we need to update its internals with the correct surface for the ICD if update_structure_surface == 1: - funcs += update_structure_string + out.append(update_structure_string) - funcs += ' ' + return_prefix + 'icd_term->dispatch.' - funcs += base_name - funcs += '(' + out.append(' ' + return_prefix + 'icd_term->dispatch.') + out.append(base_name) + out.append('(') count = 0 - for param in ext_cmd.params: + for param in command.params: if count != 0: - funcs += ', ' + out.append(', ') if not always_use_param_name: if surface_type_to_replace and surface_type_to_replace == param.type: - funcs += surface_name_replacement + out.append(surface_name_replacement) elif physdev_type_to_replace and physdev_type_to_replace == param.type: - funcs += physdev_name_replacement + out.append(physdev_name_replacement) else: - funcs += param.name + out.append(param.name) else: - funcs += param.name + out.append(param.name) count += 1 - funcs += ');\n' + out.append(');\n') if not has_return_type: - funcs += ' return;\n' - funcs += ' }\n' + out.append(' return;\n') + out.append(' }\n') - funcs += return_prefix - funcs += 'icd_term->dispatch.' - funcs += base_name - funcs += '(' + out.append(return_prefix) + out.append('icd_term->dispatch.') + out.append(base_name) + out.append('(') count = 0 - for param in ext_cmd.params: + for param in command.params: if count != 0: - funcs += ', ' + out.append(', ') if param.type == 'VkPhysicalDevice': - funcs += 'phys_dev_term->phys_dev' + out.append('phys_dev_term->phys_dev') else: - funcs += param.name + out.append(param.name) count += 1 - funcs += ');\n' - - - elif ext_cmd.handle_type == 'VkInstance': - funcs += f' struct loader_instance *inst = loader_get_instance({instance_var_name});\n' - funcs += ' if (NULL == inst) {\n' - funcs += ' loader_log(\n' - funcs += ' NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n' - funcs += f' "{ext_cmd.name}: Invalid instance [VUID-{ext_cmd.name}-{instance_var_name}-parameter]");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - funcs += '#error("Not implemented. Likely needs to be manually generated!");\n' - elif ext_cmd.ext_name in ['VK_EXT_debug_utils', 'VK_EXT_debug_marker']: - if ext_cmd.name in ['vkDebugMarkerSetObjectNameEXT', 'vkDebugMarkerSetObjectTagEXT', 'vkSetDebugUtilsObjectNameEXT' , 'vkSetDebugUtilsObjectTagEXT']: - - is_debug_utils = ext_cmd.ext_name == "VK_EXT_debug_utils" - debug_struct_name = ext_cmd.params[1].name - local_struct = 'local_name_info' if 'ObjectName' in ext_cmd.name else 'local_tag_info' + out.append(');\n') + + + elif command.params[0].type == 'VkInstance': + out.append(f' struct loader_instance *inst = loader_get_instance({instance_var_name});\n') + out.append(' if (NULL == inst) {\n') + out.append(' loader_log(\n') + out.append(' NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n') + out.append(f' "{command.name}: Invalid instance [VUID-{command.name}-{instance_var_name}-parameter]");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + out.append('#error("Not implemented. Likely needs to be manually generated!");\n') + elif command.extensions[0].name in ['VK_EXT_debug_utils', 'VK_EXT_debug_marker']: + if command.name in ['vkDebugMarkerSetObjectNameEXT', 'vkDebugMarkerSetObjectTagEXT', 'vkSetDebugUtilsObjectNameEXT' , 'vkSetDebugUtilsObjectTagEXT']: + + is_debug_utils = command.extensions[0].name == "VK_EXT_debug_utils" + debug_struct_name = command.params[1].name + local_struct = 'local_name_info' if 'ObjectName' in command.name else 'local_tag_info' member_name = 'objectHandle' if is_debug_utils else 'object' phys_dev_check = 'VK_OBJECT_TYPE_PHYSICAL_DEVICE' if is_debug_utils else 'VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT' surf_check = 'VK_OBJECT_TYPE_SURFACE_KHR' if is_debug_utils else 'VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT' inst_check = 'VK_OBJECT_TYPE_INSTANCE' if is_debug_utils else 'VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT' - funcs += ' struct loader_device *dev;\n' - funcs += f' struct loader_icd_term *icd_term = loader_get_icd_and_device({ ext_cmd.params[0].name}, &dev);\n' - funcs += ' if (NULL == icd_term || NULL == dev) {\n' - funcs += f' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, "{ext_cmd.name[2:]}: Invalid device handle");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - funcs += f' { ext_cmd.params[1].type} {local_struct};\n' - funcs += f' memcpy(&{local_struct}, {debug_struct_name}, sizeof({ ext_cmd.params[1].type}));\n' - funcs += ' // If this is a physical device, we have to replace it with the proper one for the next call.\n' - funcs += f' if ({debug_struct_name}->objectType == {phys_dev_check}) {{\n' - funcs += f' struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t){debug_struct_name}->{member_name};\n' - funcs += f' {local_struct}.{member_name} = (uint64_t)(uintptr_t)phys_dev_term->phys_dev;\n' - funcs += ' // If this is a KHR_surface, and the ICD has created its own, we have to replace it with the proper one for the next call.\n' - funcs += f' }} else if ({debug_struct_name}->objectType == {surf_check}) {{\n' - funcs += ' if (NULL != dev && NULL != dev->loader_dispatch.core_dispatch.CreateSwapchainKHR) {\n' - funcs += f' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t){debug_struct_name}->{member_name};\n' - funcs += ' if (NULL != icd_term->surface_list.list && icd_term->surface_list.capacity > icd_surface->surface_index * sizeof(VkSurfaceKHR)\n' - funcs += ' && icd_term->surface_list.list[icd_surface->surface_index]) {\n' - funcs += f' {local_struct}.{member_name} = (uint64_t)icd_term->surface_list.list[icd_surface->surface_index];\n' - funcs += ' }\n' - funcs += ' }\n' - funcs += ' // If this is an instance we have to replace it with the proper one for the next call.\n' - funcs += f' }} else if ({debug_struct_name}->objectType == {inst_check}) {{\n' - funcs += f' {local_struct}.{member_name} = (uint64_t)(uintptr_t)icd_term->instance;\n' - funcs += ' }\n' - funcs += ' // Exit early if the driver does not support the function - this can happen as a layer or the loader itself supports\n' - funcs += ' // debug utils but the driver does not.\n' - funcs += f' if (NULL == dev->loader_dispatch.extension_terminator_dispatch.{ext_cmd.name[2:]})\n return VK_SUCCESS;\n' + out.append(' struct loader_device *dev;\n') + out.append(f' struct loader_icd_term *icd_term = loader_get_icd_and_device({ command.params[0].name}, &dev);\n') + out.append(' if (NULL == icd_term || NULL == dev) {\n') + out.append(f' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, "{command.name[2:]}: Invalid device handle");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + out.append(f' { command.params[1].type} {local_struct};\n') + out.append(f' memcpy(&{local_struct}, {debug_struct_name}, sizeof({ command.params[1].type}));\n') + out.append(' // If this is a physical device, we have to replace it with the proper one for the next call.\n') + out.append(f' if ({debug_struct_name}->objectType == {phys_dev_check}) {{\n') + out.append(f' struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t){debug_struct_name}->{member_name};\n') + out.append(f' {local_struct}.{member_name} = (uint64_t)(uintptr_t)phys_dev_term->phys_dev;\n') + out.append(' // If this is a KHR_surface, and the ICD has created its own, we have to replace it with the proper one for the next call.\n') + out.append(f' }} else if ({debug_struct_name}->objectType == {surf_check}) {{\n') + out.append(' if (NULL != dev && NULL != dev->loader_dispatch.core_dispatch.CreateSwapchainKHR) {\n') + out.append(f' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t){debug_struct_name}->{member_name};\n') + out.append(' if (NULL != icd_term->surface_list.list && icd_term->surface_list.capacity > icd_surface->surface_index * sizeof(VkSurfaceKHR)\n') + out.append(' && icd_term->surface_list.list[icd_surface->surface_index]) {\n') + out.append(f' {local_struct}.{member_name} = (uint64_t)icd_term->surface_list.list[icd_surface->surface_index];\n') + out.append(' }\n') + out.append(' }\n') + out.append(' // If this is an instance we have to replace it with the proper one for the next call.\n') + out.append(f' }} else if ({debug_struct_name}->objectType == {inst_check}) {{\n') + out.append(f' {local_struct}.{member_name} = (uint64_t)(uintptr_t)icd_term->instance;\n') + out.append(' }\n') + out.append(' // Exit early if the driver does not support the function - this can happen as a layer or the loader itself supports\n') + out.append(' // debug utils but the driver does not.\n') + out.append(f' if (NULL == dev->loader_dispatch.extension_terminator_dispatch.{command.name[2:]})\n return VK_SUCCESS;\n') dispatch = 'dev->loader_dispatch.' else: - funcs += f' struct loader_dev_dispatch_table *dispatch_table = loader_get_dev_dispatch({ext_cmd.params[0].name});\n' - funcs += ' if (NULL == dispatch_table) {\n' - funcs += f' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, "{ext_cmd.ext_name}: Invalid device handle");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - funcs += ' // Only call down if the device supports the function\n' - funcs += f' if (NULL != dispatch_table->extension_terminator_dispatch.{base_name})\n ' + out.append(f' struct loader_dev_dispatch_table *dispatch_table = loader_get_dev_dispatch({command.params[0].name});\n') + out.append(' if (NULL == dispatch_table) {\n') + out.append(f' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, "{command.extensions[0].name}: Invalid device handle");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + out.append(' // Only call down if the device supports the function\n') + out.append(f' if (NULL != dispatch_table->extension_terminator_dispatch.{base_name})\n ') dispatch = 'dispatch_table->' - funcs += ' ' + out.append(' ') if has_return_type: - funcs += 'return ' - funcs += f'{dispatch}extension_terminator_dispatch.{base_name}(' + out.append('return ') + out.append(f'{dispatch}extension_terminator_dispatch.{base_name}(') count = 0 - for param in ext_cmd.params: + for param in command.params: if count != 0: - funcs += ', ' + out.append(', ') if param.type == 'VkPhysicalDevice': - funcs += 'phys_dev_term->phys_dev' + out.append('phys_dev_term->phys_dev') elif param.type == 'VkSurfaceKHR': - funcs += 'icd_term->surface_list[icd_surface->surface_index]' - elif ('DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name) and param.name == 'pNameInfo': - funcs += '&local_name_info' - elif ('DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name) and param.name == 'pTagInfo': - funcs += '&local_tag_info' + out.append('icd_term->surface_list[icd_surface->surface_index]') + elif ('DebugMarkerSetObject' in command.name or 'SetDebugUtilsObject' in command.name) and param.name == 'pNameInfo': + out.append('&local_name_info') + elif ('DebugMarkerSetObject' in command.name or 'SetDebugUtilsObject' in command.name) and param.name == 'pTagInfo': + out.append('&local_tag_info') else: - funcs += param.name + out.append(param.name) count += 1 - funcs += ');\n' + out.append(');\n') else: - funcs += '#error("Unknown error path!");\n' + out.append('#error("Unknown error path!");\n') - funcs += '}\n\n' + out.append('}\n\n') else: - funcs += tramp_header - - funcs += ' const VkLayerDispatchTable *disp = loader_get_dispatch(' - funcs += ext_cmd.params[0].name - funcs += ');\n' - funcs += ' if (NULL == disp) {\n' - funcs += ' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n' - funcs += f' "{ext_cmd.name}: Invalid {ext_cmd.params[0].name} "\n' - funcs += f' "[VUID-{ext_cmd.name}-{ext_cmd.params[0].name}-parameter]");\n' - funcs += ' abort(); /* Intentionally fail so user can correct issue. */\n' - funcs += ' }\n' - - if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES: - funcs += ' if (disp->' + base_name + ' != NULL) {\n' - funcs += ' ' - funcs += return_prefix - funcs += 'disp->' - funcs += base_name - funcs += '(' + out.append(tramp_header) + + out.append(' const VkLayerDispatchTable *disp = loader_get_dispatch(') + out.append(command.params[0].name) + out.append(');\n') + out.append(' if (NULL == disp) {\n') + out.append(' loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,\n') + out.append(f' "{command.name}: Invalid {command.params[0].name} "\n') + out.append(f' "[VUID-{command.name}-{command.params[0].name}-parameter]");\n') + out.append(' abort(); /* Intentionally fail so user can correct issue. */\n') + out.append(' }\n') + + if command.extensions[0].name in NULL_CHECK_EXT_NAMES: + out.append(' if (disp->' + base_name + ' != NULL) {\n') + out.append(' ') + out.append(return_prefix) + out.append('disp->') + out.append(base_name) + out.append('(') count = 0 - for param in ext_cmd.params: + for param in command.params: if count != 0: - funcs += ', ' - funcs += param.name + out.append(', ') + out.append(param.name) count += 1 - funcs += ');\n' - if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES: - if ext_cmd.return_type is not None: - funcs += ' } else {\n' - funcs += ' return VK_SUCCESS;\n' - funcs += ' }\n' - funcs += '}\n\n' + out.append(');\n') + if command.extensions[0].name in NULL_CHECK_EXT_NAMES: + if command.returnType != 'void': + out.append(' } else {\n') + out.append(' return VK_SUCCESS;\n') + out.append(' }\n') + out.append('}\n\n') - if ext_cmd.protect is not None: - funcs += f'#endif // {ext_cmd.protect}\n' + if command.protect is not None: + out.append(f'#endif // {command.protect}\n') - return funcs # # Create a function for the extension GPA call - def InstExtensionGPA(self): - gpa_func = '' + def InstExtensionGPA(self, out): cur_extension_name = '' - gpa_func += '// GPA helpers for extensions\n' - gpa_func += 'bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr) {\n' - gpa_func += ' *addr = NULL;\n\n' + out.append( '// GPA helpers for extensions\n') + out.append( 'bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *name, void **addr) {\n') + out.append( ' *addr = NULL;\n\n') - for cur_cmd in self.ext_commands: - if (self.getAPIVersion(cur_cmd.ext_name) or - cur_cmd.ext_name in WSI_EXT_NAMES or - cur_cmd.ext_name in AVOID_EXT_NAMES or - cur_cmd.name in AVOID_CMD_NAMES ): + for command in [x for x in self.vk.commands.values() if x.extensions]: + if (command.version or + command.extensions[0].name in WSI_EXT_NAMES or + command.extensions[0].name in AVOID_EXT_NAMES or + command.name in AVOID_CMD_NAMES ): continue - if cur_cmd.ext_name != cur_extension_name: - gpa_func += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name - - if cur_cmd.protect is not None: - gpa_func += f'#if defined({cur_cmd.protect})\n' - - #base_name = cur_cmd.name[2:] - base_name = SHARED_ALIASES[cur_cmd.name] if cur_cmd.name in SHARED_ALIASES else cur_cmd.name[2:] - - if cur_cmd.ext_type == 'instance': - gpa_func += f' if (!strcmp("{cur_cmd.name}", name)) {{\n' - gpa_func += ' *addr = (ptr_instance->enabled_known_extensions.' - gpa_func += cur_cmd.ext_name[3:].lower() - gpa_func += ' == 1)\n' - gpa_func += f' ? (void *){base_name}\n' - gpa_func += ' : NULL;\n' - gpa_func += ' return true;\n' - gpa_func += ' }\n' + if command.extensions[0].name != cur_extension_name: + out.append( f'\n // ---- {command.extensions[0].name} extension commands\n') + cur_extension_name = command.extensions[0].name + + if command.protect is not None: + out.append( f'#if defined({command.protect})\n') + + #base_name = command.name[2:] + base_name = SHARED_ALIASES[command.name] if command.name in SHARED_ALIASES else command.name[2:] + + if len(command.extensions) > 0 and command.extensions[0].instance: + out.append( f' if (!strcmp("{command.name}", name)) {{\n') + out.append( ' *addr = (ptr_instance->enabled_known_extensions.') + out.append( command.extensions[0].name[3:].lower()) + out.append( ' == 1)\n') + out.append( f' ? (void *){base_name}\n') + out.append( ' : NULL;\n') + out.append( ' return true;\n') + out.append( ' }\n') else: - gpa_func += f' if (!strcmp("{cur_cmd.name}", name)) {{\n' - gpa_func += f' *addr = (void *){base_name};\n' - gpa_func += ' return true;\n' - gpa_func += ' }\n' + out.append( f' if (!strcmp("{command.name}", name)) {{\n') + out.append( f' *addr = (void *){base_name};\n') + out.append( ' return true;\n') + out.append( ' }\n') + + if command.protect is not None: + out.append( f'#endif // {command.protect}\n') - if cur_cmd.protect is not None: - gpa_func += f'#endif // {cur_cmd.protect}\n' + out.append( ' return false;\n') + out.append( '}\n\n') - gpa_func += ' return false;\n' - gpa_func += '}\n\n' - return gpa_func # # Create the extension name init function - def InstantExtensionCreate(self): - entries = [] - entries = self.instanceExtensions - count = 0 - cur_extension_name = '' + def InstantExtensionCreate(self, out): - create_func = '' - create_func += '// A function that can be used to query enabled extensions during a vkCreateInstance call\n' - create_func += 'void extensions_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo) {\n' - create_func += ' for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {\n' - for ext in entries: - if (self.getAPIVersion(ext.name) or ext.name in WSI_EXT_NAMES or - ext.name in AVOID_EXT_NAMES or ext.name in AVOID_CMD_NAMES or - ext.type == 'device' or ext.num_commands == 0): + out.append( '// A function that can be used to query enabled extensions during a vkCreateInstance call\n') + out.append( 'void extensions_create_instance(struct loader_instance *ptr_instance, const VkInstanceCreateInfo *pCreateInfo) {\n') + out.append( ' for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {\n') + e = '' + cur_extension_name = '' + for extension in [x for x in self.vk.extensions.values() if x.instance and len(x.commands) > 0]: + if extension.name in WSI_EXT_NAMES or extension.name in AVOID_EXT_NAMES or extension.name in AVOID_CMD_NAMES: continue - if ext.name != cur_extension_name: - create_func += f'\n // ---- {ext.name} extension commands\n' - cur_extension_name = ext.name + if extension.name != cur_extension_name: + out.append( f'\n // ---- {extension.name} extension commands\n') + cur_extension_name = extension.name - if ext.protect is not None: - create_func += f'#if defined({ext.protect})\n' - if count == 0: - create_func += ' if (0 == strcmp(pCreateInfo->ppEnabledExtensionNames[i], ' - else: - create_func += ' } else if (0 == strcmp(pCreateInfo->ppEnabledExtensionNames[i], ' + if extension.protect is not None: + out.append( f'#if defined({extension.protect})\n') + + out.append(f' {e}if (0 == strcmp(pCreateInfo->ppEnabledExtensionNames[i], ') + e = '} else ' - create_func += ext.define + ')) {\n' - create_func += ' ptr_instance->enabled_known_extensions.' - create_func += ext.name[3:].lower() - create_func += ' = 1;\n' + out.append( extension.nameString + ')) {\n') + out.append( ' ptr_instance->enabled_known_extensions.') + out.append( extension.name[3:].lower()) + out.append( ' = 1;\n') - if ext.protect is not None: - create_func += f'#endif // {ext.protect}\n' - count += 1 + if extension.protect is not None: + out.append( f'#endif // {extension.protect}\n') + + out.append( ' }\n') + out.append( ' }\n') + out.append( '}\n\n') - create_func += ' }\n' - create_func += ' }\n' - create_func += '}\n\n' - return create_func # - # Create code to initialize a dispatch table from the appropriate list of - # extension entrypoints and return it as a string - def DeviceExtensionGetTerminator(self): - term_func = '' - - term_func += '// Some device commands still need a terminator because the loader needs to unwrap something about them.\n' - term_func += '// In many cases, the item needing unwrapping is a VkPhysicalDevice or VkSurfaceKHR object. But there may be other items\n' - term_func += '// in the future.\n' - term_func += 'PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *name, bool* found_name) {\n' - term_func += ''' *found_name = false; + # Create code to initialize a dispatch table from the appropriate list of extension entrypoints + def DeviceExtensionGetTerminator(self, out): + out.append('// Some device commands still need a terminator because the loader needs to unwrap something about them.\n') + out.append('// In many cases, the item needing unwrapping is a VkPhysicalDevice or VkSurfaceKHR object. But there may be other items\n') + out.append('// in the future.\n') + out.append('PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *dev, const char *name, bool* found_name) {\n') + out.append(''' *found_name = false; if (!name || name[0] != 'v' || name[1] != 'k') { return NULL; } name += 2; -''' +''') last_protect = None last_ext = None - for ext_cmd in self.ext_commands: - version = self.getAPIVersion(ext_cmd.ext_name) - if ext_cmd.name in DEVICE_CMDS_NEED_TERM: + for command in [x for x in self.vk.commands.values() if x.extensions]: + version = command.version + if command.name in DEVICE_CMDS_NEED_TERM: if version: - term_func += f' // ---- Core {version.name} commands\n' - else: - last_protect = ext_cmd.protect - if ext_cmd.protect is not None: - term_func += f'#if defined({ext_cmd.protect})\n' - if last_ext != ext_cmd.ext_name: - term_func += f' // ---- {ext_cmd.ext_name} extension commands\n' - last_ext = ext_cmd.ext_name - - term_func += f' if (!strcmp(name, "{ext_cmd.name[2:]}")) {{\n' - term_func += ' *found_name = true;\n' - if ext_cmd.require: - dep_expr = self.ConvertDependencyExpression(ext_cmd.require, lambda ext_name: f'dev->driver_extensions.{ext_name[3:].lower()}_enabled') - term_func += f' return (dev->driver_extensions.{ext_cmd.ext_name[3:].lower()}_enabled && ({dep_expr})) ?\n' + out.append(f' // ---- Core {version.name} commands\n') else: - term_func += f' return dev->driver_extensions.{ext_cmd.ext_name[3:].lower()}_enabled ?\n' - term_func += f' (PFN_vkVoidFunction)terminator_{(ext_cmd.name[2:])} : NULL;\n' - term_func += ' }\n' - - if last_protect is not None: - term_func += f'#endif // {last_protect}\n' - - term_func += ' return NULL;\n' - term_func += '}\n\n' - - return term_func - - # - # Create a dispatch table solely for device functions which have custom terminators - def OutputDeviceFunctionTerminatorDispatchTable(self): - term_func = '' - term_func += '// Functions that required a terminator need to have a separate dispatch table which contains their corresponding\n' - term_func += '// device function. This is used in the terminators themselves.\n' - term_func += 'struct loader_device_terminator_dispatch {\n' - - last_protect = None - last_ext = None - for ext_cmd in self.ext_commands: - version = self.getAPIVersion(ext_cmd.ext_name) - if ext_cmd.name in DEVICE_CMDS_NEED_TERM: - if version: - term_func += f' // ---- Core {version.name} commands\n' + last_protect = command.protect + if command.protect is not None: + out.append(f'#if defined({command.protect})\n') + if last_ext != command.extensions[0].name: + out.append(f' // ---- {command.extensions[0].name} extension commands\n') + last_ext = command.extensions[0].name + + out.append(f' if (!strcmp(name, "{command.name[2:]}")) {{\n') + out.append(' *found_name = true;\n') + if command.name == 'vkGetDeviceGroupSurfacePresentModes2EXT': # command.extensions[0].depends in [x for x in self.vk.commands.values() if x.device]: + # Hardcode the dependency expression as vulkan_object.py doesn't expose this information + dep_expr = self.ConvertDependencyExpression('VK_KHR_device_group,VK_VERSION_1_1', lambda ext_name: f'dev->driver_extensions.{ext_name[3:].lower()}_enabled') + out.append(f' return (dev->driver_extensions.{command.extensions[0].name[3:].lower()}_enabled && ({dep_expr})) ?\n') else: - last_protect = ext_cmd.protect - if ext_cmd.protect is not None: - term_func += f'#if defined({ext_cmd.protect})\n' - if last_ext != ext_cmd.ext_name: - term_func += f' // ---- {ext_cmd.ext_name} extension commands\n' - last_ext = ext_cmd.ext_name - - term_func += f' PFN_{ext_cmd.name} {ext_cmd.name[2:]};\n' + out.append(f' return dev->driver_extensions.{command.extensions[0].name[3:].lower()}_enabled ?\n') + out.append(f' (PFN_vkVoidFunction)terminator_{(command.name[2:])} : NULL;\n') + out.append(' }\n') if last_protect is not None: - term_func += f'#endif // {last_protect}\n' + out.append(f'#endif // {last_protect}\n') - term_func += '};\n\n' + out.append(' return NULL;\n') + out.append('}\n\n') - return term_func - def OutputDeviceFunctionTrampolinePrototypes(self): - tramp_protos = '' - tramp_protos += '// These are prototypes for functions that need their trampoline called in all circumstances.\n' - tramp_protos += '// They are used in loader_lookup_device_dispatch_table but are defined afterwards.\n' - last_protect = None - last_ext = None - for ext_cmd in self.ext_commands: - version = self.getAPIVersion(ext_cmd.ext_name) - if ext_cmd.name in DEVICE_CMDS_MUST_USE_TRAMP: - if version: - tramp_protos += f' // ---- Core {version.name} commands\n' - else: - last_protect = ext_cmd.protect - if ext_cmd.protect is not None: - tramp_protos += f'#if defined({ext_cmd.protect})\n' - if last_ext != ext_cmd.ext_name: - tramp_protos += f' // ---- {ext_cmd.ext_name} extension commands\n' - last_ext = ext_cmd.ext_name - - tramp_protos += f'{ext_cmd.cdecl.replace("VKAPI_CALL vk", "VKAPI_CALL ")}\n' - - if last_protect is not None: - tramp_protos += f'#endif // {last_protect}\n' - tramp_protos += '\n' - return tramp_protos # - # Create code to initialize a dispatch table from the appropriate list of - # extension entrypoints and return it as a string - def InitDeviceFunctionTerminatorDispatchTable(self): - term_func = '' - - term_func += '// Functions that required a terminator need to have a separate dispatch table which contains their corresponding\n' - term_func += '// device function. This is used in the terminators themselves.\n' - term_func += 'void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) {\n' - term_func += ' struct loader_device_terminator_dispatch* dispatch = &dev->loader_dispatch.extension_terminator_dispatch;\n' - term_func += ' PFN_vkGetDeviceProcAddr gpda = (PFN_vkGetDeviceProcAddr)dev->phys_dev_term->this_icd_term->dispatch.GetDeviceProcAddr;\n' - last_protect = None - last_ext = None - for ext_cmd in self.ext_commands: - version = self.getAPIVersion(ext_cmd.ext_name) - if ext_cmd.name in DEVICE_CMDS_NEED_TERM: - if version: - term_func += f' // ---- Core {version.name} commands\n' - else: - last_protect = ext_cmd.protect - if ext_cmd.protect is not None: - term_func += f'#if defined({ext_cmd.protect})\n' - if last_ext != ext_cmd.ext_name: - term_func += f' // ---- {ext_cmd.ext_name} extension commands\n' - last_ext = ext_cmd.ext_name - - - if ext_cmd.require: - dep_expr = self.ConvertDependencyExpression(ext_cmd.require, lambda ext_name: f'dev->driver_extensions.{ext_name[3:].lower()}_enabled') - term_func += f' if (dev->driver_extensions.{ext_cmd.ext_name[3:].lower()}_enabled && ({dep_expr}))\n' - term_func += f' dispatch->{ext_cmd.name[2:]} = (PFN_{(ext_cmd.name)})gpda(dev->icd_device, "{(ext_cmd.name)}");\n' - else: - term_func += f' if (dev->driver_extensions.{ext_cmd.ext_name[3:].lower()}_enabled)\n' - term_func += f' dispatch->{ext_cmd.name[2:]} = (PFN_{(ext_cmd.name)})gpda(dev->icd_device, "{(ext_cmd.name)}");\n' - - if last_protect is not None: - term_func += f'#endif // {last_protect}\n' - - term_func += '}\n\n' - - return term_func - - # - # Create code to initialize a dispatch table from the appropriate list of - # core and extension entrypoints and return it as a string - def InitInstLoaderExtensionDispatchTable(self): + # Create code to initialize a dispatch table from the appropriate list of core and extension entrypoints + def InitInstLoaderExtensionDispatchTable(self, out): commands = [] - table = '' - cur_extension_name = '' - table += '// This table contains the loader\'s instance dispatch table, which contains\n' - table += '// default functions if no instance layers are activated. This contains\n' - table += '// pointers to "terminator functions".\n' - table += 'const VkLayerInstanceDispatchTable instance_disp = {\n' + out.append( '// This table contains the loader\'s instance dispatch table, which contains\n') + out.append( '// default functions if no instance layers are activated. This contains\n') + out.append( '// pointers to "terminator functions".\n') + out.append( 'const VkLayerInstanceDispatchTable instance_disp = {\n') - for x in range(0, 2): - if x == 0: - commands = self.core_commands - else: - commands = self.ext_commands - - for cur_cmd in commands: - version = self.getAPIVersion(cur_cmd.ext_name) - if cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice': - if cur_cmd.ext_name != cur_extension_name: - if version: - table += f'\n // ---- Core {version.name} commands\n' - else: - table += f'\n // ---- {cur_cmd.ext_name} extension commands\n' - cur_extension_name = cur_cmd.ext_name + for command_list in [self.core_commands, self.extension_commands]: + commands = command_list + current_block = '' + for command in commands: + if command.params[0].type in ['VkInstance', 'VkPhysicalDevice']: + current_block = self.DescribeBlock(command, current_block, out) # Remove 'vk' from proto name - base_name = cur_cmd.name[2:] - aliased_name = SHARED_ALIASES[cur_cmd.name][2:] if cur_cmd.name in SHARED_ALIASES else base_name + base_name = command.name[2:] + aliased_name = SHARED_ALIASES[command.name][2:] if command.name in SHARED_ALIASES else base_name if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or base_name == 'EnumerateInstanceExtensionProperties' or @@ -1734,41 +1317,36 @@ def InitInstLoaderExtensionDispatchTable(self): base_name == 'EnumerateInstanceVersion'): continue - if cur_cmd.protect is not None: - table += f'#if defined({cur_cmd.protect})\n' + if command.protect is not None: + out.append( f'#if defined({command.protect})\n') if base_name == 'GetInstanceProcAddr': - table += f' .{base_name} = {cur_cmd.name},\n' + out.append( f' .{base_name} = {command.name},\n') else: - table += f' .{base_name} = terminator_{aliased_name},\n' + out.append( f' .{base_name} = terminator_{aliased_name},\n') + + if command.protect is not None: + out.append( f'#endif // {command.protect}\n') + out.append( '};\n\n') - if cur_cmd.protect is not None: - table += f'#endif // {cur_cmd.protect}\n' - table += '};\n\n' - return table # # Create the extension name whitelist array - def OutputInstantExtensionWhitelistArray(self): - extensions = self.instanceExtensions - - table = '' - table += '// A null-terminated list of all of the instance extensions supported by the loader.\n' - table += '// If an instance extension name is not in this list, but it is exported by one or more of the\n' - table += '// ICDs detected by the loader, then the extension name not in the list will be filtered out\n' - table += '// before passing the list of extensions to the application.\n' - table += 'const char *const LOADER_INSTANCE_EXTENSIONS[] = {\n' - for ext in extensions: - if ext.type == 'device' or self.getAPIVersion(ext.name): - continue - - if ext.protect is not None: - table += f'#if defined({ext.protect})\n' - table += ' ' - table += ext.define + ',\n' + def OutputInstantExtensionWhitelistArray(self, out): + out.append( '// A null-terminated list of all of the instance extensions supported by the loader.\n') + out.append( '// If an instance extension name is not in this list, but it is exported by one or more of the\n') + out.append( '// ICDs detected by the loader, then the extension name not in the list will be filtered out\n') + out.append( '// before passing the list of extensions to the application.\n') + out.append( 'const char *const LOADER_INSTANCE_EXTENSIONS[] = {\n') + for extension in self.instance_extensions: + + if extension.protect is not None: + out.append( f'#if defined({extension.protect})\n') + out.append( ' ') + out.append( extension.nameString + ',\n') + + if extension.protect is not None: + out.append( f'#endif // {extension.protect}\n') + out.append( ' NULL };\n') - if ext.protect is not None: - table += f'#endif // {ext.protect}\n' - table += ' NULL };\n' - return table diff --git a/tests/framework/layer/vk_dispatch_table_helper.h b/tests/framework/layer/vk_dispatch_table_helper.h index 48b628800..a4d1b7c81 100644 --- a/tests/framework/layer/vk_dispatch_table_helper.h +++ b/tests/framework/layer/vk_dispatch_table_helper.h @@ -1,11 +1,11 @@ #pragma once // *** THIS FILE IS GENERATED - DO NOT EDIT *** -// See dispatch_helper_generator.py for modifications +// See dispatch_table_helper_generator.py for modifications /* - * Copyright (c) 2015-2021 The Khronos Group Inc. - * Copyright (c) 2015-2021 Valve Corporation - * Copyright (c) 2015-2021 LunarG, Inc. + * Copyright (c) 2015-2025 The Khronos Group Inc. + * Copyright (c) 2015-2025 Valve Corporation + * Copyright (c) 2015-2025 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ * Author: Courtney Goeltzenleuchter * Author: Jon Ashburn * Author: Mark Lobodzinski + * Author: Charles Giessen */ #include @@ -51,8 +52,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->BindImageMemory = (PFN_vkBindImageMemory)gpa(device, "vkBindImageMemory"); table->GetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)gpa(device, "vkGetBufferMemoryRequirements"); table->GetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)gpa(device, "vkGetImageMemoryRequirements"); - table->GetImageSparseMemoryRequirements = - (PFN_vkGetImageSparseMemoryRequirements)gpa(device, "vkGetImageSparseMemoryRequirements"); + table->GetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)gpa(device, "vkGetImageSparseMemoryRequirements"); table->QueueBindSparse = (PFN_vkQueueBindSparse)gpa(device, "vkQueueBindSparse"); table->CreateFence = (PFN_vkCreateFence)gpa(device, "vkCreateFence"); table->DestroyFence = (PFN_vkDestroyFence)gpa(device, "vkDestroyFence"); @@ -158,23 +158,19 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdExecuteCommands = (PFN_vkCmdExecuteCommands)gpa(device, "vkCmdExecuteCommands"); table->BindBufferMemory2 = (PFN_vkBindBufferMemory2)gpa(device, "vkBindBufferMemory2"); table->BindImageMemory2 = (PFN_vkBindImageMemory2)gpa(device, "vkBindImageMemory2"); - table->GetDeviceGroupPeerMemoryFeatures = - (PFN_vkGetDeviceGroupPeerMemoryFeatures)gpa(device, "vkGetDeviceGroupPeerMemoryFeatures"); + table->GetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures)gpa(device, "vkGetDeviceGroupPeerMemoryFeatures"); table->CmdSetDeviceMask = (PFN_vkCmdSetDeviceMask)gpa(device, "vkCmdSetDeviceMask"); table->CmdDispatchBase = (PFN_vkCmdDispatchBase)gpa(device, "vkCmdDispatchBase"); table->GetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2)gpa(device, "vkGetImageMemoryRequirements2"); table->GetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2)gpa(device, "vkGetBufferMemoryRequirements2"); - table->GetImageSparseMemoryRequirements2 = - (PFN_vkGetImageSparseMemoryRequirements2)gpa(device, "vkGetImageSparseMemoryRequirements2"); + table->GetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2)gpa(device, "vkGetImageSparseMemoryRequirements2"); table->TrimCommandPool = (PFN_vkTrimCommandPool)gpa(device, "vkTrimCommandPool"); table->GetDeviceQueue2 = (PFN_vkGetDeviceQueue2)gpa(device, "vkGetDeviceQueue2"); table->CreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion)gpa(device, "vkCreateSamplerYcbcrConversion"); table->DestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion)gpa(device, "vkDestroySamplerYcbcrConversion"); table->CreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate)gpa(device, "vkCreateDescriptorUpdateTemplate"); - table->DestroyDescriptorUpdateTemplate = - (PFN_vkDestroyDescriptorUpdateTemplate)gpa(device, "vkDestroyDescriptorUpdateTemplate"); - table->UpdateDescriptorSetWithTemplate = - (PFN_vkUpdateDescriptorSetWithTemplate)gpa(device, "vkUpdateDescriptorSetWithTemplate"); + table->DestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate)gpa(device, "vkDestroyDescriptorUpdateTemplate"); + table->UpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate)gpa(device, "vkUpdateDescriptorSetWithTemplate"); table->GetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport)gpa(device, "vkGetDescriptorSetLayoutSupport"); table->CmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)gpa(device, "vkCmdDrawIndirectCount"); table->CmdDrawIndexedIndirectCount = (PFN_vkCmdDrawIndexedIndirectCount)gpa(device, "vkCmdDrawIndexedIndirectCount"); @@ -188,8 +184,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->SignalSemaphore = (PFN_vkSignalSemaphore)gpa(device, "vkSignalSemaphore"); table->GetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)gpa(device, "vkGetBufferDeviceAddress"); table->GetBufferOpaqueCaptureAddress = (PFN_vkGetBufferOpaqueCaptureAddress)gpa(device, "vkGetBufferOpaqueCaptureAddress"); - table->GetDeviceMemoryOpaqueCaptureAddress = - (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)gpa(device, "vkGetDeviceMemoryOpaqueCaptureAddress"); + table->GetDeviceMemoryOpaqueCaptureAddress = (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)gpa(device, "vkGetDeviceMemoryOpaqueCaptureAddress"); table->CreatePrivateDataSlot = (PFN_vkCreatePrivateDataSlot)gpa(device, "vkCreatePrivateDataSlot"); table->DestroyPrivateDataSlot = (PFN_vkDestroyPrivateDataSlot)gpa(device, "vkDestroyPrivateDataSlot"); table->SetPrivateData = (PFN_vkSetPrivateData)gpa(device, "vkSetPrivateData"); @@ -223,42 +218,51 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdSetRasterizerDiscardEnable = (PFN_vkCmdSetRasterizerDiscardEnable)gpa(device, "vkCmdSetRasterizerDiscardEnable"); table->CmdSetDepthBiasEnable = (PFN_vkCmdSetDepthBiasEnable)gpa(device, "vkCmdSetDepthBiasEnable"); table->CmdSetPrimitiveRestartEnable = (PFN_vkCmdSetPrimitiveRestartEnable)gpa(device, "vkCmdSetPrimitiveRestartEnable"); - table->GetDeviceBufferMemoryRequirements = - (PFN_vkGetDeviceBufferMemoryRequirements)gpa(device, "vkGetDeviceBufferMemoryRequirements"); - table->GetDeviceImageMemoryRequirements = - (PFN_vkGetDeviceImageMemoryRequirements)gpa(device, "vkGetDeviceImageMemoryRequirements"); - table->GetDeviceImageSparseMemoryRequirements = - (PFN_vkGetDeviceImageSparseMemoryRequirements)gpa(device, "vkGetDeviceImageSparseMemoryRequirements"); + table->GetDeviceBufferMemoryRequirements = (PFN_vkGetDeviceBufferMemoryRequirements)gpa(device, "vkGetDeviceBufferMemoryRequirements"); + table->GetDeviceImageMemoryRequirements = (PFN_vkGetDeviceImageMemoryRequirements)gpa(device, "vkGetDeviceImageMemoryRequirements"); + table->GetDeviceImageSparseMemoryRequirements = (PFN_vkGetDeviceImageSparseMemoryRequirements)gpa(device, "vkGetDeviceImageSparseMemoryRequirements"); + table->CmdSetLineStipple = (PFN_vkCmdSetLineStipple)gpa(device, "vkCmdSetLineStipple"); + table->MapMemory2 = (PFN_vkMapMemory2)gpa(device, "vkMapMemory2"); + table->UnmapMemory2 = (PFN_vkUnmapMemory2)gpa(device, "vkUnmapMemory2"); + table->CmdBindIndexBuffer2 = (PFN_vkCmdBindIndexBuffer2)gpa(device, "vkCmdBindIndexBuffer2"); + table->GetRenderingAreaGranularity = (PFN_vkGetRenderingAreaGranularity)gpa(device, "vkGetRenderingAreaGranularity"); + table->GetDeviceImageSubresourceLayout = (PFN_vkGetDeviceImageSubresourceLayout)gpa(device, "vkGetDeviceImageSubresourceLayout"); + table->GetImageSubresourceLayout2 = (PFN_vkGetImageSubresourceLayout2)gpa(device, "vkGetImageSubresourceLayout2"); + table->CmdPushDescriptorSet = (PFN_vkCmdPushDescriptorSet)gpa(device, "vkCmdPushDescriptorSet"); + table->CmdPushDescriptorSetWithTemplate = (PFN_vkCmdPushDescriptorSetWithTemplate)gpa(device, "vkCmdPushDescriptorSetWithTemplate"); + table->CmdSetRenderingAttachmentLocations = (PFN_vkCmdSetRenderingAttachmentLocations)gpa(device, "vkCmdSetRenderingAttachmentLocations"); + table->CmdSetRenderingInputAttachmentIndices = (PFN_vkCmdSetRenderingInputAttachmentIndices)gpa(device, "vkCmdSetRenderingInputAttachmentIndices"); + table->CmdBindDescriptorSets2 = (PFN_vkCmdBindDescriptorSets2)gpa(device, "vkCmdBindDescriptorSets2"); + table->CmdPushConstants2 = (PFN_vkCmdPushConstants2)gpa(device, "vkCmdPushConstants2"); + table->CmdPushDescriptorSet2 = (PFN_vkCmdPushDescriptorSet2)gpa(device, "vkCmdPushDescriptorSet2"); + table->CmdPushDescriptorSetWithTemplate2 = (PFN_vkCmdPushDescriptorSetWithTemplate2)gpa(device, "vkCmdPushDescriptorSetWithTemplate2"); + table->CopyMemoryToImage = (PFN_vkCopyMemoryToImage)gpa(device, "vkCopyMemoryToImage"); + table->CopyImageToMemory = (PFN_vkCopyImageToMemory)gpa(device, "vkCopyImageToMemory"); + table->CopyImageToImage = (PFN_vkCopyImageToImage)gpa(device, "vkCopyImageToImage"); + table->TransitionImageLayout = (PFN_vkTransitionImageLayout)gpa(device, "vkTransitionImageLayout"); table->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); table->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); table->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); table->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); table->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); - table->GetDeviceGroupPresentCapabilitiesKHR = - (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)gpa(device, "vkGetDeviceGroupPresentCapabilitiesKHR"); - table->GetDeviceGroupSurfacePresentModesKHR = - (PFN_vkGetDeviceGroupSurfacePresentModesKHR)gpa(device, "vkGetDeviceGroupSurfacePresentModesKHR"); + table->GetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR)gpa(device, "vkGetDeviceGroupPresentCapabilitiesKHR"); + table->GetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)gpa(device, "vkGetDeviceGroupSurfacePresentModesKHR"); table->AcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR)gpa(device, "vkAcquireNextImage2KHR"); table->CreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)gpa(device, "vkCreateSharedSwapchainsKHR"); table->CreateVideoSessionKHR = (PFN_vkCreateVideoSessionKHR)gpa(device, "vkCreateVideoSessionKHR"); table->DestroyVideoSessionKHR = (PFN_vkDestroyVideoSessionKHR)gpa(device, "vkDestroyVideoSessionKHR"); - table->GetVideoSessionMemoryRequirementsKHR = - (PFN_vkGetVideoSessionMemoryRequirementsKHR)gpa(device, "vkGetVideoSessionMemoryRequirementsKHR"); + table->GetVideoSessionMemoryRequirementsKHR = (PFN_vkGetVideoSessionMemoryRequirementsKHR)gpa(device, "vkGetVideoSessionMemoryRequirementsKHR"); table->BindVideoSessionMemoryKHR = (PFN_vkBindVideoSessionMemoryKHR)gpa(device, "vkBindVideoSessionMemoryKHR"); - table->CreateVideoSessionParametersKHR = - (PFN_vkCreateVideoSessionParametersKHR)gpa(device, "vkCreateVideoSessionParametersKHR"); - table->UpdateVideoSessionParametersKHR = - (PFN_vkUpdateVideoSessionParametersKHR)gpa(device, "vkUpdateVideoSessionParametersKHR"); - table->DestroyVideoSessionParametersKHR = - (PFN_vkDestroyVideoSessionParametersKHR)gpa(device, "vkDestroyVideoSessionParametersKHR"); + table->CreateVideoSessionParametersKHR = (PFN_vkCreateVideoSessionParametersKHR)gpa(device, "vkCreateVideoSessionParametersKHR"); + table->UpdateVideoSessionParametersKHR = (PFN_vkUpdateVideoSessionParametersKHR)gpa(device, "vkUpdateVideoSessionParametersKHR"); + table->DestroyVideoSessionParametersKHR = (PFN_vkDestroyVideoSessionParametersKHR)gpa(device, "vkDestroyVideoSessionParametersKHR"); table->CmdBeginVideoCodingKHR = (PFN_vkCmdBeginVideoCodingKHR)gpa(device, "vkCmdBeginVideoCodingKHR"); table->CmdEndVideoCodingKHR = (PFN_vkCmdEndVideoCodingKHR)gpa(device, "vkCmdEndVideoCodingKHR"); table->CmdControlVideoCodingKHR = (PFN_vkCmdControlVideoCodingKHR)gpa(device, "vkCmdControlVideoCodingKHR"); table->CmdDecodeVideoKHR = (PFN_vkCmdDecodeVideoKHR)gpa(device, "vkCmdDecodeVideoKHR"); table->CmdBeginRenderingKHR = (PFN_vkCmdBeginRenderingKHR)gpa(device, "vkCmdBeginRenderingKHR"); table->CmdEndRenderingKHR = (PFN_vkCmdEndRenderingKHR)gpa(device, "vkCmdEndRenderingKHR"); - table->GetDeviceGroupPeerMemoryFeaturesKHR = - (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)gpa(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR"); + table->GetDeviceGroupPeerMemoryFeaturesKHR = (PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR)gpa(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR"); table->CmdSetDeviceMaskKHR = (PFN_vkCmdSetDeviceMaskKHR)gpa(device, "vkCmdSetDeviceMaskKHR"); table->CmdDispatchBaseKHR = (PFN_vkCmdDispatchBaseKHR)gpa(device, "vkCmdDispatchBaseKHR"); table->TrimCommandPoolKHR = (PFN_vkTrimCommandPoolKHR)gpa(device, "vkTrimCommandPoolKHR"); @@ -266,8 +270,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->GetMemoryWin32HandleKHR = (PFN_vkGetMemoryWin32HandleKHR)gpa(device, "vkGetMemoryWin32HandleKHR"); #endif // VK_USE_PLATFORM_WIN32_KHR #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->GetMemoryWin32HandlePropertiesKHR = - (PFN_vkGetMemoryWin32HandlePropertiesKHR)gpa(device, "vkGetMemoryWin32HandlePropertiesKHR"); + table->GetMemoryWin32HandlePropertiesKHR = (PFN_vkGetMemoryWin32HandlePropertiesKHR)gpa(device, "vkGetMemoryWin32HandlePropertiesKHR"); #endif // VK_USE_PLATFORM_WIN32_KHR table->GetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)gpa(device, "vkGetMemoryFdKHR"); table->GetMemoryFdPropertiesKHR = (PFN_vkGetMemoryFdPropertiesKHR)gpa(device, "vkGetMemoryFdPropertiesKHR"); @@ -280,14 +283,10 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->ImportSemaphoreFdKHR = (PFN_vkImportSemaphoreFdKHR)gpa(device, "vkImportSemaphoreFdKHR"); table->GetSemaphoreFdKHR = (PFN_vkGetSemaphoreFdKHR)gpa(device, "vkGetSemaphoreFdKHR"); table->CmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)gpa(device, "vkCmdPushDescriptorSetKHR"); - table->CmdPushDescriptorSetWithTemplateKHR = - (PFN_vkCmdPushDescriptorSetWithTemplateKHR)gpa(device, "vkCmdPushDescriptorSetWithTemplateKHR"); - table->CreateDescriptorUpdateTemplateKHR = - (PFN_vkCreateDescriptorUpdateTemplateKHR)gpa(device, "vkCreateDescriptorUpdateTemplateKHR"); - table->DestroyDescriptorUpdateTemplateKHR = - (PFN_vkDestroyDescriptorUpdateTemplateKHR)gpa(device, "vkDestroyDescriptorUpdateTemplateKHR"); - table->UpdateDescriptorSetWithTemplateKHR = - (PFN_vkUpdateDescriptorSetWithTemplateKHR)gpa(device, "vkUpdateDescriptorSetWithTemplateKHR"); + table->CmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)gpa(device, "vkCmdPushDescriptorSetWithTemplateKHR"); + table->CreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)gpa(device, "vkCreateDescriptorUpdateTemplateKHR"); + table->DestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)gpa(device, "vkDestroyDescriptorUpdateTemplateKHR"); + table->UpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)gpa(device, "vkUpdateDescriptorSetWithTemplateKHR"); table->CreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)gpa(device, "vkCreateRenderPass2KHR"); table->CmdBeginRenderPass2KHR = (PFN_vkCmdBeginRenderPass2KHR)gpa(device, "vkCmdBeginRenderPass2KHR"); table->CmdNextSubpass2KHR = (PFN_vkCmdNextSubpass2KHR)gpa(device, "vkCmdNextSubpass2KHR"); @@ -304,59 +303,43 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->AcquireProfilingLockKHR = (PFN_vkAcquireProfilingLockKHR)gpa(device, "vkAcquireProfilingLockKHR"); table->ReleaseProfilingLockKHR = (PFN_vkReleaseProfilingLockKHR)gpa(device, "vkReleaseProfilingLockKHR"); table->GetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)gpa(device, "vkGetImageMemoryRequirements2KHR"); - table->GetBufferMemoryRequirements2KHR = - (PFN_vkGetBufferMemoryRequirements2KHR)gpa(device, "vkGetBufferMemoryRequirements2KHR"); - table->GetImageSparseMemoryRequirements2KHR = - (PFN_vkGetImageSparseMemoryRequirements2KHR)gpa(device, "vkGetImageSparseMemoryRequirements2KHR"); - table->CreateSamplerYcbcrConversionKHR = - (PFN_vkCreateSamplerYcbcrConversionKHR)gpa(device, "vkCreateSamplerYcbcrConversionKHR"); - table->DestroySamplerYcbcrConversionKHR = - (PFN_vkDestroySamplerYcbcrConversionKHR)gpa(device, "vkDestroySamplerYcbcrConversionKHR"); + table->GetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)gpa(device, "vkGetBufferMemoryRequirements2KHR"); + table->GetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)gpa(device, "vkGetImageSparseMemoryRequirements2KHR"); + table->CreateSamplerYcbcrConversionKHR = (PFN_vkCreateSamplerYcbcrConversionKHR)gpa(device, "vkCreateSamplerYcbcrConversionKHR"); + table->DestroySamplerYcbcrConversionKHR = (PFN_vkDestroySamplerYcbcrConversionKHR)gpa(device, "vkDestroySamplerYcbcrConversionKHR"); table->BindBufferMemory2KHR = (PFN_vkBindBufferMemory2KHR)gpa(device, "vkBindBufferMemory2KHR"); table->BindImageMemory2KHR = (PFN_vkBindImageMemory2KHR)gpa(device, "vkBindImageMemory2KHR"); - table->GetDescriptorSetLayoutSupportKHR = - (PFN_vkGetDescriptorSetLayoutSupportKHR)gpa(device, "vkGetDescriptorSetLayoutSupportKHR"); + table->GetDescriptorSetLayoutSupportKHR = (PFN_vkGetDescriptorSetLayoutSupportKHR)gpa(device, "vkGetDescriptorSetLayoutSupportKHR"); table->CmdDrawIndirectCountKHR = (PFN_vkCmdDrawIndirectCountKHR)gpa(device, "vkCmdDrawIndirectCountKHR"); table->CmdDrawIndexedIndirectCountKHR = (PFN_vkCmdDrawIndexedIndirectCountKHR)gpa(device, "vkCmdDrawIndexedIndirectCountKHR"); table->GetSemaphoreCounterValueKHR = (PFN_vkGetSemaphoreCounterValueKHR)gpa(device, "vkGetSemaphoreCounterValueKHR"); table->WaitSemaphoresKHR = (PFN_vkWaitSemaphoresKHR)gpa(device, "vkWaitSemaphoresKHR"); table->SignalSemaphoreKHR = (PFN_vkSignalSemaphoreKHR)gpa(device, "vkSignalSemaphoreKHR"); table->CmdSetFragmentShadingRateKHR = (PFN_vkCmdSetFragmentShadingRateKHR)gpa(device, "vkCmdSetFragmentShadingRateKHR"); + table->CmdSetRenderingAttachmentLocationsKHR = (PFN_vkCmdSetRenderingAttachmentLocationsKHR)gpa(device, "vkCmdSetRenderingAttachmentLocationsKHR"); + table->CmdSetRenderingInputAttachmentIndicesKHR = (PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)gpa(device, "vkCmdSetRenderingInputAttachmentIndicesKHR"); table->WaitForPresentKHR = (PFN_vkWaitForPresentKHR)gpa(device, "vkWaitForPresentKHR"); table->GetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressKHR)gpa(device, "vkGetBufferDeviceAddressKHR"); - table->GetBufferOpaqueCaptureAddressKHR = - (PFN_vkGetBufferOpaqueCaptureAddressKHR)gpa(device, "vkGetBufferOpaqueCaptureAddressKHR"); - table->GetDeviceMemoryOpaqueCaptureAddressKHR = - (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)gpa(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR"); + table->GetBufferOpaqueCaptureAddressKHR = (PFN_vkGetBufferOpaqueCaptureAddressKHR)gpa(device, "vkGetBufferOpaqueCaptureAddressKHR"); + table->GetDeviceMemoryOpaqueCaptureAddressKHR = (PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)gpa(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR"); table->CreateDeferredOperationKHR = (PFN_vkCreateDeferredOperationKHR)gpa(device, "vkCreateDeferredOperationKHR"); table->DestroyDeferredOperationKHR = (PFN_vkDestroyDeferredOperationKHR)gpa(device, "vkDestroyDeferredOperationKHR"); - table->GetDeferredOperationMaxConcurrencyKHR = - (PFN_vkGetDeferredOperationMaxConcurrencyKHR)gpa(device, "vkGetDeferredOperationMaxConcurrencyKHR"); + table->GetDeferredOperationMaxConcurrencyKHR = (PFN_vkGetDeferredOperationMaxConcurrencyKHR)gpa(device, "vkGetDeferredOperationMaxConcurrencyKHR"); table->GetDeferredOperationResultKHR = (PFN_vkGetDeferredOperationResultKHR)gpa(device, "vkGetDeferredOperationResultKHR"); table->DeferredOperationJoinKHR = (PFN_vkDeferredOperationJoinKHR)gpa(device, "vkDeferredOperationJoinKHR"); - table->GetPipelineExecutablePropertiesKHR = - (PFN_vkGetPipelineExecutablePropertiesKHR)gpa(device, "vkGetPipelineExecutablePropertiesKHR"); - table->GetPipelineExecutableStatisticsKHR = - (PFN_vkGetPipelineExecutableStatisticsKHR)gpa(device, "vkGetPipelineExecutableStatisticsKHR"); - table->GetPipelineExecutableInternalRepresentationsKHR = - (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)gpa(device, "vkGetPipelineExecutableInternalRepresentationsKHR"); + table->GetPipelineExecutablePropertiesKHR = (PFN_vkGetPipelineExecutablePropertiesKHR)gpa(device, "vkGetPipelineExecutablePropertiesKHR"); + table->GetPipelineExecutableStatisticsKHR = (PFN_vkGetPipelineExecutableStatisticsKHR)gpa(device, "vkGetPipelineExecutableStatisticsKHR"); + table->GetPipelineExecutableInternalRepresentationsKHR = (PFN_vkGetPipelineExecutableInternalRepresentationsKHR)gpa(device, "vkGetPipelineExecutableInternalRepresentationsKHR"); table->MapMemory2KHR = (PFN_vkMapMemory2KHR)gpa(device, "vkMapMemory2KHR"); table->UnmapMemory2KHR = (PFN_vkUnmapMemory2KHR)gpa(device, "vkUnmapMemory2KHR"); -#if defined(VK_ENABLE_BETA_EXTENSIONS) - table->GetEncodedVideoSessionParametersKHR = - (PFN_vkGetEncodedVideoSessionParametersKHR)gpa(device, "vkGetEncodedVideoSessionParametersKHR"); -#endif // VK_ENABLE_BETA_EXTENSIONS -#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->GetEncodedVideoSessionParametersKHR = (PFN_vkGetEncodedVideoSessionParametersKHR)gpa(device, "vkGetEncodedVideoSessionParametersKHR"); table->CmdEncodeVideoKHR = (PFN_vkCmdEncodeVideoKHR)gpa(device, "vkCmdEncodeVideoKHR"); -#endif // VK_ENABLE_BETA_EXTENSIONS table->CmdSetEvent2KHR = (PFN_vkCmdSetEvent2KHR)gpa(device, "vkCmdSetEvent2KHR"); table->CmdResetEvent2KHR = (PFN_vkCmdResetEvent2KHR)gpa(device, "vkCmdResetEvent2KHR"); table->CmdWaitEvents2KHR = (PFN_vkCmdWaitEvents2KHR)gpa(device, "vkCmdWaitEvents2KHR"); table->CmdPipelineBarrier2KHR = (PFN_vkCmdPipelineBarrier2KHR)gpa(device, "vkCmdPipelineBarrier2KHR"); table->CmdWriteTimestamp2KHR = (PFN_vkCmdWriteTimestamp2KHR)gpa(device, "vkCmdWriteTimestamp2KHR"); table->QueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)gpa(device, "vkQueueSubmit2KHR"); - table->CmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)gpa(device, "vkCmdWriteBufferMarker2AMD"); - table->GetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)gpa(device, "vkGetQueueCheckpointData2NV"); table->CmdCopyBuffer2KHR = (PFN_vkCmdCopyBuffer2KHR)gpa(device, "vkCmdCopyBuffer2KHR"); table->CmdCopyImage2KHR = (PFN_vkCmdCopyImage2KHR)gpa(device, "vkCmdCopyImage2KHR"); table->CmdCopyBufferToImage2KHR = (PFN_vkCmdCopyBufferToImage2KHR)gpa(device, "vkCmdCopyBufferToImage2KHR"); @@ -364,19 +347,32 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdBlitImage2KHR = (PFN_vkCmdBlitImage2KHR)gpa(device, "vkCmdBlitImage2KHR"); table->CmdResolveImage2KHR = (PFN_vkCmdResolveImage2KHR)gpa(device, "vkCmdResolveImage2KHR"); table->CmdTraceRaysIndirect2KHR = (PFN_vkCmdTraceRaysIndirect2KHR)gpa(device, "vkCmdTraceRaysIndirect2KHR"); - table->GetDeviceBufferMemoryRequirementsKHR = - (PFN_vkGetDeviceBufferMemoryRequirementsKHR)gpa(device, "vkGetDeviceBufferMemoryRequirementsKHR"); - table->GetDeviceImageMemoryRequirementsKHR = - (PFN_vkGetDeviceImageMemoryRequirementsKHR)gpa(device, "vkGetDeviceImageMemoryRequirementsKHR"); - table->GetDeviceImageSparseMemoryRequirementsKHR = - (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)gpa(device, "vkGetDeviceImageSparseMemoryRequirementsKHR"); + table->GetDeviceBufferMemoryRequirementsKHR = (PFN_vkGetDeviceBufferMemoryRequirementsKHR)gpa(device, "vkGetDeviceBufferMemoryRequirementsKHR"); + table->GetDeviceImageMemoryRequirementsKHR = (PFN_vkGetDeviceImageMemoryRequirementsKHR)gpa(device, "vkGetDeviceImageMemoryRequirementsKHR"); + table->GetDeviceImageSparseMemoryRequirementsKHR = (PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)gpa(device, "vkGetDeviceImageSparseMemoryRequirementsKHR"); + table->CmdBindIndexBuffer2KHR = (PFN_vkCmdBindIndexBuffer2KHR)gpa(device, "vkCmdBindIndexBuffer2KHR"); + table->GetRenderingAreaGranularityKHR = (PFN_vkGetRenderingAreaGranularityKHR)gpa(device, "vkGetRenderingAreaGranularityKHR"); + table->GetDeviceImageSubresourceLayoutKHR = (PFN_vkGetDeviceImageSubresourceLayoutKHR)gpa(device, "vkGetDeviceImageSubresourceLayoutKHR"); + table->GetImageSubresourceLayout2KHR = (PFN_vkGetImageSubresourceLayout2KHR)gpa(device, "vkGetImageSubresourceLayout2KHR"); + table->CreatePipelineBinariesKHR = (PFN_vkCreatePipelineBinariesKHR)gpa(device, "vkCreatePipelineBinariesKHR"); + table->DestroyPipelineBinaryKHR = (PFN_vkDestroyPipelineBinaryKHR)gpa(device, "vkDestroyPipelineBinaryKHR"); + table->GetPipelineKeyKHR = (PFN_vkGetPipelineKeyKHR)gpa(device, "vkGetPipelineKeyKHR"); + table->GetPipelineBinaryDataKHR = (PFN_vkGetPipelineBinaryDataKHR)gpa(device, "vkGetPipelineBinaryDataKHR"); + table->ReleaseCapturedPipelineDataKHR = (PFN_vkReleaseCapturedPipelineDataKHR)gpa(device, "vkReleaseCapturedPipelineDataKHR"); + table->CmdSetLineStippleKHR = (PFN_vkCmdSetLineStippleKHR)gpa(device, "vkCmdSetLineStippleKHR"); + table->GetCalibratedTimestampsKHR = (PFN_vkGetCalibratedTimestampsKHR)gpa(device, "vkGetCalibratedTimestampsKHR"); + table->CmdBindDescriptorSets2KHR = (PFN_vkCmdBindDescriptorSets2KHR)gpa(device, "vkCmdBindDescriptorSets2KHR"); + table->CmdPushConstants2KHR = (PFN_vkCmdPushConstants2KHR)gpa(device, "vkCmdPushConstants2KHR"); + table->CmdPushDescriptorSet2KHR = (PFN_vkCmdPushDescriptorSet2KHR)gpa(device, "vkCmdPushDescriptorSet2KHR"); + table->CmdPushDescriptorSetWithTemplate2KHR = (PFN_vkCmdPushDescriptorSetWithTemplate2KHR)gpa(device, "vkCmdPushDescriptorSetWithTemplate2KHR"); + table->CmdSetDescriptorBufferOffsets2EXT = (PFN_vkCmdSetDescriptorBufferOffsets2EXT)gpa(device, "vkCmdSetDescriptorBufferOffsets2EXT"); + table->CmdBindDescriptorBufferEmbeddedSamplers2EXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)gpa(device, "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT"); table->DebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)gpa(device, "vkDebugMarkerSetObjectTagEXT"); table->DebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)gpa(device, "vkDebugMarkerSetObjectNameEXT"); table->CmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)gpa(device, "vkCmdDebugMarkerBeginEXT"); table->CmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)gpa(device, "vkCmdDebugMarkerEndEXT"); table->CmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)gpa(device, "vkCmdDebugMarkerInsertEXT"); - table->CmdBindTransformFeedbackBuffersEXT = - (PFN_vkCmdBindTransformFeedbackBuffersEXT)gpa(device, "vkCmdBindTransformFeedbackBuffersEXT"); + table->CmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)gpa(device, "vkCmdBindTransformFeedbackBuffersEXT"); table->CmdBeginTransformFeedbackEXT = (PFN_vkCmdBeginTransformFeedbackEXT)gpa(device, "vkCmdBeginTransformFeedbackEXT"); table->CmdEndTransformFeedbackEXT = (PFN_vkCmdEndTransformFeedbackEXT)gpa(device, "vkCmdEndTransformFeedbackEXT"); table->CmdBeginQueryIndexedEXT = (PFN_vkCmdBeginQueryIndexedEXT)gpa(device, "vkCmdBeginQueryIndexedEXT"); @@ -388,6 +384,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->DestroyCuFunctionNVX = (PFN_vkDestroyCuFunctionNVX)gpa(device, "vkDestroyCuFunctionNVX"); table->CmdCuLaunchKernelNVX = (PFN_vkCmdCuLaunchKernelNVX)gpa(device, "vkCmdCuLaunchKernelNVX"); table->GetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)gpa(device, "vkGetImageViewHandleNVX"); + table->GetImageViewHandle64NVX = (PFN_vkGetImageViewHandle64NVX)gpa(device, "vkGetImageViewHandle64NVX"); table->GetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)gpa(device, "vkGetImageViewAddressNVX"); table->CmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)gpa(device, "vkCmdDrawIndirectCountAMD"); table->CmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD)gpa(device, "vkCmdDrawIndexedIndirectCountAMD"); @@ -395,8 +392,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp #if defined(VK_USE_PLATFORM_WIN32_KHR) table->GetMemoryWin32HandleNV = (PFN_vkGetMemoryWin32HandleNV)gpa(device, "vkGetMemoryWin32HandleNV"); #endif // VK_USE_PLATFORM_WIN32_KHR - table->CmdBeginConditionalRenderingEXT = - (PFN_vkCmdBeginConditionalRenderingEXT)gpa(device, "vkCmdBeginConditionalRenderingEXT"); + table->CmdBeginConditionalRenderingEXT = (PFN_vkCmdBeginConditionalRenderingEXT)gpa(device, "vkCmdBeginConditionalRenderingEXT"); table->CmdEndConditionalRenderingEXT = (PFN_vkCmdEndConditionalRenderingEXT)gpa(device, "vkCmdEndConditionalRenderingEXT"); table->CmdSetViewportWScalingNV = (PFN_vkCmdSetViewportWScalingNV)gpa(device, "vkCmdSetViewportWScalingNV"); table->DisplayPowerControlEXT = (PFN_vkDisplayPowerControlEXT)gpa(device, "vkDisplayPowerControlEXT"); @@ -404,11 +400,9 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->RegisterDisplayEventEXT = (PFN_vkRegisterDisplayEventEXT)gpa(device, "vkRegisterDisplayEventEXT"); table->GetSwapchainCounterEXT = (PFN_vkGetSwapchainCounterEXT)gpa(device, "vkGetSwapchainCounterEXT"); table->GetRefreshCycleDurationGOOGLE = (PFN_vkGetRefreshCycleDurationGOOGLE)gpa(device, "vkGetRefreshCycleDurationGOOGLE"); - table->GetPastPresentationTimingGOOGLE = - (PFN_vkGetPastPresentationTimingGOOGLE)gpa(device, "vkGetPastPresentationTimingGOOGLE"); + table->GetPastPresentationTimingGOOGLE = (PFN_vkGetPastPresentationTimingGOOGLE)gpa(device, "vkGetPastPresentationTimingGOOGLE"); table->CmdSetDiscardRectangleEXT = (PFN_vkCmdSetDiscardRectangleEXT)gpa(device, "vkCmdSetDiscardRectangleEXT"); - table->CmdSetDiscardRectangleEnableEXT = - (PFN_vkCmdSetDiscardRectangleEnableEXT)gpa(device, "vkCmdSetDiscardRectangleEnableEXT"); + table->CmdSetDiscardRectangleEnableEXT = (PFN_vkCmdSetDiscardRectangleEnableEXT)gpa(device, "vkCmdSetDiscardRectangleEnableEXT"); table->CmdSetDiscardRectangleModeEXT = (PFN_vkCmdSetDiscardRectangleModeEXT)gpa(device, "vkCmdSetDiscardRectangleModeEXT"); table->SetHdrMetadataEXT = (PFN_vkSetHdrMetadataEXT)gpa(device, "vkSetHdrMetadataEXT"); table->SetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)gpa(device, "vkSetDebugUtilsObjectNameEXT"); @@ -420,83 +414,85 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)gpa(device, "vkCmdEndDebugUtilsLabelEXT"); table->CmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)gpa(device, "vkCmdInsertDebugUtilsLabelEXT"); #if defined(VK_USE_PLATFORM_ANDROID_KHR) - table->GetAndroidHardwareBufferPropertiesANDROID = - (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)gpa(device, "vkGetAndroidHardwareBufferPropertiesANDROID"); + table->GetAndroidHardwareBufferPropertiesANDROID = (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)gpa(device, "vkGetAndroidHardwareBufferPropertiesANDROID"); #endif // VK_USE_PLATFORM_ANDROID_KHR #if defined(VK_USE_PLATFORM_ANDROID_KHR) - table->GetMemoryAndroidHardwareBufferANDROID = - (PFN_vkGetMemoryAndroidHardwareBufferANDROID)gpa(device, "vkGetMemoryAndroidHardwareBufferANDROID"); + table->GetMemoryAndroidHardwareBufferANDROID = (PFN_vkGetMemoryAndroidHardwareBufferANDROID)gpa(device, "vkGetMemoryAndroidHardwareBufferANDROID"); #endif // VK_USE_PLATFORM_ANDROID_KHR +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->CreateExecutionGraphPipelinesAMDX = (PFN_vkCreateExecutionGraphPipelinesAMDX)gpa(device, "vkCreateExecutionGraphPipelinesAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->GetExecutionGraphPipelineScratchSizeAMDX = (PFN_vkGetExecutionGraphPipelineScratchSizeAMDX)gpa(device, "vkGetExecutionGraphPipelineScratchSizeAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->GetExecutionGraphPipelineNodeIndexAMDX = (PFN_vkGetExecutionGraphPipelineNodeIndexAMDX)gpa(device, "vkGetExecutionGraphPipelineNodeIndexAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->CmdInitializeGraphScratchMemoryAMDX = (PFN_vkCmdInitializeGraphScratchMemoryAMDX)gpa(device, "vkCmdInitializeGraphScratchMemoryAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->CmdDispatchGraphAMDX = (PFN_vkCmdDispatchGraphAMDX)gpa(device, "vkCmdDispatchGraphAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->CmdDispatchGraphIndirectAMDX = (PFN_vkCmdDispatchGraphIndirectAMDX)gpa(device, "vkCmdDispatchGraphIndirectAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS +#if defined(VK_ENABLE_BETA_EXTENSIONS) + table->CmdDispatchGraphIndirectCountAMDX = (PFN_vkCmdDispatchGraphIndirectCountAMDX)gpa(device, "vkCmdDispatchGraphIndirectCountAMDX"); +#endif // VK_ENABLE_BETA_EXTENSIONS table->CmdSetSampleLocationsEXT = (PFN_vkCmdSetSampleLocationsEXT)gpa(device, "vkCmdSetSampleLocationsEXT"); - table->GetImageDrmFormatModifierPropertiesEXT = - (PFN_vkGetImageDrmFormatModifierPropertiesEXT)gpa(device, "vkGetImageDrmFormatModifierPropertiesEXT"); + table->GetImageDrmFormatModifierPropertiesEXT = (PFN_vkGetImageDrmFormatModifierPropertiesEXT)gpa(device, "vkGetImageDrmFormatModifierPropertiesEXT"); table->CreateValidationCacheEXT = (PFN_vkCreateValidationCacheEXT)gpa(device, "vkCreateValidationCacheEXT"); table->DestroyValidationCacheEXT = (PFN_vkDestroyValidationCacheEXT)gpa(device, "vkDestroyValidationCacheEXT"); table->MergeValidationCachesEXT = (PFN_vkMergeValidationCachesEXT)gpa(device, "vkMergeValidationCachesEXT"); table->GetValidationCacheDataEXT = (PFN_vkGetValidationCacheDataEXT)gpa(device, "vkGetValidationCacheDataEXT"); table->CmdBindShadingRateImageNV = (PFN_vkCmdBindShadingRateImageNV)gpa(device, "vkCmdBindShadingRateImageNV"); - table->CmdSetViewportShadingRatePaletteNV = - (PFN_vkCmdSetViewportShadingRatePaletteNV)gpa(device, "vkCmdSetViewportShadingRatePaletteNV"); + table->CmdSetViewportShadingRatePaletteNV = (PFN_vkCmdSetViewportShadingRatePaletteNV)gpa(device, "vkCmdSetViewportShadingRatePaletteNV"); table->CmdSetCoarseSampleOrderNV = (PFN_vkCmdSetCoarseSampleOrderNV)gpa(device, "vkCmdSetCoarseSampleOrderNV"); table->CreateAccelerationStructureNV = (PFN_vkCreateAccelerationStructureNV)gpa(device, "vkCreateAccelerationStructureNV"); table->DestroyAccelerationStructureNV = (PFN_vkDestroyAccelerationStructureNV)gpa(device, "vkDestroyAccelerationStructureNV"); - table->GetAccelerationStructureMemoryRequirementsNV = - (PFN_vkGetAccelerationStructureMemoryRequirementsNV)gpa(device, "vkGetAccelerationStructureMemoryRequirementsNV"); - table->BindAccelerationStructureMemoryNV = - (PFN_vkBindAccelerationStructureMemoryNV)gpa(device, "vkBindAccelerationStructureMemoryNV"); - table->CmdBuildAccelerationStructureNV = - (PFN_vkCmdBuildAccelerationStructureNV)gpa(device, "vkCmdBuildAccelerationStructureNV"); + table->GetAccelerationStructureMemoryRequirementsNV = (PFN_vkGetAccelerationStructureMemoryRequirementsNV)gpa(device, "vkGetAccelerationStructureMemoryRequirementsNV"); + table->BindAccelerationStructureMemoryNV = (PFN_vkBindAccelerationStructureMemoryNV)gpa(device, "vkBindAccelerationStructureMemoryNV"); + table->CmdBuildAccelerationStructureNV = (PFN_vkCmdBuildAccelerationStructureNV)gpa(device, "vkCmdBuildAccelerationStructureNV"); table->CmdCopyAccelerationStructureNV = (PFN_vkCmdCopyAccelerationStructureNV)gpa(device, "vkCmdCopyAccelerationStructureNV"); table->CmdTraceRaysNV = (PFN_vkCmdTraceRaysNV)gpa(device, "vkCmdTraceRaysNV"); table->CreateRayTracingPipelinesNV = (PFN_vkCreateRayTracingPipelinesNV)gpa(device, "vkCreateRayTracingPipelinesNV"); - table->GetRayTracingShaderGroupHandlesKHR = - (PFN_vkGetRayTracingShaderGroupHandlesKHR)gpa(device, "vkGetRayTracingShaderGroupHandlesKHR"); - table->GetRayTracingShaderGroupHandlesNV = - (PFN_vkGetRayTracingShaderGroupHandlesNV)gpa(device, "vkGetRayTracingShaderGroupHandlesNV"); - table->GetAccelerationStructureHandleNV = - (PFN_vkGetAccelerationStructureHandleNV)gpa(device, "vkGetAccelerationStructureHandleNV"); - table->CmdWriteAccelerationStructuresPropertiesNV = - (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)gpa(device, "vkCmdWriteAccelerationStructuresPropertiesNV"); + table->GetRayTracingShaderGroupHandlesKHR = (PFN_vkGetRayTracingShaderGroupHandlesKHR)gpa(device, "vkGetRayTracingShaderGroupHandlesKHR"); + table->GetRayTracingShaderGroupHandlesNV = (PFN_vkGetRayTracingShaderGroupHandlesNV)gpa(device, "vkGetRayTracingShaderGroupHandlesNV"); + table->GetAccelerationStructureHandleNV = (PFN_vkGetAccelerationStructureHandleNV)gpa(device, "vkGetAccelerationStructureHandleNV"); + table->CmdWriteAccelerationStructuresPropertiesNV = (PFN_vkCmdWriteAccelerationStructuresPropertiesNV)gpa(device, "vkCmdWriteAccelerationStructuresPropertiesNV"); table->CompileDeferredNV = (PFN_vkCompileDeferredNV)gpa(device, "vkCompileDeferredNV"); - table->GetMemoryHostPointerPropertiesEXT = - (PFN_vkGetMemoryHostPointerPropertiesEXT)gpa(device, "vkGetMemoryHostPointerPropertiesEXT"); + table->GetMemoryHostPointerPropertiesEXT = (PFN_vkGetMemoryHostPointerPropertiesEXT)gpa(device, "vkGetMemoryHostPointerPropertiesEXT"); table->CmdWriteBufferMarkerAMD = (PFN_vkCmdWriteBufferMarkerAMD)gpa(device, "vkCmdWriteBufferMarkerAMD"); + table->CmdWriteBufferMarker2AMD = (PFN_vkCmdWriteBufferMarker2AMD)gpa(device, "vkCmdWriteBufferMarker2AMD"); table->GetCalibratedTimestampsEXT = (PFN_vkGetCalibratedTimestampsEXT)gpa(device, "vkGetCalibratedTimestampsEXT"); table->CmdDrawMeshTasksNV = (PFN_vkCmdDrawMeshTasksNV)gpa(device, "vkCmdDrawMeshTasksNV"); table->CmdDrawMeshTasksIndirectNV = (PFN_vkCmdDrawMeshTasksIndirectNV)gpa(device, "vkCmdDrawMeshTasksIndirectNV"); - table->CmdDrawMeshTasksIndirectCountNV = - (PFN_vkCmdDrawMeshTasksIndirectCountNV)gpa(device, "vkCmdDrawMeshTasksIndirectCountNV"); + table->CmdDrawMeshTasksIndirectCountNV = (PFN_vkCmdDrawMeshTasksIndirectCountNV)gpa(device, "vkCmdDrawMeshTasksIndirectCountNV"); table->CmdSetExclusiveScissorEnableNV = (PFN_vkCmdSetExclusiveScissorEnableNV)gpa(device, "vkCmdSetExclusiveScissorEnableNV"); table->CmdSetExclusiveScissorNV = (PFN_vkCmdSetExclusiveScissorNV)gpa(device, "vkCmdSetExclusiveScissorNV"); table->CmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)gpa(device, "vkCmdSetCheckpointNV"); table->GetQueueCheckpointDataNV = (PFN_vkGetQueueCheckpointDataNV)gpa(device, "vkGetQueueCheckpointDataNV"); + table->GetQueueCheckpointData2NV = (PFN_vkGetQueueCheckpointData2NV)gpa(device, "vkGetQueueCheckpointData2NV"); table->InitializePerformanceApiINTEL = (PFN_vkInitializePerformanceApiINTEL)gpa(device, "vkInitializePerformanceApiINTEL"); - table->UninitializePerformanceApiINTEL = - (PFN_vkUninitializePerformanceApiINTEL)gpa(device, "vkUninitializePerformanceApiINTEL"); + table->UninitializePerformanceApiINTEL = (PFN_vkUninitializePerformanceApiINTEL)gpa(device, "vkUninitializePerformanceApiINTEL"); table->CmdSetPerformanceMarkerINTEL = (PFN_vkCmdSetPerformanceMarkerINTEL)gpa(device, "vkCmdSetPerformanceMarkerINTEL"); - table->CmdSetPerformanceStreamMarkerINTEL = - (PFN_vkCmdSetPerformanceStreamMarkerINTEL)gpa(device, "vkCmdSetPerformanceStreamMarkerINTEL"); + table->CmdSetPerformanceStreamMarkerINTEL = (PFN_vkCmdSetPerformanceStreamMarkerINTEL)gpa(device, "vkCmdSetPerformanceStreamMarkerINTEL"); table->CmdSetPerformanceOverrideINTEL = (PFN_vkCmdSetPerformanceOverrideINTEL)gpa(device, "vkCmdSetPerformanceOverrideINTEL"); - table->AcquirePerformanceConfigurationINTEL = - (PFN_vkAcquirePerformanceConfigurationINTEL)gpa(device, "vkAcquirePerformanceConfigurationINTEL"); - table->ReleasePerformanceConfigurationINTEL = - (PFN_vkReleasePerformanceConfigurationINTEL)gpa(device, "vkReleasePerformanceConfigurationINTEL"); - table->QueueSetPerformanceConfigurationINTEL = - (PFN_vkQueueSetPerformanceConfigurationINTEL)gpa(device, "vkQueueSetPerformanceConfigurationINTEL"); + table->AcquirePerformanceConfigurationINTEL = (PFN_vkAcquirePerformanceConfigurationINTEL)gpa(device, "vkAcquirePerformanceConfigurationINTEL"); + table->ReleasePerformanceConfigurationINTEL = (PFN_vkReleasePerformanceConfigurationINTEL)gpa(device, "vkReleasePerformanceConfigurationINTEL"); + table->QueueSetPerformanceConfigurationINTEL = (PFN_vkQueueSetPerformanceConfigurationINTEL)gpa(device, "vkQueueSetPerformanceConfigurationINTEL"); table->GetPerformanceParameterINTEL = (PFN_vkGetPerformanceParameterINTEL)gpa(device, "vkGetPerformanceParameterINTEL"); table->SetLocalDimmingAMD = (PFN_vkSetLocalDimmingAMD)gpa(device, "vkSetLocalDimmingAMD"); table->GetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)gpa(device, "vkGetBufferDeviceAddressEXT"); #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->AcquireFullScreenExclusiveModeEXT = - (PFN_vkAcquireFullScreenExclusiveModeEXT)gpa(device, "vkAcquireFullScreenExclusiveModeEXT"); + table->AcquireFullScreenExclusiveModeEXT = (PFN_vkAcquireFullScreenExclusiveModeEXT)gpa(device, "vkAcquireFullScreenExclusiveModeEXT"); #endif // VK_USE_PLATFORM_WIN32_KHR #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->ReleaseFullScreenExclusiveModeEXT = - (PFN_vkReleaseFullScreenExclusiveModeEXT)gpa(device, "vkReleaseFullScreenExclusiveModeEXT"); + table->ReleaseFullScreenExclusiveModeEXT = (PFN_vkReleaseFullScreenExclusiveModeEXT)gpa(device, "vkReleaseFullScreenExclusiveModeEXT"); #endif // VK_USE_PLATFORM_WIN32_KHR #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->GetDeviceGroupSurfacePresentModes2EXT = - (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)gpa(device, "vkGetDeviceGroupSurfacePresentModes2EXT"); + table->GetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)gpa(device, "vkGetDeviceGroupSurfacePresentModes2EXT"); #endif // VK_USE_PLATFORM_WIN32_KHR table->CmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)gpa(device, "vkCmdSetLineStippleEXT"); table->ResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)gpa(device, "vkResetQueryPoolEXT"); @@ -512,94 +508,83 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)gpa(device, "vkCmdSetDepthBoundsTestEnableEXT"); table->CmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)gpa(device, "vkCmdSetStencilTestEnableEXT"); table->CmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)gpa(device, "vkCmdSetStencilOpEXT"); + table->CopyMemoryToImageEXT = (PFN_vkCopyMemoryToImageEXT)gpa(device, "vkCopyMemoryToImageEXT"); + table->CopyImageToMemoryEXT = (PFN_vkCopyImageToMemoryEXT)gpa(device, "vkCopyImageToMemoryEXT"); + table->CopyImageToImageEXT = (PFN_vkCopyImageToImageEXT)gpa(device, "vkCopyImageToImageEXT"); + table->TransitionImageLayoutEXT = (PFN_vkTransitionImageLayoutEXT)gpa(device, "vkTransitionImageLayoutEXT"); + table->GetImageSubresourceLayout2EXT = (PFN_vkGetImageSubresourceLayout2EXT)gpa(device, "vkGetImageSubresourceLayout2EXT"); table->ReleaseSwapchainImagesEXT = (PFN_vkReleaseSwapchainImagesEXT)gpa(device, "vkReleaseSwapchainImagesEXT"); - table->GetGeneratedCommandsMemoryRequirementsNV = - (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)gpa(device, "vkGetGeneratedCommandsMemoryRequirementsNV"); - table->CmdPreprocessGeneratedCommandsNV = - (PFN_vkCmdPreprocessGeneratedCommandsNV)gpa(device, "vkCmdPreprocessGeneratedCommandsNV"); + table->GetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)gpa(device, "vkGetGeneratedCommandsMemoryRequirementsNV"); + table->CmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV)gpa(device, "vkCmdPreprocessGeneratedCommandsNV"); table->CmdExecuteGeneratedCommandsNV = (PFN_vkCmdExecuteGeneratedCommandsNV)gpa(device, "vkCmdExecuteGeneratedCommandsNV"); table->CmdBindPipelineShaderGroupNV = (PFN_vkCmdBindPipelineShaderGroupNV)gpa(device, "vkCmdBindPipelineShaderGroupNV"); table->CreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)gpa(device, "vkCreateIndirectCommandsLayoutNV"); - table->DestroyIndirectCommandsLayoutNV = - (PFN_vkDestroyIndirectCommandsLayoutNV)gpa(device, "vkDestroyIndirectCommandsLayoutNV"); + table->DestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)gpa(device, "vkDestroyIndirectCommandsLayoutNV"); + table->CmdSetDepthBias2EXT = (PFN_vkCmdSetDepthBias2EXT)gpa(device, "vkCmdSetDepthBias2EXT"); table->CreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)gpa(device, "vkCreatePrivateDataSlotEXT"); table->DestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)gpa(device, "vkDestroyPrivateDataSlotEXT"); table->SetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)gpa(device, "vkSetPrivateDataEXT"); table->GetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)gpa(device, "vkGetPrivateDataEXT"); + table->CreateCudaModuleNV = (PFN_vkCreateCudaModuleNV)gpa(device, "vkCreateCudaModuleNV"); + table->GetCudaModuleCacheNV = (PFN_vkGetCudaModuleCacheNV)gpa(device, "vkGetCudaModuleCacheNV"); + table->CreateCudaFunctionNV = (PFN_vkCreateCudaFunctionNV)gpa(device, "vkCreateCudaFunctionNV"); + table->DestroyCudaModuleNV = (PFN_vkDestroyCudaModuleNV)gpa(device, "vkDestroyCudaModuleNV"); + table->DestroyCudaFunctionNV = (PFN_vkDestroyCudaFunctionNV)gpa(device, "vkDestroyCudaFunctionNV"); + table->CmdCudaLaunchKernelNV = (PFN_vkCmdCudaLaunchKernelNV)gpa(device, "vkCmdCudaLaunchKernelNV"); #if defined(VK_USE_PLATFORM_METAL_EXT) table->ExportMetalObjectsEXT = (PFN_vkExportMetalObjectsEXT)gpa(device, "vkExportMetalObjectsEXT"); #endif // VK_USE_PLATFORM_METAL_EXT table->GetDescriptorSetLayoutSizeEXT = (PFN_vkGetDescriptorSetLayoutSizeEXT)gpa(device, "vkGetDescriptorSetLayoutSizeEXT"); - table->GetDescriptorSetLayoutBindingOffsetEXT = - (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)gpa(device, "vkGetDescriptorSetLayoutBindingOffsetEXT"); + table->GetDescriptorSetLayoutBindingOffsetEXT = (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)gpa(device, "vkGetDescriptorSetLayoutBindingOffsetEXT"); table->GetDescriptorEXT = (PFN_vkGetDescriptorEXT)gpa(device, "vkGetDescriptorEXT"); table->CmdBindDescriptorBuffersEXT = (PFN_vkCmdBindDescriptorBuffersEXT)gpa(device, "vkCmdBindDescriptorBuffersEXT"); - table->CmdSetDescriptorBufferOffsetsEXT = - (PFN_vkCmdSetDescriptorBufferOffsetsEXT)gpa(device, "vkCmdSetDescriptorBufferOffsetsEXT"); - table->CmdBindDescriptorBufferEmbeddedSamplersEXT = - (PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT)gpa(device, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT"); - table->GetBufferOpaqueCaptureDescriptorDataEXT = - (PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetBufferOpaqueCaptureDescriptorDataEXT"); - table->GetImageOpaqueCaptureDescriptorDataEXT = - (PFN_vkGetImageOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetImageOpaqueCaptureDescriptorDataEXT"); - table->GetImageViewOpaqueCaptureDescriptorDataEXT = - (PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetImageViewOpaqueCaptureDescriptorDataEXT"); - table->GetSamplerOpaqueCaptureDescriptorDataEXT = - (PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetSamplerOpaqueCaptureDescriptorDataEXT"); - table->GetAccelerationStructureOpaqueCaptureDescriptorDataEXT = - (PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)gpa( - device, "vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT"); - table->CmdSetFragmentShadingRateEnumNV = - (PFN_vkCmdSetFragmentShadingRateEnumNV)gpa(device, "vkCmdSetFragmentShadingRateEnumNV"); - table->GetImageSubresourceLayout2EXT = (PFN_vkGetImageSubresourceLayout2EXT)gpa(device, "vkGetImageSubresourceLayout2EXT"); + table->CmdSetDescriptorBufferOffsetsEXT = (PFN_vkCmdSetDescriptorBufferOffsetsEXT)gpa(device, "vkCmdSetDescriptorBufferOffsetsEXT"); + table->CmdBindDescriptorBufferEmbeddedSamplersEXT = (PFN_vkCmdBindDescriptorBufferEmbeddedSamplersEXT)gpa(device, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT"); + table->GetBufferOpaqueCaptureDescriptorDataEXT = (PFN_vkGetBufferOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetBufferOpaqueCaptureDescriptorDataEXT"); + table->GetImageOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetImageOpaqueCaptureDescriptorDataEXT"); + table->GetImageViewOpaqueCaptureDescriptorDataEXT = (PFN_vkGetImageViewOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetImageViewOpaqueCaptureDescriptorDataEXT"); + table->GetSamplerOpaqueCaptureDescriptorDataEXT = (PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetSamplerOpaqueCaptureDescriptorDataEXT"); + table->GetAccelerationStructureOpaqueCaptureDescriptorDataEXT = (PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)gpa(device, "vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT"); + table->CmdSetFragmentShadingRateEnumNV = (PFN_vkCmdSetFragmentShadingRateEnumNV)gpa(device, "vkCmdSetFragmentShadingRateEnumNV"); table->GetDeviceFaultInfoEXT = (PFN_vkGetDeviceFaultInfoEXT)gpa(device, "vkGetDeviceFaultInfoEXT"); table->CmdSetVertexInputEXT = (PFN_vkCmdSetVertexInputEXT)gpa(device, "vkCmdSetVertexInputEXT"); #if defined(VK_USE_PLATFORM_FUCHSIA) table->GetMemoryZirconHandleFUCHSIA = (PFN_vkGetMemoryZirconHandleFUCHSIA)gpa(device, "vkGetMemoryZirconHandleFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->GetMemoryZirconHandlePropertiesFUCHSIA = - (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)gpa(device, "vkGetMemoryZirconHandlePropertiesFUCHSIA"); + table->GetMemoryZirconHandlePropertiesFUCHSIA = (PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)gpa(device, "vkGetMemoryZirconHandlePropertiesFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->ImportSemaphoreZirconHandleFUCHSIA = - (PFN_vkImportSemaphoreZirconHandleFUCHSIA)gpa(device, "vkImportSemaphoreZirconHandleFUCHSIA"); + table->ImportSemaphoreZirconHandleFUCHSIA = (PFN_vkImportSemaphoreZirconHandleFUCHSIA)gpa(device, "vkImportSemaphoreZirconHandleFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->GetSemaphoreZirconHandleFUCHSIA = - (PFN_vkGetSemaphoreZirconHandleFUCHSIA)gpa(device, "vkGetSemaphoreZirconHandleFUCHSIA"); + table->GetSemaphoreZirconHandleFUCHSIA = (PFN_vkGetSemaphoreZirconHandleFUCHSIA)gpa(device, "vkGetSemaphoreZirconHandleFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) table->CreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)gpa(device, "vkCreateBufferCollectionFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->SetBufferCollectionImageConstraintsFUCHSIA = - (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)gpa(device, "vkSetBufferCollectionImageConstraintsFUCHSIA"); + table->SetBufferCollectionImageConstraintsFUCHSIA = (PFN_vkSetBufferCollectionImageConstraintsFUCHSIA)gpa(device, "vkSetBufferCollectionImageConstraintsFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->SetBufferCollectionBufferConstraintsFUCHSIA = - (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)gpa(device, "vkSetBufferCollectionBufferConstraintsFUCHSIA"); + table->SetBufferCollectionBufferConstraintsFUCHSIA = (PFN_vkSetBufferCollectionBufferConstraintsFUCHSIA)gpa(device, "vkSetBufferCollectionBufferConstraintsFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) table->DestroyBufferCollectionFUCHSIA = (PFN_vkDestroyBufferCollectionFUCHSIA)gpa(device, "vkDestroyBufferCollectionFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_FUCHSIA) - table->GetBufferCollectionPropertiesFUCHSIA = - (PFN_vkGetBufferCollectionPropertiesFUCHSIA)gpa(device, "vkGetBufferCollectionPropertiesFUCHSIA"); + table->GetBufferCollectionPropertiesFUCHSIA = (PFN_vkGetBufferCollectionPropertiesFUCHSIA)gpa(device, "vkGetBufferCollectionPropertiesFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA - table->GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = - (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)gpa(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI"); + table->GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = (PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI)gpa(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI"); table->CmdSubpassShadingHUAWEI = (PFN_vkCmdSubpassShadingHUAWEI)gpa(device, "vkCmdSubpassShadingHUAWEI"); table->CmdBindInvocationMaskHUAWEI = (PFN_vkCmdBindInvocationMaskHUAWEI)gpa(device, "vkCmdBindInvocationMaskHUAWEI"); table->GetMemoryRemoteAddressNV = (PFN_vkGetMemoryRemoteAddressNV)gpa(device, "vkGetMemoryRemoteAddressNV"); table->GetPipelinePropertiesEXT = (PFN_vkGetPipelinePropertiesEXT)gpa(device, "vkGetPipelinePropertiesEXT"); table->CmdSetPatchControlPointsEXT = (PFN_vkCmdSetPatchControlPointsEXT)gpa(device, "vkCmdSetPatchControlPointsEXT"); - table->CmdSetRasterizerDiscardEnableEXT = - (PFN_vkCmdSetRasterizerDiscardEnableEXT)gpa(device, "vkCmdSetRasterizerDiscardEnableEXT"); + table->CmdSetRasterizerDiscardEnableEXT = (PFN_vkCmdSetRasterizerDiscardEnableEXT)gpa(device, "vkCmdSetRasterizerDiscardEnableEXT"); table->CmdSetDepthBiasEnableEXT = (PFN_vkCmdSetDepthBiasEnableEXT)gpa(device, "vkCmdSetDepthBiasEnableEXT"); table->CmdSetLogicOpEXT = (PFN_vkCmdSetLogicOpEXT)gpa(device, "vkCmdSetLogicOpEXT"); - table->CmdSetPrimitiveRestartEnableEXT = - (PFN_vkCmdSetPrimitiveRestartEnableEXT)gpa(device, "vkCmdSetPrimitiveRestartEnableEXT"); + table->CmdSetPrimitiveRestartEnableEXT = (PFN_vkCmdSetPrimitiveRestartEnableEXT)gpa(device, "vkCmdSetPrimitiveRestartEnableEXT"); table->CmdSetColorWriteEnableEXT = (PFN_vkCmdSetColorWriteEnableEXT)gpa(device, "vkCmdSetColorWriteEnableEXT"); table->CmdDrawMultiEXT = (PFN_vkCmdDrawMultiEXT)gpa(device, "vkCmdDrawMultiEXT"); table->CmdDrawMultiIndexedEXT = (PFN_vkCmdDrawMultiIndexedEXT)gpa(device, "vkCmdDrawMultiIndexedEXT"); @@ -615,23 +600,20 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdCopyMicromapToMemoryEXT = (PFN_vkCmdCopyMicromapToMemoryEXT)gpa(device, "vkCmdCopyMicromapToMemoryEXT"); table->CmdCopyMemoryToMicromapEXT = (PFN_vkCmdCopyMemoryToMicromapEXT)gpa(device, "vkCmdCopyMemoryToMicromapEXT"); table->CmdWriteMicromapsPropertiesEXT = (PFN_vkCmdWriteMicromapsPropertiesEXT)gpa(device, "vkCmdWriteMicromapsPropertiesEXT"); - table->GetDeviceMicromapCompatibilityEXT = - (PFN_vkGetDeviceMicromapCompatibilityEXT)gpa(device, "vkGetDeviceMicromapCompatibilityEXT"); + table->GetDeviceMicromapCompatibilityEXT = (PFN_vkGetDeviceMicromapCompatibilityEXT)gpa(device, "vkGetDeviceMicromapCompatibilityEXT"); table->GetMicromapBuildSizesEXT = (PFN_vkGetMicromapBuildSizesEXT)gpa(device, "vkGetMicromapBuildSizesEXT"); table->CmdDrawClusterHUAWEI = (PFN_vkCmdDrawClusterHUAWEI)gpa(device, "vkCmdDrawClusterHUAWEI"); table->CmdDrawClusterIndirectHUAWEI = (PFN_vkCmdDrawClusterIndirectHUAWEI)gpa(device, "vkCmdDrawClusterIndirectHUAWEI"); table->SetDeviceMemoryPriorityEXT = (PFN_vkSetDeviceMemoryPriorityEXT)gpa(device, "vkSetDeviceMemoryPriorityEXT"); - table->GetDescriptorSetLayoutHostMappingInfoVALVE = - (PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)gpa(device, "vkGetDescriptorSetLayoutHostMappingInfoVALVE"); - table->GetDescriptorSetHostMappingVALVE = - (PFN_vkGetDescriptorSetHostMappingVALVE)gpa(device, "vkGetDescriptorSetHostMappingVALVE"); + table->GetDescriptorSetLayoutHostMappingInfoVALVE = (PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)gpa(device, "vkGetDescriptorSetLayoutHostMappingInfoVALVE"); + table->GetDescriptorSetHostMappingVALVE = (PFN_vkGetDescriptorSetHostMappingVALVE)gpa(device, "vkGetDescriptorSetHostMappingVALVE"); table->CmdCopyMemoryIndirectNV = (PFN_vkCmdCopyMemoryIndirectNV)gpa(device, "vkCmdCopyMemoryIndirectNV"); table->CmdCopyMemoryToImageIndirectNV = (PFN_vkCmdCopyMemoryToImageIndirectNV)gpa(device, "vkCmdCopyMemoryToImageIndirectNV"); table->CmdDecompressMemoryNV = (PFN_vkCmdDecompressMemoryNV)gpa(device, "vkCmdDecompressMemoryNV"); - table->CmdDecompressMemoryIndirectCountNV = - (PFN_vkCmdDecompressMemoryIndirectCountNV)gpa(device, "vkCmdDecompressMemoryIndirectCountNV"); - table->CmdSetTessellationDomainOriginEXT = - (PFN_vkCmdSetTessellationDomainOriginEXT)gpa(device, "vkCmdSetTessellationDomainOriginEXT"); + table->CmdDecompressMemoryIndirectCountNV = (PFN_vkCmdDecompressMemoryIndirectCountNV)gpa(device, "vkCmdDecompressMemoryIndirectCountNV"); + table->GetPipelineIndirectMemoryRequirementsNV = (PFN_vkGetPipelineIndirectMemoryRequirementsNV)gpa(device, "vkGetPipelineIndirectMemoryRequirementsNV"); + table->CmdUpdatePipelineIndirectBufferNV = (PFN_vkCmdUpdatePipelineIndirectBufferNV)gpa(device, "vkCmdUpdatePipelineIndirectBufferNV"); + table->GetPipelineIndirectDeviceAddressNV = (PFN_vkGetPipelineIndirectDeviceAddressNV)gpa(device, "vkGetPipelineIndirectDeviceAddressNV"); table->CmdSetDepthClampEnableEXT = (PFN_vkCmdSetDepthClampEnableEXT)gpa(device, "vkCmdSetDepthClampEnableEXT"); table->CmdSetPolygonModeEXT = (PFN_vkCmdSetPolygonModeEXT)gpa(device, "vkCmdSetPolygonModeEXT"); table->CmdSetRasterizationSamplesEXT = (PFN_vkCmdSetRasterizationSamplesEXT)gpa(device, "vkCmdSetRasterizationSamplesEXT"); @@ -642,155 +624,140 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->CmdSetColorBlendEnableEXT = (PFN_vkCmdSetColorBlendEnableEXT)gpa(device, "vkCmdSetColorBlendEnableEXT"); table->CmdSetColorBlendEquationEXT = (PFN_vkCmdSetColorBlendEquationEXT)gpa(device, "vkCmdSetColorBlendEquationEXT"); table->CmdSetColorWriteMaskEXT = (PFN_vkCmdSetColorWriteMaskEXT)gpa(device, "vkCmdSetColorWriteMaskEXT"); + table->CmdSetTessellationDomainOriginEXT = (PFN_vkCmdSetTessellationDomainOriginEXT)gpa(device, "vkCmdSetTessellationDomainOriginEXT"); table->CmdSetRasterizationStreamEXT = (PFN_vkCmdSetRasterizationStreamEXT)gpa(device, "vkCmdSetRasterizationStreamEXT"); - table->CmdSetConservativeRasterizationModeEXT = - (PFN_vkCmdSetConservativeRasterizationModeEXT)gpa(device, "vkCmdSetConservativeRasterizationModeEXT"); - table->CmdSetExtraPrimitiveOverestimationSizeEXT = - (PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT)gpa(device, "vkCmdSetExtraPrimitiveOverestimationSizeEXT"); + table->CmdSetConservativeRasterizationModeEXT = (PFN_vkCmdSetConservativeRasterizationModeEXT)gpa(device, "vkCmdSetConservativeRasterizationModeEXT"); + table->CmdSetExtraPrimitiveOverestimationSizeEXT = (PFN_vkCmdSetExtraPrimitiveOverestimationSizeEXT)gpa(device, "vkCmdSetExtraPrimitiveOverestimationSizeEXT"); table->CmdSetDepthClipEnableEXT = (PFN_vkCmdSetDepthClipEnableEXT)gpa(device, "vkCmdSetDepthClipEnableEXT"); table->CmdSetSampleLocationsEnableEXT = (PFN_vkCmdSetSampleLocationsEnableEXT)gpa(device, "vkCmdSetSampleLocationsEnableEXT"); table->CmdSetColorBlendAdvancedEXT = (PFN_vkCmdSetColorBlendAdvancedEXT)gpa(device, "vkCmdSetColorBlendAdvancedEXT"); table->CmdSetProvokingVertexModeEXT = (PFN_vkCmdSetProvokingVertexModeEXT)gpa(device, "vkCmdSetProvokingVertexModeEXT"); table->CmdSetLineRasterizationModeEXT = (PFN_vkCmdSetLineRasterizationModeEXT)gpa(device, "vkCmdSetLineRasterizationModeEXT"); table->CmdSetLineStippleEnableEXT = (PFN_vkCmdSetLineStippleEnableEXT)gpa(device, "vkCmdSetLineStippleEnableEXT"); - table->CmdSetDepthClipNegativeOneToOneEXT = - (PFN_vkCmdSetDepthClipNegativeOneToOneEXT)gpa(device, "vkCmdSetDepthClipNegativeOneToOneEXT"); + table->CmdSetDepthClipNegativeOneToOneEXT = (PFN_vkCmdSetDepthClipNegativeOneToOneEXT)gpa(device, "vkCmdSetDepthClipNegativeOneToOneEXT"); table->CmdSetViewportWScalingEnableNV = (PFN_vkCmdSetViewportWScalingEnableNV)gpa(device, "vkCmdSetViewportWScalingEnableNV"); table->CmdSetViewportSwizzleNV = (PFN_vkCmdSetViewportSwizzleNV)gpa(device, "vkCmdSetViewportSwizzleNV"); table->CmdSetCoverageToColorEnableNV = (PFN_vkCmdSetCoverageToColorEnableNV)gpa(device, "vkCmdSetCoverageToColorEnableNV"); - table->CmdSetCoverageToColorLocationNV = - (PFN_vkCmdSetCoverageToColorLocationNV)gpa(device, "vkCmdSetCoverageToColorLocationNV"); + table->CmdSetCoverageToColorLocationNV = (PFN_vkCmdSetCoverageToColorLocationNV)gpa(device, "vkCmdSetCoverageToColorLocationNV"); table->CmdSetCoverageModulationModeNV = (PFN_vkCmdSetCoverageModulationModeNV)gpa(device, "vkCmdSetCoverageModulationModeNV"); - table->CmdSetCoverageModulationTableEnableNV = - (PFN_vkCmdSetCoverageModulationTableEnableNV)gpa(device, "vkCmdSetCoverageModulationTableEnableNV"); - table->CmdSetCoverageModulationTableNV = - (PFN_vkCmdSetCoverageModulationTableNV)gpa(device, "vkCmdSetCoverageModulationTableNV"); + table->CmdSetCoverageModulationTableEnableNV = (PFN_vkCmdSetCoverageModulationTableEnableNV)gpa(device, "vkCmdSetCoverageModulationTableEnableNV"); + table->CmdSetCoverageModulationTableNV = (PFN_vkCmdSetCoverageModulationTableNV)gpa(device, "vkCmdSetCoverageModulationTableNV"); table->CmdSetShadingRateImageEnableNV = (PFN_vkCmdSetShadingRateImageEnableNV)gpa(device, "vkCmdSetShadingRateImageEnableNV"); - table->CmdSetRepresentativeFragmentTestEnableNV = - (PFN_vkCmdSetRepresentativeFragmentTestEnableNV)gpa(device, "vkCmdSetRepresentativeFragmentTestEnableNV"); + table->CmdSetRepresentativeFragmentTestEnableNV = (PFN_vkCmdSetRepresentativeFragmentTestEnableNV)gpa(device, "vkCmdSetRepresentativeFragmentTestEnableNV"); table->CmdSetCoverageReductionModeNV = (PFN_vkCmdSetCoverageReductionModeNV)gpa(device, "vkCmdSetCoverageReductionModeNV"); table->GetShaderModuleIdentifierEXT = (PFN_vkGetShaderModuleIdentifierEXT)gpa(device, "vkGetShaderModuleIdentifierEXT"); - table->GetShaderModuleCreateInfoIdentifierEXT = - (PFN_vkGetShaderModuleCreateInfoIdentifierEXT)gpa(device, "vkGetShaderModuleCreateInfoIdentifierEXT"); + table->GetShaderModuleCreateInfoIdentifierEXT = (PFN_vkGetShaderModuleCreateInfoIdentifierEXT)gpa(device, "vkGetShaderModuleCreateInfoIdentifierEXT"); table->CreateOpticalFlowSessionNV = (PFN_vkCreateOpticalFlowSessionNV)gpa(device, "vkCreateOpticalFlowSessionNV"); table->DestroyOpticalFlowSessionNV = (PFN_vkDestroyOpticalFlowSessionNV)gpa(device, "vkDestroyOpticalFlowSessionNV"); table->BindOpticalFlowSessionImageNV = (PFN_vkBindOpticalFlowSessionImageNV)gpa(device, "vkBindOpticalFlowSessionImageNV"); table->CmdOpticalFlowExecuteNV = (PFN_vkCmdOpticalFlowExecuteNV)gpa(device, "vkCmdOpticalFlowExecuteNV"); + table->AntiLagUpdateAMD = (PFN_vkAntiLagUpdateAMD)gpa(device, "vkAntiLagUpdateAMD"); table->CreateShadersEXT = (PFN_vkCreateShadersEXT)gpa(device, "vkCreateShadersEXT"); table->DestroyShaderEXT = (PFN_vkDestroyShaderEXT)gpa(device, "vkDestroyShaderEXT"); table->GetShaderBinaryDataEXT = (PFN_vkGetShaderBinaryDataEXT)gpa(device, "vkGetShaderBinaryDataEXT"); table->CmdBindShadersEXT = (PFN_vkCmdBindShadersEXT)gpa(device, "vkCmdBindShadersEXT"); - table->GetFramebufferTilePropertiesQCOM = - (PFN_vkGetFramebufferTilePropertiesQCOM)gpa(device, "vkGetFramebufferTilePropertiesQCOM"); - table->GetDynamicRenderingTilePropertiesQCOM = - (PFN_vkGetDynamicRenderingTilePropertiesQCOM)gpa(device, "vkGetDynamicRenderingTilePropertiesQCOM"); - table->CmdSetAttachmentFeedbackLoopEnableEXT = - (PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)gpa(device, "vkCmdSetAttachmentFeedbackLoopEnableEXT"); + table->CmdSetDepthClampRangeEXT = (PFN_vkCmdSetDepthClampRangeEXT)gpa(device, "vkCmdSetDepthClampRangeEXT"); + table->GetFramebufferTilePropertiesQCOM = (PFN_vkGetFramebufferTilePropertiesQCOM)gpa(device, "vkGetFramebufferTilePropertiesQCOM"); + table->GetDynamicRenderingTilePropertiesQCOM = (PFN_vkGetDynamicRenderingTilePropertiesQCOM)gpa(device, "vkGetDynamicRenderingTilePropertiesQCOM"); + table->ConvertCooperativeVectorMatrixNV = (PFN_vkConvertCooperativeVectorMatrixNV)gpa(device, "vkConvertCooperativeVectorMatrixNV"); + table->CmdConvertCooperativeVectorMatrixNV = (PFN_vkCmdConvertCooperativeVectorMatrixNV)gpa(device, "vkCmdConvertCooperativeVectorMatrixNV"); + table->SetLatencySleepModeNV = (PFN_vkSetLatencySleepModeNV)gpa(device, "vkSetLatencySleepModeNV"); + table->LatencySleepNV = (PFN_vkLatencySleepNV)gpa(device, "vkLatencySleepNV"); + table->SetLatencyMarkerNV = (PFN_vkSetLatencyMarkerNV)gpa(device, "vkSetLatencyMarkerNV"); + table->GetLatencyTimingsNV = (PFN_vkGetLatencyTimingsNV)gpa(device, "vkGetLatencyTimingsNV"); + table->QueueNotifyOutOfBandNV = (PFN_vkQueueNotifyOutOfBandNV)gpa(device, "vkQueueNotifyOutOfBandNV"); + table->CmdSetAttachmentFeedbackLoopEnableEXT = (PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)gpa(device, "vkCmdSetAttachmentFeedbackLoopEnableEXT"); +#if defined(VK_USE_PLATFORM_SCREEN_QNX) + table->GetScreenBufferPropertiesQNX = (PFN_vkGetScreenBufferPropertiesQNX)gpa(device, "vkGetScreenBufferPropertiesQNX"); +#endif // VK_USE_PLATFORM_SCREEN_QNX + table->GetClusterAccelerationStructureBuildSizesNV = (PFN_vkGetClusterAccelerationStructureBuildSizesNV)gpa(device, "vkGetClusterAccelerationStructureBuildSizesNV"); + table->CmdBuildClusterAccelerationStructureIndirectNV = (PFN_vkCmdBuildClusterAccelerationStructureIndirectNV)gpa(device, "vkCmdBuildClusterAccelerationStructureIndirectNV"); + table->GetPartitionedAccelerationStructuresBuildSizesNV = (PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV)gpa(device, "vkGetPartitionedAccelerationStructuresBuildSizesNV"); + table->CmdBuildPartitionedAccelerationStructuresNV = (PFN_vkCmdBuildPartitionedAccelerationStructuresNV)gpa(device, "vkCmdBuildPartitionedAccelerationStructuresNV"); + table->GetGeneratedCommandsMemoryRequirementsEXT = (PFN_vkGetGeneratedCommandsMemoryRequirementsEXT)gpa(device, "vkGetGeneratedCommandsMemoryRequirementsEXT"); + table->CmdPreprocessGeneratedCommandsEXT = (PFN_vkCmdPreprocessGeneratedCommandsEXT)gpa(device, "vkCmdPreprocessGeneratedCommandsEXT"); + table->CmdExecuteGeneratedCommandsEXT = (PFN_vkCmdExecuteGeneratedCommandsEXT)gpa(device, "vkCmdExecuteGeneratedCommandsEXT"); + table->CreateIndirectCommandsLayoutEXT = (PFN_vkCreateIndirectCommandsLayoutEXT)gpa(device, "vkCreateIndirectCommandsLayoutEXT"); + table->DestroyIndirectCommandsLayoutEXT = (PFN_vkDestroyIndirectCommandsLayoutEXT)gpa(device, "vkDestroyIndirectCommandsLayoutEXT"); + table->CreateIndirectExecutionSetEXT = (PFN_vkCreateIndirectExecutionSetEXT)gpa(device, "vkCreateIndirectExecutionSetEXT"); + table->DestroyIndirectExecutionSetEXT = (PFN_vkDestroyIndirectExecutionSetEXT)gpa(device, "vkDestroyIndirectExecutionSetEXT"); + table->UpdateIndirectExecutionSetPipelineEXT = (PFN_vkUpdateIndirectExecutionSetPipelineEXT)gpa(device, "vkUpdateIndirectExecutionSetPipelineEXT"); + table->UpdateIndirectExecutionSetShaderEXT = (PFN_vkUpdateIndirectExecutionSetShaderEXT)gpa(device, "vkUpdateIndirectExecutionSetShaderEXT"); +#if defined(VK_USE_PLATFORM_METAL_EXT) + table->GetMemoryMetalHandleEXT = (PFN_vkGetMemoryMetalHandleEXT)gpa(device, "vkGetMemoryMetalHandleEXT"); +#endif // VK_USE_PLATFORM_METAL_EXT +#if defined(VK_USE_PLATFORM_METAL_EXT) + table->GetMemoryMetalHandlePropertiesEXT = (PFN_vkGetMemoryMetalHandlePropertiesEXT)gpa(device, "vkGetMemoryMetalHandlePropertiesEXT"); +#endif // VK_USE_PLATFORM_METAL_EXT table->CreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)gpa(device, "vkCreateAccelerationStructureKHR"); - table->DestroyAccelerationStructureKHR = - (PFN_vkDestroyAccelerationStructureKHR)gpa(device, "vkDestroyAccelerationStructureKHR"); - table->CmdBuildAccelerationStructuresKHR = - (PFN_vkCmdBuildAccelerationStructuresKHR)gpa(device, "vkCmdBuildAccelerationStructuresKHR"); - table->CmdBuildAccelerationStructuresIndirectKHR = - (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)gpa(device, "vkCmdBuildAccelerationStructuresIndirectKHR"); + table->DestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)gpa(device, "vkDestroyAccelerationStructureKHR"); + table->CmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)gpa(device, "vkCmdBuildAccelerationStructuresKHR"); + table->CmdBuildAccelerationStructuresIndirectKHR = (PFN_vkCmdBuildAccelerationStructuresIndirectKHR)gpa(device, "vkCmdBuildAccelerationStructuresIndirectKHR"); table->BuildAccelerationStructuresKHR = (PFN_vkBuildAccelerationStructuresKHR)gpa(device, "vkBuildAccelerationStructuresKHR"); table->CopyAccelerationStructureKHR = (PFN_vkCopyAccelerationStructureKHR)gpa(device, "vkCopyAccelerationStructureKHR"); - table->CopyAccelerationStructureToMemoryKHR = - (PFN_vkCopyAccelerationStructureToMemoryKHR)gpa(device, "vkCopyAccelerationStructureToMemoryKHR"); - table->CopyMemoryToAccelerationStructureKHR = - (PFN_vkCopyMemoryToAccelerationStructureKHR)gpa(device, "vkCopyMemoryToAccelerationStructureKHR"); - table->WriteAccelerationStructuresPropertiesKHR = - (PFN_vkWriteAccelerationStructuresPropertiesKHR)gpa(device, "vkWriteAccelerationStructuresPropertiesKHR"); - table->CmdCopyAccelerationStructureKHR = - (PFN_vkCmdCopyAccelerationStructureKHR)gpa(device, "vkCmdCopyAccelerationStructureKHR"); - table->CmdCopyAccelerationStructureToMemoryKHR = - (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)gpa(device, "vkCmdCopyAccelerationStructureToMemoryKHR"); - table->CmdCopyMemoryToAccelerationStructureKHR = - (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)gpa(device, "vkCmdCopyMemoryToAccelerationStructureKHR"); - table->GetAccelerationStructureDeviceAddressKHR = - (PFN_vkGetAccelerationStructureDeviceAddressKHR)gpa(device, "vkGetAccelerationStructureDeviceAddressKHR"); - table->CmdWriteAccelerationStructuresPropertiesKHR = - (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)gpa(device, "vkCmdWriteAccelerationStructuresPropertiesKHR"); - table->GetDeviceAccelerationStructureCompatibilityKHR = - (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)gpa(device, "vkGetDeviceAccelerationStructureCompatibilityKHR"); - table->GetAccelerationStructureBuildSizesKHR = - (PFN_vkGetAccelerationStructureBuildSizesKHR)gpa(device, "vkGetAccelerationStructureBuildSizesKHR"); + table->CopyAccelerationStructureToMemoryKHR = (PFN_vkCopyAccelerationStructureToMemoryKHR)gpa(device, "vkCopyAccelerationStructureToMemoryKHR"); + table->CopyMemoryToAccelerationStructureKHR = (PFN_vkCopyMemoryToAccelerationStructureKHR)gpa(device, "vkCopyMemoryToAccelerationStructureKHR"); + table->WriteAccelerationStructuresPropertiesKHR = (PFN_vkWriteAccelerationStructuresPropertiesKHR)gpa(device, "vkWriteAccelerationStructuresPropertiesKHR"); + table->CmdCopyAccelerationStructureKHR = (PFN_vkCmdCopyAccelerationStructureKHR)gpa(device, "vkCmdCopyAccelerationStructureKHR"); + table->CmdCopyAccelerationStructureToMemoryKHR = (PFN_vkCmdCopyAccelerationStructureToMemoryKHR)gpa(device, "vkCmdCopyAccelerationStructureToMemoryKHR"); + table->CmdCopyMemoryToAccelerationStructureKHR = (PFN_vkCmdCopyMemoryToAccelerationStructureKHR)gpa(device, "vkCmdCopyMemoryToAccelerationStructureKHR"); + table->GetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)gpa(device, "vkGetAccelerationStructureDeviceAddressKHR"); + table->CmdWriteAccelerationStructuresPropertiesKHR = (PFN_vkCmdWriteAccelerationStructuresPropertiesKHR)gpa(device, "vkCmdWriteAccelerationStructuresPropertiesKHR"); + table->GetDeviceAccelerationStructureCompatibilityKHR = (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)gpa(device, "vkGetDeviceAccelerationStructureCompatibilityKHR"); + table->GetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)gpa(device, "vkGetAccelerationStructureBuildSizesKHR"); table->CmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)gpa(device, "vkCmdTraceRaysKHR"); table->CreateRayTracingPipelinesKHR = (PFN_vkCreateRayTracingPipelinesKHR)gpa(device, "vkCreateRayTracingPipelinesKHR"); - table->GetRayTracingCaptureReplayShaderGroupHandlesKHR = - (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)gpa(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR"); + table->GetRayTracingCaptureReplayShaderGroupHandlesKHR = (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)gpa(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR"); table->CmdTraceRaysIndirectKHR = (PFN_vkCmdTraceRaysIndirectKHR)gpa(device, "vkCmdTraceRaysIndirectKHR"); - table->GetRayTracingShaderGroupStackSizeKHR = - (PFN_vkGetRayTracingShaderGroupStackSizeKHR)gpa(device, "vkGetRayTracingShaderGroupStackSizeKHR"); - table->CmdSetRayTracingPipelineStackSizeKHR = - (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)gpa(device, "vkCmdSetRayTracingPipelineStackSizeKHR"); + table->GetRayTracingShaderGroupStackSizeKHR = (PFN_vkGetRayTracingShaderGroupStackSizeKHR)gpa(device, "vkGetRayTracingShaderGroupStackSizeKHR"); + table->CmdSetRayTracingPipelineStackSizeKHR = (PFN_vkCmdSetRayTracingPipelineStackSizeKHR)gpa(device, "vkCmdSetRayTracingPipelineStackSizeKHR"); table->CmdDrawMeshTasksEXT = (PFN_vkCmdDrawMeshTasksEXT)gpa(device, "vkCmdDrawMeshTasksEXT"); table->CmdDrawMeshTasksIndirectEXT = (PFN_vkCmdDrawMeshTasksIndirectEXT)gpa(device, "vkCmdDrawMeshTasksIndirectEXT"); - table->CmdDrawMeshTasksIndirectCountEXT = - (PFN_vkCmdDrawMeshTasksIndirectCountEXT)gpa(device, "vkCmdDrawMeshTasksIndirectCountEXT"); + table->CmdDrawMeshTasksIndirectCountEXT = (PFN_vkCmdDrawMeshTasksIndirectCountEXT)gpa(device, "vkCmdDrawMeshTasksIndirectCountEXT"); } -static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLayerInstanceDispatchTable *table, - PFN_vkGetInstanceProcAddr gpa) { +static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLayerInstanceDispatchTable *table, PFN_vkGetInstanceProcAddr gpa) { memset(table, 0, sizeof(*table)); // Instance function pointers + table->CreateInstance = (PFN_vkCreateInstance)gpa(instance, "vkCreateInstance"); table->DestroyInstance = (PFN_vkDestroyInstance)gpa(instance, "vkDestroyInstance"); table->EnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)gpa(instance, "vkEnumeratePhysicalDevices"); table->GetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)gpa(instance, "vkGetPhysicalDeviceFeatures"); - table->GetPhysicalDeviceFormatProperties = - (PFN_vkGetPhysicalDeviceFormatProperties)gpa(instance, "vkGetPhysicalDeviceFormatProperties"); - table->GetPhysicalDeviceImageFormatProperties = - (PFN_vkGetPhysicalDeviceImageFormatProperties)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties"); + table->GetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)gpa(instance, "vkGetPhysicalDeviceFormatProperties"); + table->GetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties"); table->GetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)gpa(instance, "vkGetPhysicalDeviceProperties"); - table->GetPhysicalDeviceQueueFamilyProperties = - (PFN_vkGetPhysicalDeviceQueueFamilyProperties)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties"); - table->GetPhysicalDeviceMemoryProperties = - (PFN_vkGetPhysicalDeviceMemoryProperties)gpa(instance, "vkGetPhysicalDeviceMemoryProperties"); + table->GetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties"); + table->GetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)gpa(instance, "vkGetPhysicalDeviceMemoryProperties"); table->GetInstanceProcAddr = gpa; - table->EnumerateDeviceExtensionProperties = - (PFN_vkEnumerateDeviceExtensionProperties)gpa(instance, "vkEnumerateDeviceExtensionProperties"); + table->CreateDevice = (PFN_vkCreateDevice)gpa(instance, "vkCreateDevice"); + table->EnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)gpa(instance, "vkEnumerateInstanceExtensionProperties"); + table->EnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)gpa(instance, "vkEnumerateDeviceExtensionProperties"); + table->EnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)gpa(instance, "vkEnumerateInstanceLayerProperties"); table->EnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)gpa(instance, "vkEnumerateDeviceLayerProperties"); - table->GetPhysicalDeviceSparseImageFormatProperties = - (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties"); + table->GetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties"); + table->EnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)gpa(instance, "vkEnumerateInstanceVersion"); table->EnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups)gpa(instance, "vkEnumeratePhysicalDeviceGroups"); table->GetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2)gpa(instance, "vkGetPhysicalDeviceFeatures2"); table->GetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2)gpa(instance, "vkGetPhysicalDeviceProperties2"); - table->GetPhysicalDeviceFormatProperties2 = - (PFN_vkGetPhysicalDeviceFormatProperties2)gpa(instance, "vkGetPhysicalDeviceFormatProperties2"); - table->GetPhysicalDeviceImageFormatProperties2 = - (PFN_vkGetPhysicalDeviceImageFormatProperties2)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties2"); - table->GetPhysicalDeviceQueueFamilyProperties2 = - (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties2"); - table->GetPhysicalDeviceMemoryProperties2 = - (PFN_vkGetPhysicalDeviceMemoryProperties2)gpa(instance, "vkGetPhysicalDeviceMemoryProperties2"); - table->GetPhysicalDeviceSparseImageFormatProperties2 = - (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2"); - table->GetPhysicalDeviceExternalBufferProperties = - (PFN_vkGetPhysicalDeviceExternalBufferProperties)gpa(instance, "vkGetPhysicalDeviceExternalBufferProperties"); - table->GetPhysicalDeviceExternalFenceProperties = - (PFN_vkGetPhysicalDeviceExternalFenceProperties)gpa(instance, "vkGetPhysicalDeviceExternalFenceProperties"); - table->GetPhysicalDeviceExternalSemaphoreProperties = - (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)gpa(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties"); - table->GetPhysicalDeviceToolProperties = - (PFN_vkGetPhysicalDeviceToolProperties)gpa(instance, "vkGetPhysicalDeviceToolProperties"); + table->GetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2)gpa(instance, "vkGetPhysicalDeviceFormatProperties2"); + table->GetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties2"); + table->GetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties2"); + table->GetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)gpa(instance, "vkGetPhysicalDeviceMemoryProperties2"); + table->GetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2"); + table->GetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties)gpa(instance, "vkGetPhysicalDeviceExternalBufferProperties"); + table->GetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties)gpa(instance, "vkGetPhysicalDeviceExternalFenceProperties"); + table->GetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)gpa(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties"); + table->GetPhysicalDeviceToolProperties = (PFN_vkGetPhysicalDeviceToolProperties)gpa(instance, "vkGetPhysicalDeviceToolProperties"); table->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR"); - table->GetPhysicalDeviceSurfaceSupportKHR = - (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); - table->GetPhysicalDeviceSurfaceCapabilitiesKHR = - (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); - table->GetPhysicalDeviceSurfaceFormatsKHR = - (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); - table->GetPhysicalDeviceSurfacePresentModesKHR = - (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); - table->GetPhysicalDevicePresentRectanglesKHR = - (PFN_vkGetPhysicalDevicePresentRectanglesKHR)gpa(instance, "vkGetPhysicalDevicePresentRectanglesKHR"); - table->GetPhysicalDeviceDisplayPropertiesKHR = - (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR"); - table->GetPhysicalDeviceDisplayPlanePropertiesKHR = - (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"); - table->GetDisplayPlaneSupportedDisplaysKHR = - (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(instance, "vkGetDisplayPlaneSupportedDisplaysKHR"); + table->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); + table->GetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); + table->GetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); + table->GetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); + table->GetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR)gpa(instance, "vkGetPhysicalDevicePresentRectanglesKHR"); + table->GetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR"); + table->GetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"); + table->GetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(instance, "vkGetDisplayPlaneSupportedDisplaysKHR"); table->GetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)gpa(instance, "vkGetDisplayModePropertiesKHR"); table->CreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)gpa(instance, "vkCreateDisplayModeKHR"); table->GetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(instance, "vkGetDisplayPlaneCapabilitiesKHR"); @@ -799,22 +766,19 @@ static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLay table->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR"); #endif // VK_USE_PLATFORM_XLIB_KHR #if defined(VK_USE_PLATFORM_XLIB_KHR) - table->GetPhysicalDeviceXlibPresentationSupportKHR = - (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); + table->GetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); #endif // VK_USE_PLATFORM_XLIB_KHR #if defined(VK_USE_PLATFORM_XCB_KHR) table->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR"); #endif // VK_USE_PLATFORM_XCB_KHR #if defined(VK_USE_PLATFORM_XCB_KHR) - table->GetPhysicalDeviceXcbPresentationSupportKHR = - (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"); + table->GetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"); #endif // VK_USE_PLATFORM_XCB_KHR #if defined(VK_USE_PLATFORM_WAYLAND_KHR) table->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR"); #endif // VK_USE_PLATFORM_WAYLAND_KHR #if defined(VK_USE_PLATFORM_WAYLAND_KHR) - table->GetPhysicalDeviceWaylandPresentationSupportKHR = - (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"); + table->GetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"); #endif // VK_USE_PLATFORM_WAYLAND_KHR #if defined(VK_USE_PLATFORM_ANDROID_KHR) table->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR"); @@ -823,65 +787,40 @@ static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLay table->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR"); #endif // VK_USE_PLATFORM_WIN32_KHR #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->GetPhysicalDeviceWin32PresentationSupportKHR = - (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); + table->GetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); #endif // VK_USE_PLATFORM_WIN32_KHR - table->GetPhysicalDeviceVideoCapabilitiesKHR = - (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR"); - table->GetPhysicalDeviceVideoFormatPropertiesKHR = - (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR"); + table->GetPhysicalDeviceVideoCapabilitiesKHR = (PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR"); + table->GetPhysicalDeviceVideoFormatPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR"); table->GetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)gpa(instance, "vkGetPhysicalDeviceFeatures2KHR"); - table->GetPhysicalDeviceProperties2KHR = - (PFN_vkGetPhysicalDeviceProperties2KHR)gpa(instance, "vkGetPhysicalDeviceProperties2KHR"); - table->GetPhysicalDeviceFormatProperties2KHR = - (PFN_vkGetPhysicalDeviceFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceFormatProperties2KHR"); - table->GetPhysicalDeviceImageFormatProperties2KHR = - (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR"); - table->GetPhysicalDeviceQueueFamilyProperties2KHR = - (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); - table->GetPhysicalDeviceMemoryProperties2KHR = - (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)gpa(instance, "vkGetPhysicalDeviceMemoryProperties2KHR"); - table->GetPhysicalDeviceSparseImageFormatProperties2KHR = - (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR"); - table->EnumeratePhysicalDeviceGroupsKHR = - (PFN_vkEnumeratePhysicalDeviceGroupsKHR)gpa(instance, "vkEnumeratePhysicalDeviceGroupsKHR"); - table->GetPhysicalDeviceExternalBufferPropertiesKHR = - (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR"); - table->GetPhysicalDeviceExternalSemaphorePropertiesKHR = - (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR"); - table->GetPhysicalDeviceExternalFencePropertiesKHR = - (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR"); - table->EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = - (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)gpa( - instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR"); - table->GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)gpa( - instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR"); - table->GetPhysicalDeviceSurfaceCapabilities2KHR = - (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR"); - table->GetPhysicalDeviceSurfaceFormats2KHR = - (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR"); - table->GetPhysicalDeviceDisplayProperties2KHR = - (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)gpa(instance, "vkGetPhysicalDeviceDisplayProperties2KHR"); - table->GetPhysicalDeviceDisplayPlaneProperties2KHR = - (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR"); + table->GetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)gpa(instance, "vkGetPhysicalDeviceProperties2KHR"); + table->GetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceFormatProperties2KHR"); + table->GetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR"); + table->GetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)gpa(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR"); + table->GetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)gpa(instance, "vkGetPhysicalDeviceMemoryProperties2KHR"); + table->GetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)gpa(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR"); + table->EnumeratePhysicalDeviceGroupsKHR = (PFN_vkEnumeratePhysicalDeviceGroupsKHR)gpa(instance, "vkEnumeratePhysicalDeviceGroupsKHR"); + table->GetPhysicalDeviceExternalBufferPropertiesKHR = (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR"); + table->GetPhysicalDeviceExternalSemaphorePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR"); + table->GetPhysicalDeviceExternalFencePropertiesKHR = (PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR"); + table->EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)gpa(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR"); + table->GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)gpa(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR"); + table->GetPhysicalDeviceSurfaceCapabilities2KHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR"); + table->GetPhysicalDeviceSurfaceFormats2KHR = (PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR"); + table->GetPhysicalDeviceDisplayProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayProperties2KHR)gpa(instance, "vkGetPhysicalDeviceDisplayProperties2KHR"); + table->GetPhysicalDeviceDisplayPlaneProperties2KHR = (PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR"); table->GetDisplayModeProperties2KHR = (PFN_vkGetDisplayModeProperties2KHR)gpa(instance, "vkGetDisplayModeProperties2KHR"); - table->GetDisplayPlaneCapabilities2KHR = - (PFN_vkGetDisplayPlaneCapabilities2KHR)gpa(instance, "vkGetDisplayPlaneCapabilities2KHR"); - table->GetPhysicalDeviceFragmentShadingRatesKHR = - (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)gpa(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR"); -#if defined(VK_ENABLE_BETA_EXTENSIONS) - table->GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR)gpa( - instance, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR"); -#endif // VK_ENABLE_BETA_EXTENSIONS + table->GetDisplayPlaneCapabilities2KHR = (PFN_vkGetDisplayPlaneCapabilities2KHR)gpa(instance, "vkGetDisplayPlaneCapabilities2KHR"); + table->GetPhysicalDeviceFragmentShadingRatesKHR = (PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)gpa(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR"); + table->GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = (PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR"); + table->GetPhysicalDeviceCooperativeMatrixPropertiesKHR = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR"); + table->GetPhysicalDeviceCalibrateableTimeDomainsKHR = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR)gpa(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR"); table->CreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)gpa(instance, "vkCreateDebugReportCallbackEXT"); table->DestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)gpa(instance, "vkDestroyDebugReportCallbackEXT"); table->DebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)gpa(instance, "vkDebugReportMessageEXT"); #if defined(VK_USE_PLATFORM_GGP) - table->CreateStreamDescriptorSurfaceGGP = - (PFN_vkCreateStreamDescriptorSurfaceGGP)gpa(instance, "vkCreateStreamDescriptorSurfaceGGP"); + table->CreateStreamDescriptorSurfaceGGP = (PFN_vkCreateStreamDescriptorSurfaceGGP)gpa(instance, "vkCreateStreamDescriptorSurfaceGGP"); #endif // VK_USE_PLATFORM_GGP - table->GetPhysicalDeviceExternalImageFormatPropertiesNV = - (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)gpa(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"); + table->GetPhysicalDeviceExternalImageFormatPropertiesNV = (PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)gpa(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"); #if defined(VK_USE_PLATFORM_VI_NN) table->CreateViSurfaceNN = (PFN_vkCreateViSurfaceNN)gpa(instance, "vkCreateViSurfaceNN"); #endif // VK_USE_PLATFORM_VI_NN @@ -892,8 +831,7 @@ static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLay #if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT) table->GetRandROutputDisplayEXT = (PFN_vkGetRandROutputDisplayEXT)gpa(instance, "vkGetRandROutputDisplayEXT"); #endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT - table->GetPhysicalDeviceSurfaceCapabilities2EXT = - (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT"); + table->GetPhysicalDeviceSurfaceCapabilities2EXT = (PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT"); #if defined(VK_USE_PLATFORM_IOS_MVK) table->CreateIOSSurfaceMVK = (PFN_vkCreateIOSSurfaceMVK)gpa(instance, "vkCreateIOSSurfaceMVK"); #endif // VK_USE_PLATFORM_IOS_MVK @@ -903,26 +841,19 @@ static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLay table->CreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)gpa(instance, "vkCreateDebugUtilsMessengerEXT"); table->DestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)gpa(instance, "vkDestroyDebugUtilsMessengerEXT"); table->SubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT)gpa(instance, "vkSubmitDebugUtilsMessageEXT"); - table->GetPhysicalDeviceMultisamplePropertiesEXT = - (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)gpa(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT"); - table->GetPhysicalDeviceCalibrateableTimeDomainsEXT = - (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)gpa(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT"); + table->GetPhysicalDeviceMultisamplePropertiesEXT = (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)gpa(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT"); + table->GetPhysicalDeviceCalibrateableTimeDomainsEXT = (PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT)gpa(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT"); #if defined(VK_USE_PLATFORM_FUCHSIA) table->CreateImagePipeSurfaceFUCHSIA = (PFN_vkCreateImagePipeSurfaceFUCHSIA)gpa(instance, "vkCreateImagePipeSurfaceFUCHSIA"); #endif // VK_USE_PLATFORM_FUCHSIA #if defined(VK_USE_PLATFORM_METAL_EXT) table->CreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)gpa(instance, "vkCreateMetalSurfaceEXT"); #endif // VK_USE_PLATFORM_METAL_EXT - table->GetPhysicalDeviceToolPropertiesEXT = - (PFN_vkGetPhysicalDeviceToolPropertiesEXT)gpa(instance, "vkGetPhysicalDeviceToolPropertiesEXT"); - table->GetPhysicalDeviceCooperativeMatrixPropertiesNV = - (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)gpa(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV"); - table->GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = - (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)gpa( - instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV"); + table->GetPhysicalDeviceToolPropertiesEXT = (PFN_vkGetPhysicalDeviceToolPropertiesEXT)gpa(instance, "vkGetPhysicalDeviceToolPropertiesEXT"); + table->GetPhysicalDeviceCooperativeMatrixPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)gpa(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV"); + table->GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = (PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)gpa(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV"); #if defined(VK_USE_PLATFORM_WIN32_KHR) - table->GetPhysicalDeviceSurfacePresentModes2EXT = - (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT"); + table->GetPhysicalDeviceSurfacePresentModes2EXT = (PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT"); #endif // VK_USE_PLATFORM_WIN32_KHR table->CreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)gpa(instance, "vkCreateHeadlessSurfaceEXT"); table->AcquireDrmDisplayEXT = (PFN_vkAcquireDrmDisplayEXT)gpa(instance, "vkAcquireDrmDisplayEXT"); @@ -937,16 +868,15 @@ static inline void layer_init_instance_dispatch_table(VkInstance instance, VkLay table->CreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)gpa(instance, "vkCreateDirectFBSurfaceEXT"); #endif // VK_USE_PLATFORM_DIRECTFB_EXT #if defined(VK_USE_PLATFORM_DIRECTFB_EXT) - table->GetPhysicalDeviceDirectFBPresentationSupportEXT = - (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)gpa(instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT"); + table->GetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)gpa(instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT"); #endif // VK_USE_PLATFORM_DIRECTFB_EXT #if defined(VK_USE_PLATFORM_SCREEN_QNX) table->CreateScreenSurfaceQNX = (PFN_vkCreateScreenSurfaceQNX)gpa(instance, "vkCreateScreenSurfaceQNX"); #endif // VK_USE_PLATFORM_SCREEN_QNX #if defined(VK_USE_PLATFORM_SCREEN_QNX) - table->GetPhysicalDeviceScreenPresentationSupportQNX = - (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)gpa(instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX"); + table->GetPhysicalDeviceScreenPresentationSupportQNX = (PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX)gpa(instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX"); #endif // VK_USE_PLATFORM_SCREEN_QNX - table->GetPhysicalDeviceOpticalFlowImageFormatsNV = - (PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV)gpa(instance, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV"); + table->GetPhysicalDeviceOpticalFlowImageFormatsNV = (PFN_vkGetPhysicalDeviceOpticalFlowImageFormatsNV)gpa(instance, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV"); + table->GetPhysicalDeviceCooperativeVectorPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeVectorPropertiesNV)gpa(instance, "vkGetPhysicalDeviceCooperativeVectorPropertiesNV"); + table->GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = (PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV)gpa(instance, "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV"); }