From: Mark Lobodzinski Date: Wed, 7 Jun 2017 22:04:50 +0000 (-0600) Subject: layers: Unique objects GPA handling updates X-Git-Tag: upstream/1.1.92~1069 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4f70011dcb9c0b8982a6d559785ea1f825d8abf4;p=platform%2Fupstream%2FVulkan-Tools.git layers: Unique objects GPA handling updates Change-Id: Id14c4b5ecb96eed9091ee13aceeb1701adb1f511 --- diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index a26085a..84ee778 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -61,12 +61,14 @@ static void initUniqueObjects(instance_layer_data *instance_data, const VkAlloca layer_debug_actions(instance_data->report_data, instance_data->logging_callback, pAllocator, "google_unique_objects"); } + +// Hey, we need to codegen in the debug helper functions into the procmap LUGMAL + // Handle CreateInstance Extensions static void checkInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) { - uint32_t i; instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) { + for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { // Check for recognized instance extensions if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kUniqueObjectsSupportedInstanceExtensions)) { log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, @@ -81,19 +83,8 @@ static void checkInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateI // Handle CreateDevice Extensions static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - PFN_vkGetDeviceProcAddr gpa = device_data->dispatch_table.GetDeviceProcAddr; - - device_data->dispatch_table.CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); - device_data->dispatch_table.DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); - device_data->dispatch_table.GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); - device_data->dispatch_table.AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); - device_data->dispatch_table.QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); - device_data->wsi_enabled = false; for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { - if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) { - device_data->wsi_enabled = true; - } // Check for recognized device extensions if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kUniqueObjectsSupportedDeviceExtensions)) { log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, @@ -146,7 +137,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreat } initUniqueObjects(instance_data, pAllocator); - checkInstanceRegisterExtensions(pCreateInfo, *pInstance); // Disable and free tmp callbacks, no longer necessary if (instance_data->num_tmp_callbacks > 0) { @@ -228,16 +218,6 @@ static const VkLayerProperties globalLayerProps = {"VK_LAYER_GOOGLE_unique_objec /// Declare prototype for these functions VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName); -static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { - for (unsigned int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) { - if (!strcmp(name, procmap[i].name)) return procmap[i].pFunc; - } - if (0 == strcmp(name, "vk_layerGetPhysicalDeviceProcAddr")) { - return (PFN_vkVoidFunction)GetPhysicalDeviceProcAddr; - } - return NULL; -} - VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties); } @@ -268,46 +248,31 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { - PFN_vkVoidFunction addr; - assert(device); - addr = layer_intercept_proc(funcName); - if (addr) { - return addr; + const auto item = name_to_funcptr_map.find(funcName); + if (item != name_to_funcptr_map.end()) { + return reinterpret_cast(item->second); } - layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkLayerDispatchTable *disp_table = &dev_data->dispatch_table; - if (disp_table->GetDeviceProcAddr == NULL) { - return NULL; - } - return disp_table->GetDeviceProcAddr(device, funcName); + layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + const auto &table = device_data->dispatch_table; + if (!table.GetDeviceProcAddr) return nullptr; + return table.GetDeviceProcAddr(device, funcName); } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { - PFN_vkVoidFunction addr; - - addr = layer_intercept_proc(funcName); - if (addr) { - return addr; + const auto item = name_to_funcptr_map.find(funcName); + if (item != name_to_funcptr_map.end()) { + return reinterpret_cast(item->second); } - assert(instance); instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - addr = debug_report_get_instance_proc_addr(instance_data->report_data, funcName); - if (addr) { - return addr; - } - - VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; - if (disp_table->GetInstanceProcAddr == NULL) { - return NULL; - } - return disp_table->GetInstanceProcAddr(instance, funcName); + const auto &table = instance_data->dispatch_table; + if (!table.GetInstanceProcAddr) return nullptr; + return table.GetInstanceProcAddr(instance, funcName); } -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) { - assert(instance); +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) { instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; if (disp_table->GetPhysicalDeviceProcAddr == NULL) { @@ -403,35 +368,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli return result; } -VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, - const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkDebugReportCallbackEXT *pMsgCallback) { - instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - VkResult result = - instance_data->dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); - - if (VK_SUCCESS == result) { - result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); - } - return result; -} - -VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, - const VkAllocationCallbacks *pAllocator) { - instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - instance_data->dispatch_table.DestroyDebugReportCallbackEXT(instance, callback, pAllocator); - layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator); -} - -VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, - int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { - instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - instance_data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, - pMsg); -} - VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { layer_data *my_map_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); @@ -800,25 +736,6 @@ VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDe } // namespace unique_objects -// vk_layer_logging.h expects these to be defined -VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance, - const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkDebugReportCallbackEXT *pMsgCallback) { - return unique_objects::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); -} - -VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback, - const VkAllocationCallbacks *pAllocator) { - unique_objects::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); -} - -VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, - int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { - unique_objects::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); -} - VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { return unique_objects::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); diff --git a/scripts/unique_objects_generator.py b/scripts/unique_objects_generator.py index 8ad3053..7effe03 100644 --- a/scripts/unique_objects_generator.py +++ b/scripts/unique_objects_generator.py @@ -258,8 +258,8 @@ class UniqueObjectsOutputGenerator(OutputGenerator): self.newline() # Record intercepted procedures - write('// intercepts', file=self.outFile) - write('struct { const char* name; PFN_vkVoidFunction pFunc;} procmap[] = {', file=self.outFile) + write('// Map of all APIs to be intercepted by this layer', file=self.outFile) + write('static const std::unordered_map name_to_funcptr_map = {', file=self.outFile) write('\n'.join(self.intercepts), file=self.outFile) write('};\n', file=self.outFile) self.newline() @@ -850,7 +850,7 @@ class UniqueObjectsOutputGenerator(OutputGenerator): self.appendSection('command', '') self.appendSection('command', '// Declare only') self.appendSection('command', decls[0]) - self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (cmdname,cmdname[2:]) ] + self.intercepts += [ ' {"%s", (void *)%s},' % (cmdname,cmdname[2:]) ] continue # Generate NDO wrapping/unwrapping code for all parameters (api_decls, api_pre, api_post) = self.generate_wrapping_code(cmdinfo.elem) @@ -863,7 +863,7 @@ class UniqueObjectsOutputGenerator(OutputGenerator): self.appendSection('command', '#ifdef '+ feature_extra_protect) self.intercepts += [ '#ifdef %s' % feature_extra_protect ] # Add intercept to procmap - self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (cmdname,cmdname[2:]) ] + self.intercepts += [ ' {"%s", (void*)%s},' % (cmdname,cmdname[2:]) ] decls = self.makeCDecls(cmdinfo.elem) self.appendSection('command', '') self.appendSection('command', decls[0][:-1])