From 0f25cbe274d5d69751b96c58fbc078f164227d31 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Thu, 17 Sep 2015 10:00:32 -0600 Subject: layers: Fix intercept of WSI instance entrypoints ApiDump, Generic, ObjectTracker now intrcept WSI instance entrypoint and only intercept if the extension is enabled --- layers/object_track.h | 20 +++++++ loader/table_ops.h | 1 + vk-layer-generate.py | 150 +++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 140 insertions(+), 31 deletions(-) diff --git a/layers/object_track.h b/layers/object_track.h index 694aa93f..0ae9017e 100644 --- a/layers/object_track.h +++ b/layers/object_track.h @@ -73,6 +73,11 @@ typedef struct _layer_data { bool objtrack_extensions_enabled; } layer_data; +struct instExts { + bool wsi_enabled; +}; + +static std::unordered_map instanceExtMap; static std::unordered_map layer_data_map; static device_table_map ObjectTracker_device_table_map; static instance_table_map ObjectTracker_instance_table_map; @@ -198,6 +203,20 @@ static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo } } +static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance) +{ + uint32_t i; + VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ObjectTracker_instance_table_map, instance); + PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr; + pDisp->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); + instanceExtMap[pDisp].wsi_enabled = false; + for (i = 0; i < pCreateInfo->extensionCount; i++) { + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].wsi_enabled = true; + + } +} + // Indicate device or instance dispatch table type typedef enum _DispTableType { @@ -612,6 +631,7 @@ explicit_CreateInstance( *pInstance, pCreateInfo->extensionCount, pCreateInfo->ppEnabledExtensionNames); + createInstanceRegisterExtensions(pCreateInfo, *pInstance); initObjectTracker(my_data); create_obj(*pInstance, *pInstance, VK_OBJECT_TYPE_INSTANCE); diff --git a/loader/table_ops.h b/loader/table_ops.h index 09823a6f..8c3920ed 100644 --- a/loader/table_ops.h +++ b/loader/table_ops.h @@ -508,6 +508,7 @@ static inline void loader_init_instance_extension_dispatch_table( { table->DbgCreateMsgCallback = (PFN_vkDbgCreateMsgCallback) gpa(inst, "vkDbgCreateMsgCallback"); table->DbgDestroyMsgCallback = (PFN_vkDbgDestroyMsgCallback) gpa(inst, "vkDbgDestroyMsgCallback"); + table->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) gpa(inst, "vkGetPhysicalDeviceSurfaceSupportKHR"); } static inline void *loader_lookup_instance_dispatch_table( diff --git a/vk-layer-generate.py b/vk-layer-generate.py index a7971ede..d4a58a94 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -396,18 +396,35 @@ class Subcommand(object): " return addr;" " }\n" % self.layer_name) + table_declared = False if 0 != len(instance_extensions): - for ext_name in instance_extensions: - func_body.append(" layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);\n" + for (ext_enable, ext_list) in instance_extensions: + extra_space = "" + if 0 != len(ext_enable): + if ext_enable == 'msg_callback_get_proc_addr': + func_body.append(" layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);\n" " addr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);\n" " if (addr) {\n" " return addr;\n" - " }\n" - " if (get_dispatch_table(%s_instance_table_map, instance)->GetInstanceProcAddr == NULL) {\n" - " return NULL;\n" - " }\n" - " return get_dispatch_table(%s_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);\n" - "}\n" % (self.layer_name, self.layer_name)) + " }\n") + else: + if table_declared == False: + func_body.append(" VkLayerInstanceDispatchTable* pTable = get_dispatch_table(%s_instance_table_map, instance);" % self.layer_name) + table_declared = True + func_body.append(' if (instanceExtMap.size() != 0 && instanceExtMap[pTable].%s)' % ext_enable) + func_body.append(' {') + extra_space = " " + for ext_name in ext_list: + func_body.append(' %sif (!strcmp("%s", funcName))\n' + ' return reinterpret_cast(%s);' % (extra_space, ext_name, ext_name)) + if 0 != len(ext_enable): + func_body.append(' }\n') + + func_body.append(" if (get_dispatch_table(%s_instance_table_map, instance)->GetInstanceProcAddr == NULL) {\n" + " return NULL;\n" + " }\n" + " return get_dispatch_table(%s_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);\n" + "}\n" % (self.layer_name, self.layer_name)) return "\n".join(func_body) else: # @@ -450,6 +467,7 @@ class Subcommand(object): " return pDisp->GetDeviceProcAddr(device, funcName);\n" " }\n" "}\n") + func_body.append('%s' % self.lineinfo.get()) func_body.append("VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" @@ -465,15 +483,22 @@ class Subcommand(object): " addr = layer_intercept_instance_proc(funcName);\n" " if (addr)\n" " return addr;" % self.layer_name) + func_body.append("") + func_body.append(" VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);") if 0 != len(instance_extensions): - for ext_name in instance_extensions: - func_body.append(" {\n" - " PFN_vkVoidFunction fptr;\n" - " fptr = %s(funcName);\n" - " if (fptr) return fptr;\n" - " }\n" % ext_name) - func_body.append(" VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);\n" - " if (pTable->GetInstanceProcAddr == NULL)\n" + extra_space = "" + for (ext_enable, ext_list) in instance_extensions: + if 0 != len(ext_enable): + func_body.append(' if (instanceExtMap.size() != 0 && instanceExtMap[pTable].%s)' % ext_enable) + func_body.append(' {') + extra_space = " " + for ext_name in ext_list: + func_body.append(' %sif (!strcmp("%s", funcName))\n' + ' return reinterpret_cast(%s);' % (extra_space, ext_name, ext_name)) + if 0 != len(ext_enable): + func_body.append(' }\n') + + func_body.append(" if (pTable->GetInstanceProcAddr == NULL)\n" " return NULL;\n" " return pTable->GetInstanceProcAddr(instance, funcName);\n" "}\n") @@ -587,7 +612,11 @@ class GenericLayerSubcommand(Subcommand): gen_header.append('struct devExts {') gen_header.append(' bool wsi_enabled;') gen_header.append('};') + gen_header.append('struct instExts {') + gen_header.append(' bool wsi_enabled;') + gen_header.append('};') gen_header.append('static std::unordered_map deviceExtMap;') + gen_header.append('static std::unordered_map instanceExtMap;') gen_header.append('') gen_header.append('static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)') gen_header.append('{') @@ -608,6 +637,19 @@ class GenericLayerSubcommand(Subcommand): gen_header.append(' deviceExtMap[pDisp].wsi_enabled = true;') gen_header.append('') gen_header.append(' }') + gen_header.append('}\n') + gen_header.append('static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance)') + gen_header.append('{') + gen_header.append(' uint32_t i;') + gen_header.append(' VkLayerInstanceDispatchTable *pDisp = instance_dispatch_table(instance);') + gen_header.append(' PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;') + gen_header.append(' pDisp->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");') + gen_header.append(' instanceExtMap[pDisp].wsi_enabled = false;') + gen_header.append(' for (i = 0; i < pCreateInfo->extensionCount; i++) {') + gen_header.append(' if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)') + gen_header.append(' instanceExtMap[pDisp].wsi_enabled = true;') + gen_header.append('') + gen_header.append(' }') gen_header.append('}') gen_header.append('') return "\n".join(gen_header) @@ -659,12 +701,23 @@ class GenericLayerSubcommand(Subcommand): funcs.append('%s%s\n' '{\n' ' dispatch_key key = get_dispatch_key(instance);\n' - ' instance_dispatch_table(instance)->DestroyInstance(instance);\n' + ' VkLayerInstanceDispatchTable *pDisp = instance_dispatch_table(instance);\n' + ' pDisp->DestroyInstance(instance);\n' + ' instanceExtMap.erase(pDisp);\n' ' destroy_instance_dispatch_table(key);\n' '}\n' % (qual, decl)) - else: + elif proto.name == "CreateInstance": funcs.append('%s' % self.lineinfo.get()) # CreateInstance needs to use the second parm instead of the first to set the correct dispatch table + funcs.append('%s%s\n' + '{\n' + ' %sinstance_dispatch_table(*pInstance)->%s;\n' + ' if (result == VK_SUCCESS) {\n' + ' createInstanceRegisterExtensions(pCreateInfo, *pInstance);\n' + ' }\n' + '}\n' % (qual, decl, ret_val, proto.c_call())) + else: + funcs.append('%s' % self.lineinfo.get()) dispatch_param = proto.params[0].name # Must use 'instance' table for these APIs, 'device' table otherwise table_type = "" @@ -672,8 +725,6 @@ class GenericLayerSubcommand(Subcommand): table_type = "instance" else: table_type = "device" - if 'CreateInstance' in proto.name: - dispatch_param = '*' + proto.params[1].name funcs.append('%s%s\n' '{\n' ' %s%s_dispatch_table(%s)->%s;\n' @@ -683,6 +734,8 @@ class GenericLayerSubcommand(Subcommand): def generate_body(self): self.layer_name = "Generic" + instance_extensions=[('wsi_enabled', + ['vkGetPhysicalDeviceSurfaceSupportKHR'])] extensions=[('wsi_enabled', ['vkGetSurfacePropertiesKHR', 'vkGetSurfaceFormatsKHR', 'vkGetSurfacePresentModesKHR', 'vkCreateSwapchainKHR', @@ -692,7 +745,7 @@ class GenericLayerSubcommand(Subcommand): self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._gen_create_msg_callback(), self._gen_destroy_msg_callback(), - self._generate_layer_gpa_function(extensions)] + self._generate_layer_gpa_function(extensions, instance_extensions)] return "\n\n".join(body) @@ -778,7 +831,12 @@ class APIDumpSubcommand(Subcommand): header_txt.append(' bool wsi_enabled;') header_txt.append('};') header_txt.append('') + header_txt.append('struct instExts {') + header_txt.append(' bool wsi_enabled;') + header_txt.append('};') + header_txt.append('') header_txt.append('static std::unordered_map deviceExtMap;') + header_txt.append('static std::unordered_map instanceExtMap;') header_txt.append('') header_txt.append('static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)') header_txt.append('{') @@ -799,7 +857,20 @@ class APIDumpSubcommand(Subcommand): header_txt.append(' deviceExtMap[pDisp].wsi_enabled = true;') header_txt.append('') header_txt.append(' }') - header_txt.append('}') + header_txt.append('}\n') + header_txt.append('static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance)') + header_txt.append('{') + header_txt.append(' uint32_t i;') + header_txt.append(' VkLayerInstanceDispatchTable *pDisp = instance_dispatch_table(instance);') + header_txt.append(' PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;') + header_txt.append(' pDisp->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");') + header_txt.append(' instanceExtMap[pDisp].wsi_enabled = false;') + header_txt.append(' for (i = 0; i < pCreateInfo->extensionCount; i++) {') + header_txt.append(' if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)') + header_txt.append(' instanceExtMap[pDisp].wsi_enabled = true;') + header_txt.append('') + header_txt.append(' }') + header_txt.append('}\n') header_txt.append('') header_txt.append('void interpret_memBarriers(const void* const* ppMemBarriers, uint32_t memBarrierCount)') header_txt.append('{') @@ -1053,13 +1124,22 @@ class APIDumpSubcommand(Subcommand): table_type = 'instance' else: table_type = 'device' + dispatch_param = proto.params[0].name if proto.name == "CreateInstance": dispatch_param = '*' + proto.params[1].name - else: - dispatch_param = proto.params[0].name + funcs.append('%s%s\n' + '{\n' + ' using namespace StreamControl;\n' + ' %sinstance_dispatch_table(*pInstance)->%s;\n' + ' if (result == VK_SUCCESS) {\n' + ' createInstanceRegisterExtensions(pCreateInfo, *pInstance);\n' + ' }\n' + ' %s%s%s\n' + '%s' + '}\n' % (qual, decl, ret_val, proto.c_call(), f_open, log_func, f_close, stmt)) - if proto.name == "CreateDevice": + elif proto.name == "CreateDevice": funcs.append('%s\n' % self.lineinfo.get()) funcs.append('%s%s\n' '{\n' @@ -1075,7 +1155,7 @@ class APIDumpSubcommand(Subcommand): '{\n' ' using namespace StreamControl;\n' ' dispatch_key key = get_dispatch_key(device);\n' - ' VkLayerDispatchTable *pDisp = %s_dispatch_table(%s);\n' + ' VkLayerDispatchTable *pDisp = %s_dispatch_table(%s);\n' ' %spDisp->%s;\n' ' deviceExtMap.erase(pDisp);\n' ' destroy_device_dispatch_table(key);\n' @@ -1087,11 +1167,13 @@ class APIDumpSubcommand(Subcommand): '{\n' ' using namespace StreamControl;\n' ' dispatch_key key = get_dispatch_key(instance);\n' - ' %s%s_dispatch_table(%s)->%s;\n' + ' VkLayerInstanceDispatchTable *pDisp = %s_dispatch_table(%s);\n' + ' %spDisp->%s;\n' + ' instanceExtMap.erase(pDisp);\n' ' destroy_instance_dispatch_table(key);\n' ' %s%s%s\n' '%s' - '}' % (qual, decl, ret_val, table_type, dispatch_param, proto.c_call(), f_open, log_func, f_close, stmt)) + '}' % (qual, decl, table_type, dispatch_param, ret_val, proto.c_call(), f_open, log_func, f_close, stmt)) else: funcs.append('%s%s\n' '{\n' @@ -1104,6 +1186,8 @@ class APIDumpSubcommand(Subcommand): def generate_body(self): self.layer_name = "APIDump" + instance_extensions=[('wsi_enabled', + ['vkGetPhysicalDeviceSurfaceSupportKHR'])] extensions=[('wsi_enabled', ['vkGetSurfacePropertiesKHR', 'vkGetSurfaceFormatsKHR', 'vkGetSurfacePresentModesKHR', 'vkCreateSwapchainKHR', @@ -1111,7 +1195,7 @@ class APIDumpSubcommand(Subcommand): 'vkAcquireNextImageKHR', 'vkQueuePresentKHR'])] body = [self.generate_init(), self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), - self._generate_layer_gpa_function(extensions)] + self._generate_layer_gpa_function(extensions, instance_extensions)] return "\n\n".join(body) class ObjectTrackerSubcommand(Subcommand): @@ -1390,6 +1474,7 @@ class ObjectTrackerSubcommand(Subcommand): gedi_txt.append(' layer_data_map.erase(pInstanceTable);') gedi_txt.append('') gedi_txt.append(' ObjectTracker_instance_table_map.erase(key);') + gedi_txt.append(' instanceExtMap.erase(pInstanceTable);') gedi_txt.append(' assert(ObjectTracker_instance_table_map.size() == 0 && "Should not have any instance mappings hanging around");') gedi_txt.append('') gedi_txt.append(' loader_platform_thread_unlock_mutex(&objLock);') @@ -1623,6 +1708,9 @@ class ObjectTrackerSubcommand(Subcommand): 'vkGetSurfacePresentModesKHR', 'vkCreateSwapchainKHR', 'vkDestroySwapchainKHR', 'vkGetSwapchainImagesKHR', 'vkAcquireNextImageKHR', 'vkQueuePresentKHR'])] + instance_extensions=[('msg_callback_get_proc_addr', []), + ('wsi_enabled', + ['vkGetPhysicalDeviceSurfaceSupportKHR'])] body = [self.generate_maps(), self.generate_procs(), self.generate_destroy_instance(), @@ -1631,7 +1719,7 @@ class ObjectTrackerSubcommand(Subcommand): self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._generate_extensions(), self._generate_layer_gpa_function(extensions, - instance_extensions=['msg_callback_get_proc_addr'])] + instance_extensions)] return "\n\n".join(body) class ThreadingSubcommand(Subcommand): @@ -1915,7 +2003,7 @@ class ThreadingSubcommand(Subcommand): body = [self._generate_new_layer_initialization(True, lockname='threading', condname='threading'), self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._generate_layer_gpa_function(extensions=[], - instance_extensions=['msg_callback_get_proc_addr']), + instance_extensions=[('msg_callback_get_proc_addr', [])]), self._gen_create_msg_callback(), self._gen_destroy_msg_callback()] return "\n\n".join(body) -- cgit v1.2.3