diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp index 2b071482ecf..6500c477b53 100644 --- a/src/vulkan/overlay-layer/overlay.cpp +++ b/src/vulkan/overlay-layer/overlay.cpp @@ -43,11 +43,13 @@ #include "util/simple_mtx.h" #include "vk_enum_to_str.h" +#include "vk_dispatch_table.h" #include "vk_util.h" /* Mapped from VkInstace/VkPhysicalDevice */ struct instance_data { struct vk_instance_dispatch_table vtable; + struct vk_physical_device_dispatch_table pd_vtable; VkInstance instance; struct overlay_params params; @@ -419,14 +421,14 @@ static void device_map_queues(struct device_data *data, struct instance_data *instance_data = data->instance; uint32_t n_family_props; - instance_data->vtable.GetPhysicalDeviceQueueFamilyProperties(data->physical_device, - &n_family_props, - NULL); + instance_data->pd_vtable.GetPhysicalDeviceQueueFamilyProperties(data->physical_device, + &n_family_props, + NULL); VkQueueFamilyProperties *family_props = (VkQueueFamilyProperties *)malloc(sizeof(VkQueueFamilyProperties) * n_family_props); - instance_data->vtable.GetPhysicalDeviceQueueFamilyProperties(data->physical_device, - &n_family_props, - family_props); + instance_data->pd_vtable.GetPhysicalDeviceQueueFamilyProperties(data->physical_device, + &n_family_props, + family_props); uint32_t queue_index = 0; for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { @@ -1007,7 +1009,7 @@ static uint32_t vk_memory_type(struct device_data *data, uint32_t type_bits) { VkPhysicalDeviceMemoryProperties prop; - data->instance->vtable.GetPhysicalDeviceMemoryProperties(data->physical_device, &prop); + data->instance->pd_vtable.GetPhysicalDeviceMemoryProperties(data->physical_device, &prop); for (uint32_t i = 0; i < prop.memoryTypeCount; i++) if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1<physical_device = physicalDevice; - vk_load_device_commands(*pDevice, fpGetDeviceProcAddr, &device_data->vtable); + vk_device_dispatch_table_load(&device_data->vtable, + fpGetDeviceProcAddr, *pDevice); - instance_data->vtable.GetPhysicalDeviceProperties(device_data->physical_device, - &device_data->properties); + instance_data->pd_vtable.GetPhysicalDeviceProperties(device_data->physical_device, + &device_data->properties); VkLayerDeviceCreateInfo *load_data_info = get_device_chain_info(pCreateInfo, VK_LOADER_DATA_CALLBACK); @@ -2547,9 +2550,12 @@ static VkResult overlay_CreateInstance( if (result != VK_SUCCESS) return result; struct instance_data *instance_data = new_instance_data(*pInstance); - vk_load_instance_commands(instance_data->instance, - fpGetInstanceProcAddr, - &instance_data->vtable); + vk_instance_dispatch_table_load(&instance_data->vtable, + fpGetInstanceProcAddr, + instance_data->instance); + vk_physical_device_dispatch_table_load(&instance_data->pd_vtable, + fpGetInstanceProcAddr, + instance_data->instance); instance_data_map_physical_devices(instance_data, true); parse_overlay_env(&instance_data->params, getenv("VK_LAYER_MESA_OVERLAY_CONFIG")); diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py index d0ac26cdc7a..bfcc466bec3 100644 --- a/src/vulkan/util/gen_enum_to_str.py +++ b/src/vulkan/util/gen_enum_to_str.py @@ -105,44 +105,6 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\ unreachable("Undefined struct type."); } } - - void vk_load_instance_commands(VkInstance instance, - PFN_vkGetInstanceProcAddr gpa, - struct vk_instance_dispatch_table *table) - { - memset(table, 0, sizeof(*table)); - table->GetInstanceProcAddr = gpa; - % for cmd in commands: - % if not cmd.device_entrypoint and cmd.name != 'vkGetInstanceProcAddr': - % if cmd.extension is not None and cmd.extension.define is not None: - #ifdef ${cmd.extension.define} - table->${cmd.name[2:]} = (PFN_${cmd.name}) gpa(instance, "${cmd.name}"); - #endif - % else: - table->${cmd.name[2:]} = (PFN_${cmd.name}) gpa(instance, "${cmd.name}"); - % endif - % endif - %endfor - } - - void vk_load_device_commands(VkDevice device, - PFN_vkGetDeviceProcAddr gpa, - struct vk_device_dispatch_table *table) - { - memset(table, 0, sizeof(*table)); - table->GetDeviceProcAddr = gpa; - % for cmd in commands: - % if cmd.device_entrypoint and cmd.name != 'vkGetDeviceProcAddr': - % if cmd.extension is not None and cmd.extension.define is not None: - #ifdef ${cmd.extension.define} - table->${cmd.name[2:]} = (PFN_${cmd.name}) gpa(device, "${cmd.name}"); - #endif - % else: - table->${cmd.name[2:]} = (PFN_${cmd.name}) gpa(device, "${cmd.name}"); - % endif - % endif - %endfor - } """), output_encoding='utf-8') @@ -179,39 +141,6 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\ size_t vk_structure_type_size(const struct VkBaseInStructure *item); - struct vk_instance_dispatch_table { - PFN_vkGetInstanceProcAddr GetInstanceProcAddr; - % for cmd in commands: - % if not cmd.device_entrypoint and cmd.name != 'vkGetInstanceProcAddr': - % if cmd.extension is not None and cmd.extension.define is not None: - #ifdef ${cmd.extension.define} - PFN_${cmd.name} ${cmd.name[2:]}; - #endif - % else: - PFN_${cmd.name} ${cmd.name[2:]}; - % endif - % endif - %endfor - }; - - struct vk_device_dispatch_table { - PFN_vkGetDeviceProcAddr GetDeviceProcAddr; - % for cmd in commands: - % if cmd.device_entrypoint and cmd.name != 'vkGetDeviceProcAddr': - % if cmd.extension is not None and cmd.extension.define is not None: - #ifdef ${cmd.extension.define} - PFN_${cmd.name} ${cmd.name[2:]}; - #endif - % else: - PFN_${cmd.name} ${cmd.name[2:]}; - % endif - % endif - %endfor - }; - - void vk_load_instance_commands(VkInstance instance, PFN_vkGetInstanceProcAddr gpa, struct vk_instance_dispatch_table *table); - void vk_load_device_commands(VkDevice device, PFN_vkGetDeviceProcAddr gpa, struct vk_device_dispatch_table *table); - #ifdef __cplusplus } /* extern "C" */ #endif @@ -339,7 +268,7 @@ def struct_get_stype(xml_node): return None -def parse_xml(cmd_factory, enum_factory, ext_factory, struct_factory, filename): +def parse_xml(enum_factory, ext_factory, struct_factory, filename): """Parse the XML file. Accumulate results into the factories. This parser is a memory efficient iterative XML parser that returns a list @@ -358,14 +287,6 @@ def parse_xml(cmd_factory, enum_factory, ext_factory, struct_factory, filename): if enum is not None: enum.add_value_from_xml(value) - for command in xml.findall('./commands/command'): - name = command.find('./proto/name') - first_arg = command.find('./param/type') - # Some commands are alias KHR -> nonKHR, ignore those - if name is not None: - cmd_factory(name.text, - device_entrypoint=(first_arg.text in ('VkDevice', 'VkCommandBuffer', 'VkQueue'))) - for struct_type in xml.findall('./types/type[@category="struct"]'): name = struct_type.attrib['name'] stype = struct_get_stype(struct_type) @@ -401,11 +322,6 @@ def parse_xml(cmd_factory, enum_factory, ext_factory, struct_factory, filename): if enum is not None: enum.set_guard(define) - for t in ext_elem.findall('./require/command'): - command = cmd_factory.get(t.attrib['name']) - if command is not None: - command.extension = extension - def main(): parser = argparse.ArgumentParser() @@ -419,13 +335,11 @@ def main(): args = parser.parse_args() - command_factory = NamedFactory(VkCommand) enum_factory = NamedFactory(VkEnum) ext_factory = NamedFactory(VkExtension) struct_factory = NamedFactory(VkChainStruct) for filename in args.xml_files: - parse_xml(command_factory, enum_factory, ext_factory, struct_factory, filename) - commands = sorted(command_factory.registry.values(), key=lambda e: e.name) + parse_xml(enum_factory, ext_factory, struct_factory, filename) enums = sorted(enum_factory.registry.values(), key=lambda e: e.name) extensions = sorted(ext_factory.registry.values(), key=lambda e: e.name) structs = sorted(struct_factory.registry.values(), key=lambda e: e.name) @@ -435,7 +349,6 @@ def main(): with open(file_, 'wb') as f: f.write(template.render( file=os.path.basename(__file__), - commands=commands, enums=enums, extensions=extensions, structs=structs,