summaryrefslogtreecommitdiffstats
path: root/thirdparty/vulkan/registry/loader_extension_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/vulkan/registry/loader_extension_generator.py')
-rwxr-xr-xthirdparty/vulkan/registry/loader_extension_generator.py1571
1 files changed, 0 insertions, 1571 deletions
diff --git a/thirdparty/vulkan/registry/loader_extension_generator.py b/thirdparty/vulkan/registry/loader_extension_generator.py
deleted file mode 100755
index 49cf720c45..0000000000
--- a/thirdparty/vulkan/registry/loader_extension_generator.py
+++ /dev/null
@@ -1,1571 +0,0 @@
-#!/usr/bin/python3 -i
-#
-# Copyright (c) 2015-2017 The Khronos Group Inc.
-# Copyright (c) 2015-2017 Valve Corporation
-# Copyright (c) 2015-2017 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 Young <marky@lunarg.com>
-# Author: Mark Lobodzinski <mark@lunarg.com>
-
-import os,re,sys
-import xml.etree.ElementTree as etree
-from generator import *
-from collections import namedtuple
-from common_codegen import *
-
-
-WSI_EXT_NAMES = ['VK_KHR_surface',
- 'VK_KHR_display',
- 'VK_KHR_xlib_surface',
- 'VK_KHR_xcb_surface',
- 'VK_KHR_wayland_surface',
- 'VK_KHR_win32_surface',
- 'VK_KHR_android_surface',
- 'VK_MVK_macos_surface',
- 'VK_MVK_ios_surface',
- 'VK_EXT_headless_surface',
- 'VK_KHR_swapchain',
- 'VK_KHR_display_swapchain',
- 'VK_KHR_get_display_properties2']
-
-ADD_INST_CMDS = ['vkCreateInstance',
- 'vkEnumerateInstanceExtensionProperties',
- 'vkEnumerateInstanceLayerProperties',
- 'vkEnumerateInstanceVersion']
-
-AVOID_EXT_NAMES = ['VK_EXT_debug_report']
-
-NULL_CHECK_EXT_NAMES= ['VK_EXT_debug_utils']
-
-AVOID_CMD_NAMES = ['vkCreateDebugUtilsMessengerEXT',
- 'vkDestroyDebugUtilsMessengerEXT',
- 'vkSubmitDebugUtilsMessageEXT']
-
-DEVICE_CMDS_NEED_TERM = ['vkGetDeviceProcAddr',
- 'vkCreateSwapchainKHR',
- 'vkCreateSharedSwapchainsKHR',
- 'vkGetDeviceGroupSurfacePresentModesKHR',
- 'vkDebugMarkerSetObjectTagEXT',
- 'vkDebugMarkerSetObjectNameEXT',
- 'vkSetDebugUtilsObjectNameEXT',
- 'vkSetDebugUtilsObjectTagEXT',
- 'vkGetDeviceGroupSurfacePresentModes2EXT']
-
-ALIASED_CMDS = {
- 'vkEnumeratePhysicalDeviceGroupsKHR': 'vkEnumeratePhysicalDeviceGroups',
- 'vkGetPhysicalDeviceFeatures2KHR': 'vkGetPhysicalDeviceFeatures2',
- 'vkGetPhysicalDeviceProperties2KHR': 'vkGetPhysicalDeviceProperties2',
- 'vkGetPhysicalDeviceFormatProperties2KHR': 'vkGetPhysicalDeviceFormatProperties2',
- 'vkGetPhysicalDeviceImageFormatProperties2KHR': 'vkGetPhysicalDeviceImageFormatProperties2',
- 'vkGetPhysicalDeviceQueueFamilyProperties2KHR': 'vkGetPhysicalDeviceQueueFamilyProperties2',
- 'vkGetPhysicalDeviceMemoryProperties2KHR': 'vkGetPhysicalDeviceMemoryProperties2',
- 'vkGetPhysicalDeviceSparseImageFormatProperties2KHR': 'vkGetPhysicalDeviceSparseImageFormatProperties2',
- 'vkGetPhysicalDeviceExternalBufferPropertiesKHR': 'vkGetPhysicalDeviceExternalBufferProperties',
- 'vkGetPhysicalDeviceExternalSemaphorePropertiesKHR': 'vkGetPhysicalDeviceExternalSemaphoreProperties',
- 'vkGetPhysicalDeviceExternalFencePropertiesKHR': 'vkGetPhysicalDeviceExternalFenceProperties',
-}
-
-PRE_INSTANCE_FUNCTIONS = ['vkEnumerateInstanceExtensionProperties',
- 'vkEnumerateInstanceLayerProperties',
- 'vkEnumerateInstanceVersion']
-
-#
-# LoaderExtensionGeneratorOptions - subclass of GeneratorOptions.
-class LoaderExtensionGeneratorOptions(GeneratorOptions):
- def __init__(self,
- conventions = None,
- filename = None,
- directory = '.',
- 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, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
- self.prefixText = prefixText
- self.prefixText = None
- self.apicall = apicall
- self.apientry = apientry
- self.apientryp = apientryp
- self.alignFuncParam = alignFuncParam
- self.expandEnumerants = expandEnumerants
-
-#
-# 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'])
-
- #
- # 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-2017 The Khronos Group Inc.\n'
- copyright += ' * Copyright (c) 2015-2017 Valve Corporation\n'
- copyright += ' * Copyright (c) 2015-2017 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: Mark Lobodzinski <mark@lunarg.com>\n'
- copyright += ' * Author: Mark Young <marky@lunarg.com>\n'
- copyright += ' */\n'
-
- preamble = ''
-
- if self.genOpts.filename == 'vk_loader_extensions.h':
- preamble += '#pragma once\n'
-
- elif self.genOpts.filename == 'vk_loader_extensions.c':
- preamble += '#ifndef _GNU_SOURCE\n'
- preamble += '#define _GNU_SOURCE\n'
- preamble += '#endif\n'
- preamble += '#include <stdio.h>\n'
- preamble += '#include <stdlib.h>\n'
- preamble += '#include <string.h>\n'
- preamble += '#include "vk_loader_platform.h"\n'
- preamble += '#include "loader.h"\n'
- preamble += '#include "vk_loader_extensions.h"\n'
- preamble += '#include <vulkan/vk_icd.h>\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 += 'typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);\n'
-
- write(copyright, file=self.outFile)
- write(preamble, file=self.outFile)
-
- #
- # 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()
-
- elif self.genOpts.filename == 'vk_loader_extensions.c':
- file_data += self.OutputUtilitiesInSource()
- file_data += self.OutputIcdDispatchTableInit()
- file_data += self.OutputLoaderDispatchTables()
- 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()
-
- 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
-
- #
- # Process commands, adding to appropriate dispatch tables
- def genCmd(self, cmdinfo, name, alias):
- OutputGenerator.genCmd(self, cmdinfo, name, alias)
-
- # Get first param type
- params = cmdinfo.elem.findall('param')
- info = self.getTypeNameTuple(params[0])
-
- self.num_commands += 1
-
- if 'android' not in name:
- self.AddCommandToDispatchList(self.currentExtension, self.type, name, cmdinfo, info[0])
-
- def endFeature(self):
-
- 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))
-
- # Finish processing in superclass
- OutputGenerator.endFeature(self)
-
- #
- # 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]
- else:
- result = len
- result = str(result).replace('::', '->')
- return result
-
- #
- # 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("./extensions/extension[@name='{}']/require/command[@name='{}']/..".format(extension_name, name))
- if 'extension' in require_node.attrib:
- require = require_node.attrib['extension']
-
- 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:
- len = self.getLen(param)
- if len:
- lens.add(len)
- paramsInfo = []
- 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))
-
- 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 'VK_VERSION_' in extension_name:
- self.core_commands.append(
- self.CommandData(name=name, ext_name=extension_name,
- 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 'VK_VERSION_' in extension_name:
- self.core_commands.append(
- self.CommandData(name=name, ext_name=extension_name,
- 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]))
-
- 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]))
-
- #
- # 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)
-
- 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 *pName);\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_icd_term *icd_term, VkInstance inst,\n'
- protos += ' const PFN_vkGetInstanceProcAddr fp_gipa);\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);\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'
- protos += 'VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_icd_term *icd_term, VkInstance inst,\n'
- protos += ' const PFN_vkGetInstanceProcAddr fp_gipa);\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, NULL);\n'
- protos += '\n'
- protos += ' if (icd_term)\n'
- protos += ' loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 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
-
- #
- # Create a layer instance dispatch table from the appropriate list and return it as a string
- def OutputLayerInstanceDispatchTable(self):
- commands = []
- table = ''
- cur_extension_name = ''
-
- table += '// Instance function pointer dispatch table\n'
- table += 'typedef struct VkLayerInstanceDispatchTable_ {\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'
-
- for x in range(0, 2):
- if x == 0:
- commands = self.core_commands
- else:
- commands = self.ext_commands
-
- for cur_cmd in 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:
-
- if cur_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in cur_cmd.ext_name:
- table += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- table += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- if cur_cmd.protect is not None:
- table += '#ifdef %s\n' % cur_cmd.protect
-
- table += ' PFN_%s %s;\n' % (cur_cmd.name, base_name)
-
- if cur_cmd.protect is not None:
- table += '#endif // %s\n' % cur_cmd.protect
-
- table += '} VkLayerInstanceDispatchTable;\n\n'
- return table
-
- #
- # Create a layer device dispatch table from the appropriate list and return it as a string
- def OutputLayerDeviceDispatchTable(self):
- commands = []
- table = ''
- cur_extension_name = ''
-
- table += '// Device function pointer dispatch table\n'
- table += 'typedef struct VkLayerDispatchTable_ {\n'
-
- for x in range(0, 2):
- if x == 0:
- commands = self.core_commands
- else:
- commands = self.ext_commands
-
- for cur_cmd in 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 not is_inst_handle_type:
-
- if cur_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in cur_cmd.ext_name:
- table += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- table += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- if cur_cmd.protect is not None:
- table += '#ifdef %s\n' % cur_cmd.protect
-
- table += ' PFN_%s %s;\n' % (cur_cmd.name, base_name)
-
- if cur_cmd.protect is not None:
- table += '#endif // %s\n' % cur_cmd.protect
-
- table += '} VkLayerDispatchTable;\n\n'
- return table
-
- #
- # Create a dispatch table from the appropriate list and return it as a string
- def OutputIcdDispatchTable(self):
- commands = []
- table = ''
- cur_extension_name = ''
-
- table += '// ICD function pointer dispatch table\n'
- table += 'struct loader_icd_term_dispatch {\n'
-
- for x in range(0, 2):
- if x == 0:
- commands = self.core_commands
- else:
- commands = self.ext_commands
-
- for cur_cmd in 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 or cur_cmd.name in DEVICE_CMDS_NEED_TERM) and
- (cur_cmd.name != 'vkGetInstanceProcAddr' and cur_cmd.name != 'vkEnumerateDeviceLayerProperties')):
-
- if cur_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in cur_cmd.ext_name:
- table += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- table += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- if cur_cmd.protect is not None:
- table += '#ifdef %s\n' % cur_cmd.protect
-
- table += ' PFN_%s %s;\n' % (cur_cmd.name, base_name)
-
- if cur_cmd.protect is not None:
- table += '#endif // %s\n' % cur_cmd.protect
-
- table += '};\n\n'
- return table
-
- #
- # Init a dispatch table from the appropriate list and return it as a string
- def OutputIcdDispatchTableInit(self):
- commands = []
- cur_extension_name = ''
-
- table = ''
- table += 'VKAPI_ATTR bool VKAPI_CALL loader_icd_init_entries(struct loader_icd_term *icd_term, VkInstance inst,\n'
- table += ' const PFN_vkGetInstanceProcAddr fp_gipa) {\n'
- table += '\n'
- table += '#define LOOKUP_GIPA(func, required) \\\n'
- table += ' do { \\\n'
- table += ' icd_term->dispatch.func = (PFN_vk##func)fp_gipa(inst, "vk" #func); \\\n'
- table += ' if (!icd_term->dispatch.func && required) { \\\n'
- table += ' loader_log((struct loader_instance *)inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, \\\n'
- table += ' loader_platform_get_proc_address_error("vk" #func)); \\\n'
- table += ' return false; \\\n'
- table += ' } \\\n'
- table += ' } while (0)\n'
- table += '\n'
-
- skip_gipa_commands = ['vkGetInstanceProcAddr',
- 'vkEnumerateDeviceLayerProperties',
- 'vkCreateInstance',
- 'vkEnumerateInstanceExtensionProperties',
- 'vkEnumerateInstanceLayerProperties',
- 'vkEnumerateInstanceVersion',
- ]
-
- for x in range(0, 2):
- if x == 0:
- commands = self.core_commands
- else:
- commands = self.ext_commands
-
- required = False
- for cur_cmd in commands:
- is_inst_handle_type = cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice'
- if ((is_inst_handle_type or cur_cmd.name in DEVICE_CMDS_NEED_TERM) and (cur_cmd.name not in skip_gipa_commands)):
-
- if cur_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in cur_cmd.ext_name:
- table += '\n // ---- Core %s\n' % cur_cmd.ext_name[11:]
- required = cur_cmd.ext_name == 'VK_VERSION_1_0'
- else:
- table += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- required = False
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- if cur_cmd.protect is not None:
- table += '#ifdef %s\n' % cur_cmd.protect
-
- # 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 += ' LOOKUP_GIPA(%s, %s);\n' % (base_name, 'true' if required else 'false')
-
- if cur_cmd.protect is not None:
- table += '#endif // %s\n' % cur_cmd.protect
-
- table += '\n'
- table += '#undef LOOKUP_GIPA\n'
- table += '\n'
- table += ' return true;\n'
- table += '};\n\n'
- return table
-
- #
- # Create the extension enable union
- def OutputIcdExtensionEnableUnion(self):
- extensions = self.instanceExtensions
-
- union = ''
- union += 'union loader_instance_extension_enables {\n'
- union += ' struct {\n'
- for ext in extensions:
- if ('VK_VERSION_' in ext.name or ext.name in WSI_EXT_NAMES or
- ext.type == 'device' or ext.num_commands == 0):
- continue
-
- union += ' uint8_t %s : 1;\n' % ext.name[3:].lower()
-
- union += ' };\n'
- union += ' uint64_t padding[4];\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'
-
- 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_")
-
- if cur_cmd.name in PRE_INSTANCE_FUNCTIONS:
- mod_string = mod_string.replace(cur_cmd.name[2:] + '(\n', cur_cmd.name[2:] + '(\n const Vk' + cur_cmd.name[2:] + 'Chain* chain,\n')
-
- if (cur_cmd.protect is not None):
- terminators += '#ifdef %s\n' % cur_cmd.protect
-
- terminators += mod_string
- terminators += '\n'
-
- if (cur_cmd.protect is not None):
- terminators += '#endif // %s\n' % cur_cmd.protect
-
- terminators += '\n'
- return terminators
-
- #
- # Creates code to initialize the various dispatch tables
- def OutputLoaderDispatchTables(self):
- commands = []
- tables = ''
- gpa_param = ''
- cur_type = ''
- cur_extension_name = ''
-
- for x in range(0, 4):
- if x == 0:
- cur_type = 'device'
- 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 += ' for (uint32_t i = 0; i < MAX_NUM_UNKNOWN_EXTS; i++) dev_table->ext_dispatch.dev_ext[i] = (PFN_vkDevExt)vkDevExtError;\n'
-
- elif x == 1:
- cur_type = 'device'
- gpa_param = 'dev'
- commands = self.ext_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'
-
- 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'
-
- else:
- cur_type = 'instance'
- gpa_param = 'inst'
- commands = self.ext_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'
-
- for cur_cmd in commands:
- is_inst_handle_type = cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == '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 'VK_VERSION_' in cur_cmd.ext_name:
- tables += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- tables += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- # Names to skip
- if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or
- base_name == 'EnumerateInstanceExtensionProperties' or
- base_name == 'EnumerateInstanceLayerProperties' or
- base_name == 'EnumerateInstanceVersion'):
- continue
-
- if cur_cmd.protect is not None:
- tables += '#ifdef %s\n' % cur_cmd.protect
-
- # 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 += ' table->%s = (PFN_%s)gipa(inst, "%s");\n' % (base_name, cur_cmd.name, cur_cmd.name)
- else:
- tables += ' table->%s = (PFN_%s)gdpa(dev, "%s");\n' % (base_name, cur_cmd.name, cur_cmd.name)
- elif (x < 1 and base_name == 'GetDeviceProcAddr'):
- tables += ' table->GetDeviceProcAddr = gpa;\n'
- elif (x > 1 and base_name == 'GetInstanceProcAddr'):
- tables += ' table->GetInstanceProcAddr = gpa;\n'
- else:
- tables += ' table->%s = (PFN_%s)gpa(%s, "%s");\n' % (base_name, cur_cmd.name, gpa_param, cur_cmd.name)
-
- if cur_cmd.protect is not None:
- tables += '#endif // %s\n' % cur_cmd.protect
-
- 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):
- 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) {\n'
- tables += ' if (!name || name[0] != \'v\' || name[1] != \'k\') return NULL;\n'
- tables += '\n'
- tables += ' name += 2;\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:
- is_inst_handle_type = cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == '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 'VK_VERSION_' in cur_cmd.ext_name:
- tables += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- tables += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
-
- if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or
- base_name == 'EnumerateInstanceExtensionProperties' or
- base_name == 'EnumerateInstanceLayerProperties' or
- base_name == 'EnumerateInstanceVersion'):
- continue
-
- if cur_cmd.protect is not None:
- tables += '#ifdef %s\n' % cur_cmd.protect
-
- tables += ' if (!strcmp(name, "%s")) return (void *)table->%s;\n' % (base_name, base_name)
-
- if cur_cmd.protect is not None:
- tables += '#endif // %s\n' % cur_cmd.protect
-
- tables += '\n'
- if x == 1:
- tables += ' *found_name = false;\n'
- tables += ' return NULL;\n'
- tables += '}\n\n'
- return tables
-
- #
- # Create the appropriate trampoline (and possibly terminator) functinos
- def CreateTrampTermFuncs(self):
- entries = []
- funcs = ''
- cur_extension_name = ''
-
- # Some extensions have to be manually added. Skip those in the automatic
- # generation. They will be manually added later.
- manual_ext_commands = ['vkEnumeratePhysicalDeviceGroupsKHR',
- 'vkGetPhysicalDeviceExternalImageFormatPropertiesNV',
- 'vkGetPhysicalDeviceFeatures2KHR',
- 'vkGetPhysicalDeviceProperties2KHR',
- 'vkGetPhysicalDeviceFormatProperties2KHR',
- 'vkGetPhysicalDeviceImageFormatProperties2KHR',
- 'vkGetPhysicalDeviceQueueFamilyProperties2KHR',
- 'vkGetPhysicalDeviceMemoryProperties2KHR',
- 'vkGetPhysicalDeviceSparseImageFormatProperties2KHR',
- 'vkGetPhysicalDeviceSurfaceCapabilities2KHR',
- 'vkGetPhysicalDeviceSurfaceFormats2KHR',
- 'vkGetPhysicalDeviceSurfaceCapabilities2EXT',
- 'vkReleaseDisplayEXT',
- 'vkAcquireXlibDisplayEXT',
- 'vkGetRandROutputDisplayEXT',
- 'vkGetPhysicalDeviceExternalBufferPropertiesKHR',
- 'vkGetPhysicalDeviceExternalSemaphorePropertiesKHR',
- 'vkGetPhysicalDeviceExternalFencePropertiesKHR',
- 'vkGetPhysicalDeviceDisplayProperties2KHR',
- 'vkGetPhysicalDeviceDisplayPlaneProperties2KHR',
- 'vkGetDisplayModeProperties2KHR',
- 'vkGetDisplayPlaneCapabilities2KHR',
- 'vkGetPhysicalDeviceSurfacePresentModes2EXT',
- 'vkGetDeviceGroupSurfacePresentModes2EXT']
-
- 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):
- continue
-
- if ext_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in ext_cmd.ext_name:
- funcs += '\n// ---- Core %s trampoline/terminators\n\n' % ext_cmd.ext_name[11:]
- else:
- funcs += '\n// ---- %s extension trampoline/terminators\n\n' % ext_cmd.ext_name
- cur_extension_name = ext_cmd.ext_name
-
- if ext_cmd.protect is not None:
- funcs += '#ifdef %s\n' % ext_cmd.protect
-
- func_header = ext_cmd.cdecl.replace(";", " {\n")
- tramp_header = func_header.replace("VKAPI_CALL vk", "VKAPI_CALL ")
- return_prefix = ' '
- base_name = ext_cmd.name[2:]
- has_surface = 0
- update_structure_surface = 0
- update_structure_string = ''
- requires_terminator = 0
- surface_var_name = ''
- phys_dev_var_name = ''
- has_return_type = False
- always_use_param_name = True
- surface_type_to_replace = ''
- surface_name_replacement = ''
- physdev_type_to_replace = ''
- physdev_name_replacement = ''
-
- for param in ext_cmd.params:
- if param.type == 'VkSurfaceKHR':
- has_surface = 1
- surface_var_name = param.name
- requires_terminator = 1
- always_use_param_name = False
- surface_type_to_replace = 'VkSurfaceKHR'
- surface_name_replacement = 'icd_surface->real_icd_surfaces[icd_index]'
- if param.type == 'VkPhysicalDeviceSurfaceInfo2KHR':
- has_surface = 1
- surface_var_name = param.name + '->surface'
- requires_terminator = 1
- update_structure_surface = 1
- update_structure_string = ' VkPhysicalDeviceSurfaceInfo2KHR info_copy = *pSurfaceInfo;\n'
- update_structure_string += ' info_copy.surface = icd_surface->real_icd_surfaces[icd_index];\n'
- always_use_param_name = False
- surface_type_to_replace = 'VkPhysicalDeviceSurfaceInfo2KHR'
- surface_name_replacement = '&info_copy'
- if param.type == 'VkPhysicalDevice':
- requires_terminator = 1
- phys_dev_var_name = param.name
- always_use_param_name = False
- physdev_type_to_replace = 'VkPhysicalDevice'
- physdev_name_replacement = 'phys_dev_term->phys_dev'
-
- if (ext_cmd.return_type is not None):
- 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):
- 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 += ' VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(%s);\n' % (phys_dev_var_name)
- funcs += ' disp = loader_get_instance_layer_dispatch(%s);\n' % (phys_dev_var_name)
- elif ext_cmd.handle_type == 'VkInstance':
- funcs += '#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'
-
- 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'
- 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'
- 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'
- 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'
-
- 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 += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
-
- 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'
- else:
- funcs += 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 += ' struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)%s;\n' % (phys_dev_var_name)
- 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'
- funcs += ' loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0,\n'
- funcs += ' "ICD associated with VkPhysicalDevice does not support '
- funcs += base_name
- funcs += '");\n'
- funcs += ' }\n'
-
- if has_surface == 1:
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(%s);\n' % (surface_var_name)
- funcs += ' uint8_t icd_index = phys_dev_term->icd_index;\n'
- funcs += ' if (NULL != icd_surface->real_icd_surfaces && NULL != (void *)icd_surface->real_icd_surfaces[icd_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
-
- funcs += ' ' + return_prefix + 'icd_term->dispatch.'
- funcs += base_name
- funcs += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
-
- if not always_use_param_name:
- if surface_type_to_replace and surface_type_to_replace == param.type:
- funcs += surface_name_replacement
- elif physdev_type_to_replace and physdev_type_to_replace == param.type:
- funcs += physdev_name_replacement
- else:
- funcs += param.name
- else:
- funcs += param.name
-
- count += 1
- funcs += ');\n'
- if not has_return_type:
- funcs += ' return;\n'
- funcs += ' }\n'
-
- funcs += return_prefix
- funcs += 'icd_term->dispatch.'
- funcs += base_name
- funcs += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
-
- if param.type == 'VkPhysicalDevice':
- funcs += 'phys_dev_term->phys_dev'
- else:
- funcs += param.name
-
- count += 1
- funcs += ');\n'
-
- elif has_surface == 1 and not (ext_cmd.handle_type == 'VkPhysicalDevice' or ext_cmd.handle_type == 'VkInstance'):
- funcs += ' uint32_t icd_index = 0;\n'
- funcs += ' struct loader_device *dev;\n'
- funcs += ' struct loader_icd_term *icd_term = loader_get_icd_and_device(device, &dev, &icd_index);\n'
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.%s) {\n' % base_name
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)%s;\n' % (surface_var_name)
- funcs += ' if (NULL != icd_surface->real_icd_surfaces && (VkSurfaceKHR)NULL != icd_surface->real_icd_surfaces[icd_index]) {\n'
- funcs += ' %sicd_term->dispatch.%s(' % (return_prefix, base_name)
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
-
- if param.type == 'VkSurfaceKHR':
- funcs += 'icd_surface->real_icd_surfaces[icd_index]'
- else:
- funcs += param.name
-
- count += 1
- funcs += ');\n'
- if not has_return_type:
- funcs += ' return;\n'
- funcs += ' }\n'
- funcs += ' %sicd_term->dispatch.%s(' % (return_prefix, base_name)
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
- funcs += param.name
- count += 1
- funcs += ');\n'
- funcs += ' }\n'
- if has_return_type:
- funcs += ' return VK_SUCCESS;\n'
-
- elif ext_cmd.handle_type == 'VkInstance':
- funcs += '#error("Not implemented. Likely needs to be manually generated!");\n'
- elif 'DebugUtilsLabel' in ext_cmd.name:
- funcs += ' const VkLayerDispatchTable *disp = loader_get_dispatch('
- funcs += ext_cmd.params[0].name
- funcs += ');\n'
- if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES:
- funcs += ' if (disp->' + base_name + ' != NULL) {\n'
- funcs += ' '
- funcs += ' '
- if has_return_type:
- funcs += 'return '
- funcs += 'disp->'
- funcs += base_name
- funcs += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
- funcs += param.name
- count += 1
- funcs += ');\n'
- if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES:
- funcs += ' }\n'
- elif 'DebugMarkerSetObject' in ext_cmd.name or 'SetDebugUtilsObject' in ext_cmd.name:
- funcs += ' uint32_t icd_index = 0;\n'
- funcs += ' struct loader_device *dev;\n'
- funcs += ' struct loader_icd_term *icd_term = loader_get_icd_and_device(%s, &dev, &icd_index);\n' % (ext_cmd.params[0].name)
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.'
- funcs += base_name
- 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_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t)pNameInfo->object;\n'
- funcs += ' local_name_info.object = (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 += ' } else if (pNameInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT) {\n'
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {\n'
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pNameInfo->object;\n'
- funcs += ' if (NULL != icd_surface->real_icd_surfaces) {\n'
- funcs += ' local_name_info.object = (uint64_t)icd_surface->real_icd_surfaces[icd_index];\n'
- funcs += ' }\n'
- funcs += ' }\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_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t)pTagInfo->object;\n'
- funcs += ' local_tag_info.object = (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 += ' } else if (pTagInfo->objectType == VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT) {\n'
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {\n'
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pTagInfo->object;\n'
- funcs += ' if (NULL != icd_surface->real_icd_surfaces) {\n'
- funcs += ' local_tag_info.object = (uint64_t)icd_surface->real_icd_surfaces[icd_index];\n'
- funcs += ' }\n'
- funcs += ' }\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_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t)pNameInfo->objectHandle;\n'
- funcs += ' local_name_info.objectHandle = (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 += ' } else if (pNameInfo->objectType == VK_OBJECT_TYPE_SURFACE_KHR) {\n'
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {\n'
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pNameInfo->objectHandle;\n'
- funcs += ' if (NULL != icd_surface->real_icd_surfaces) {\n'
- funcs += ' local_name_info.objectHandle = (uint64_t)icd_surface->real_icd_surfaces[icd_index];\n'
- funcs += ' }\n'
- funcs += ' }\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_term *phys_dev_term = (struct loader_physical_device_term *)(uintptr_t)pTagInfo->objectHandle;\n'
- funcs += ' local_tag_info.objectHandle = (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 += ' } else if (pTagInfo->objectType == VK_OBJECT_TYPE_SURFACE_KHR) {\n'
- funcs += ' if (NULL != icd_term && NULL != icd_term->dispatch.CreateSwapchainKHR) {\n'
- funcs += ' VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)pTagInfo->objectHandle;\n'
- funcs += ' if (NULL != icd_surface->real_icd_surfaces) {\n'
- funcs += ' local_tag_info.objectHandle = (uint64_t)icd_surface->real_icd_surfaces[icd_index];\n'
- funcs += ' }\n'
- funcs += ' }\n'
- funcs += ' }\n'
- funcs += ' '
- if has_return_type:
- funcs += 'return '
- funcs += 'icd_term->dispatch.'
- funcs += base_name
- funcs += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
-
- if param.type == 'VkPhysicalDevice':
- funcs += 'phys_dev_term->phys_dev'
- elif param.type == 'VkSurfaceKHR':
- funcs += 'icd_surface->real_icd_surfaces[icd_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'
- else:
- funcs += param.name
- count += 1
-
- funcs += ');\n'
- if has_return_type:
- funcs += ' } else {\n'
- funcs += ' return VK_SUCCESS;\n'
- funcs += ' }\n'
-
- else:
- funcs += '#error("Unknown error path!");\n'
-
- funcs += '}\n\n'
- else:
- funcs += tramp_header
-
- funcs += ' const VkLayerDispatchTable *disp = loader_get_dispatch('
- funcs += ext_cmd.params[0].name
- funcs += ');\n'
-
- if ext_cmd.ext_name in NULL_CHECK_EXT_NAMES:
- funcs += ' if (disp->' + base_name + ' != NULL) {\n'
- funcs += return_prefix
- funcs += 'disp->'
- funcs += base_name
- funcs += '('
- count = 0
- for param in ext_cmd.params:
- if count != 0:
- funcs += ', '
- funcs += 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'
-
- if ext_cmd.protect is not None:
- funcs += '#endif // %s\n' % ext_cmd.protect
-
- return funcs
-
-
- #
- # Create a function for the extension GPA call
- def InstExtensionGPA(self):
- entries = []
- gpa_func = ''
- 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'
-
- for cur_cmd in self.ext_commands:
- if ('VK_VERSION_' in 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 ):
- continue
-
- if cur_cmd.ext_name != cur_extension_name:
- gpa_func += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- if cur_cmd.protect is not None:
- gpa_func += '#ifdef %s\n' % cur_cmd.protect
-
- #base_name = cur_cmd.name[2:]
- base_name = ALIASED_CMDS[cur_cmd.name] if cur_cmd.name in ALIASED_CMDS else cur_cmd.name[2:]
-
- if (cur_cmd.ext_type == 'instance'):
- gpa_func += ' if (!strcmp("%s", name)) {\n' % (cur_cmd.name)
- gpa_func += ' *addr = (ptr_instance->enabled_known_extensions.'
- gpa_func += cur_cmd.ext_name[3:].lower()
- gpa_func += ' == 1)\n'
- gpa_func += ' ? (void *)%s\n' % (base_name)
- gpa_func += ' : NULL;\n'
- gpa_func += ' return true;\n'
- gpa_func += ' }\n'
- else:
- gpa_func += ' if (!strcmp("%s", name)) {\n' % (cur_cmd.name)
- gpa_func += ' *addr = (void *)%s;\n' % (base_name)
- gpa_func += ' return true;\n'
- gpa_func += ' }\n'
-
- if cur_cmd.protect is not None:
- gpa_func += '#endif // %s\n' % cur_cmd.protect
-
- 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 = ''
-
- 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 ('VK_VERSION_' in 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):
- continue
-
- if ext.name != cur_extension_name:
- create_func += '\n // ---- %s extension commands\n' % ext.name
- cur_extension_name = ext.name
-
- if ext.protect is not None:
- create_func += '#ifdef %s\n' % ext.protect
- if count == 0:
- create_func += ' if (0 == strcmp(pCreateInfo->ppEnabledExtensionNames[i], '
- else:
- create_func += ' } else if (0 == strcmp(pCreateInfo->ppEnabledExtensionNames[i], '
-
- create_func += ext.define + ')) {\n'
- create_func += ' ptr_instance->enabled_known_extensions.'
- create_func += ext.name[3:].lower()
- create_func += ' = 1;\n'
-
- if ext.protect is not None:
- create_func += '#endif // %s\n' % ext.protect
- count += 1
-
- 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 = ''
- cur_extension_name = ''
-
- 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 *pName) {\n'
- term_func += ' PFN_vkVoidFunction addr = NULL;\n'
-
- count = 0
- is_extension = False
- last_protect = None
- for ext_cmd in self.ext_commands:
- if ext_cmd.name in DEVICE_CMDS_NEED_TERM:
- if ext_cmd.ext_name != cur_extension_name:
- if count > 0:
- count = 0;
- term_func += ' }\n'
- if is_extension:
- term_func += ' }\n'
- is_extension = False
-
- if 'VK_VERSION_' in ext_cmd.ext_name:
- term_func += '\n // ---- Core %s commands\n' % ext_cmd.ext_name[11:]
- else:
- last_protect = ext_cmd.protect
- if ext_cmd.protect is not None:
- term_func += '#ifdef %s\n' % ext_cmd.protect
- term_func += '\n // ---- %s extension commands\n' % ext_cmd.ext_name
- if ext_cmd.require:
- term_func += ' if (dev->extensions.%s_enabled && dev->extensions.%s_enabled) {\n' % (ext_cmd.ext_name[3:].lower(), ext_cmd.require[3:].lower())
- else:
- term_func += ' if (dev->extensions.%s_enabled) {\n' % ext_cmd.ext_name[3:].lower()
- is_extension = True
- cur_extension_name = ext_cmd.ext_name
-
- if count == 0:
- term_func += ' if'
- else:
- term_func += ' } else if'
-
- term_func += '(!strcmp(pName, "%s")) {\n' % (ext_cmd.name)
- term_func += ' addr = (PFN_vkVoidFunction)terminator_%s;\n' % (ext_cmd.name[2:])
-
-
- count += 1
-
- if count > 0:
- term_func += ' }\n'
- if is_extension:
- term_func += ' }\n'
- if last_protect is not None:
- term_func += '#endif // %s\n' % ext_cmd.protect
-
- term_func += ' return addr;\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):
- 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'
-
- for x in range(0, 2):
- if x == 0:
- commands = self.core_commands
- else:
- commands = self.ext_commands
-
- for cur_cmd in commands:
-
- if cur_cmd.handle_type == 'VkInstance' or cur_cmd.handle_type == 'VkPhysicalDevice':
- if cur_cmd.ext_name != cur_extension_name:
- if 'VK_VERSION_' in cur_cmd.ext_name:
- table += '\n // ---- Core %s commands\n' % cur_cmd.ext_name[11:]
- else:
- table += '\n // ---- %s extension commands\n' % cur_cmd.ext_name
- cur_extension_name = cur_cmd.ext_name
-
- # Remove 'vk' from proto name
- base_name = cur_cmd.name[2:]
- aliased_name = ALIASED_CMDS[cur_cmd.name][2:] if cur_cmd.name in ALIASED_CMDS else base_name
-
- if (base_name == 'CreateInstance' or base_name == 'CreateDevice' or
- base_name == 'EnumerateInstanceExtensionProperties' or
- base_name == 'EnumerateInstanceLayerProperties' or
- base_name == 'EnumerateInstanceVersion'):
- continue
-
- if cur_cmd.protect is not None:
- table += '#ifdef %s\n' % cur_cmd.protect
-
- if base_name == 'GetInstanceProcAddr':
- table += ' .%s = %s,\n' % (base_name, cur_cmd.name)
- else:
- table += ' .%s = terminator_%s,\n' % (base_name, aliased_name)
-
- if cur_cmd.protect is not None:
- table += '#endif // %s\n' % cur_cmd.protect
- 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 'VK_VERSION_' in ext.name:
- continue
-
- if ext.protect is not None:
- table += '#ifdef %s\n' % ext.protect
- table += ' '
- table += ext.define + ',\n'
-
- if ext.protect is not None:
- table += '#endif // %s\n' % ext.protect
- table += ' NULL };\n'
- return table
-