diff options
| author | Chris Forbes <chrisforbes@google.com> | 2017-05-02 16:42:55 -0700 |
|---|---|---|
| committer | Chris Forbes <chrisf@ijw.co.nz> | 2017-05-03 11:38:06 -0700 |
| commit | e6f7cbaff088597431cf149af29dc2bbf0de6ef4 (patch) | |
| tree | 97c484162957facf3f8e4bb1a94d04669b52fd2c | |
| parent | 04c739104d66020cebaf981a9bfa5d8ce622df45 (diff) | |
| download | usermoji-e6f7cbaff088597431cf149af29dc2bbf0de6ef4.tar.xz | |
layers: hold UO dispatch tables by value in layer_data
Trims out some allocations; fixes leak of dispatch tables
| -rw-r--r-- | layers/unique_objects.cpp | 75 | ||||
| -rw-r--r-- | layers/unique_objects.h | 4 | ||||
| -rw-r--r-- | scripts/unique_objects_generator.py | 2 |
3 files changed, 39 insertions, 42 deletions
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index c499a82b..b3ada611 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -65,7 +65,7 @@ static void initUniqueObjects(instance_layer_data *instance_data, const VkAlloca 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); - VkLayerInstanceDispatchTable *disp_table = instance_data->dispatch_table; + VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; instance_ext_map[disp_table] = {}; for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) { @@ -120,14 +120,13 @@ 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); - auto disp_table = device_data->dispatch_table; - PFN_vkGetDeviceProcAddr gpa = disp_table->GetDeviceProcAddr; - - device_data->dispatch_table->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); - disp_table->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); - disp_table->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); - disp_table->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); - disp_table->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); + 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++) { @@ -166,12 +165,11 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreat instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(*pInstance), instance_layer_data_map); instance_data->instance = *pInstance; - instance_data->dispatch_table = new VkLayerInstanceDispatchTable; - layer_init_instance_dispatch_table(*pInstance, instance_data->dispatch_table, fpGetInstanceProcAddr); + layer_init_instance_dispatch_table(*pInstance, &instance_data->dispatch_table, fpGetInstanceProcAddr); instance_data->instance = *pInstance; instance_data->report_data = - debug_report_create_instance(instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount, + debug_report_create_instance(&instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames); // Set up temporary debug callbacks to output messages at CreateInstance-time @@ -202,7 +200,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreat VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { dispatch_key key = get_dispatch_key(instance); instance_layer_data *instance_data = GetLayerDataPtr(key, instance_layer_data_map); - VkLayerInstanceDispatchTable *disp_table = instance_data->dispatch_table; + VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; instance_ext_map.erase(disp_table); disp_table->DestroyInstance(instance, pAllocator); @@ -242,8 +240,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDevice my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice); // Setup layer's device dispatch table - my_device_data->dispatch_table = new VkLayerDispatchTable; - layer_init_device_dispatch_table(*pDevice, my_device_data->dispatch_table, fpGetDeviceProcAddr); + layer_init_device_dispatch_table(*pDevice, &my_device_data->dispatch_table, fpGetDeviceProcAddr); createDeviceRegisterExtensions(pCreateInfo, *pDevice); // Set gpu for this device in order to get at any objects mapped at instance level @@ -258,7 +255,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall layer_data *dev_data = GetLayerDataPtr(key, layer_data_map); layer_debug_report_destroy_device(device); - dev_data->dispatch_table->DestroyDevice(device, pAllocator); + dev_data->dispatch_table.DestroyDevice(device, pAllocator); layer_data_map.erase(key); } @@ -306,7 +303,7 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi dispatch_key key = get_dispatch_key(physicalDevice); instance_layer_data *instance_data = GetLayerDataPtr(key, instance_layer_data_map); - return instance_data->dispatch_table->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); + return instance_data->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { @@ -318,7 +315,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, cons } layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkLayerDispatchTable *disp_table = dev_data->dispatch_table; + VkLayerDispatchTable *disp_table = &dev_data->dispatch_table; if (disp_table->GetDeviceProcAddr == NULL) { return NULL; } @@ -340,7 +337,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance return addr; } - VkLayerInstanceDispatchTable *disp_table = instance_data->dispatch_table; + VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; if (disp_table->GetInstanceProcAddr == NULL) { return NULL; } @@ -351,7 +348,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance in assert(instance); instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - VkLayerInstanceDispatchTable *disp_table = instance_data->dispatch_table; + VkLayerInstanceDispatchTable *disp_table = &instance_data->dispatch_table; if (disp_table->GetPhysicalDeviceProcAddr == NULL) { return NULL; } @@ -390,7 +387,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelin pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; } - VkResult result = my_device_data->dispatch_table->CreateComputePipelines( + VkResult result = my_device_data->dispatch_table.CreateComputePipelines( device, pipelineCache, createInfoCount, (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); delete[] local_pCreateInfos; { @@ -448,7 +445,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; } - VkResult result = my_device_data->dispatch_table->CreateGraphicsPipelines( + VkResult result = my_device_data->dispatch_table.CreateGraphicsPipelines( device, pipelineCache, createInfoCount, (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); delete[] local_pCreateInfos; { @@ -471,7 +468,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, 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); + 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); @@ -482,7 +479,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, 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); + instance_data->dispatch_table.DestroyDebugReportCallbackEXT(instance, callback, pAllocator); layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator); } @@ -490,7 +487,7 @@ VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugRep 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, + instance_data->dispatch_table.DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } @@ -509,7 +506,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)]; } - VkResult result = my_map_data->dispatch_table->CreateSwapchainKHR( + VkResult result = my_map_data->dispatch_table.CreateSwapchainKHR( device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain); if (local_pCreateInfo) { delete local_pCreateInfo; @@ -548,7 +545,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32 } } } - VkResult result = dev_data->dispatch_table->CreateSharedSwapchainsKHR( + VkResult result = dev_data->dispatch_table.CreateSharedSwapchainsKHR( device, swapchainCount, (const VkSwapchainCreateInfoKHR *)local_pCreateInfos, pAllocator, pSwapchains); if (local_pCreateInfos) delete[] local_pCreateInfos; if (VK_SUCCESS == result) { @@ -570,7 +567,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchai swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)]; } VkResult result = - my_device_data->dispatch_table->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); + my_device_data->dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); // TODO : Need to add corresponding code to delete these images if (VK_SUCCESS == result) { if ((*pSwapchainImageCount > 0) && pSwapchainImages) { @@ -609,7 +606,7 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf } } } - VkResult result = dev_data->dispatch_table->QueuePresentKHR(queue, (const VkPresentInfoKHR *)local_pPresentInfo); + VkResult result = dev_data->dispatch_table.QueuePresentKHR(queue, (const VkPresentInfoKHR *)local_pPresentInfo); // pResults is an output array embedded in a structure. The code generator neglects to copy back from the safe_* version, // so handle it as a special case here: @@ -644,7 +641,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device } } } - VkResult result = dev_data->dispatch_table->CreateDescriptorUpdateTemplateKHR( + VkResult result = dev_data->dispatch_table.CreateDescriptorUpdateTemplateKHR( device, (const VkDescriptorUpdateTemplateCreateInfoKHR *)local_create_info, pAllocator, pDescriptorUpdateTemplate); if (VK_SUCCESS == result) { std::lock_guard<std::mutex> lock(global_lock); @@ -669,7 +666,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device, descriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)dev_data->unique_id_mapping[descriptor_update_template_id]; dev_data->unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); - dev_data->dispatch_table->DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); + dev_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); } void *BuildUnwrappedUpdateTemplateBuffer(layer_data *dev_data, uint64_t descriptorUpdateTemplate, const void *pData) { @@ -768,7 +765,7 @@ VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, V descriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)dev_data->unique_id_mapping[template_handle]; } void *unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(dev_data, template_handle, pData); - dev_data->dispatch_table->UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, + dev_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); free(unwrapped_buffer); } @@ -784,7 +781,7 @@ VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer c layout = (VkPipelineLayout)dev_data->unique_id_mapping[reinterpret_cast<uint64_t &>(layout)]; } void *unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(dev_data, template_handle, pData); - dev_data->dispatch_table->CmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, + dev_data->dispatch_table.CmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, unwrapped_buffer); free(unwrapped_buffer); } @@ -808,7 +805,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalD } } - VkResult result = my_map_data->dispatch_table->GetPhysicalDeviceDisplayPropertiesKHR( + VkResult result = my_map_data->dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR( physicalDevice, pPropertyCount, (VkDisplayPropertiesKHR *)local_pProperties); if (result == VK_SUCCESS && pProperties) { for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { @@ -834,7 +831,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalD VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) { instance_layer_data *my_map_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map); - VkResult result = my_map_data->dispatch_table->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, + VkResult result = my_map_data->dispatch_table.GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays); if (VK_SUCCESS == result) { if ((*pDisplayCount > 0) && pDisplays) { @@ -861,7 +858,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice phys } } - VkResult result = my_map_data->dispatch_table->GetDisplayModePropertiesKHR( + VkResult result = my_map_data->dispatch_table.GetDisplayModePropertiesKHR( physicalDevice, display, pPropertyCount, (VkDisplayModePropertiesKHR *)local_pProperties); if (result == VK_SUCCESS && pProperties) { for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { @@ -897,7 +894,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice p } } VkResult result = - dev_data->dispatch_table->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities); + dev_data->dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities); return result; } #endif @@ -912,7 +909,7 @@ VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDeb local_tag_info->object = it->second; } } - VkResult result = device_data->dispatch_table->DebugMarkerSetObjectTagEXT( + VkResult result = device_data->dispatch_table.DebugMarkerSetObjectTagEXT( device, reinterpret_cast<VkDebugMarkerObjectTagInfoEXT *>(local_tag_info)); return result; } @@ -927,7 +924,7 @@ VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDe local_name_info->object = it->second; } } - VkResult result = device_data->dispatch_table->DebugMarkerSetObjectNameEXT( + VkResult result = device_data->dispatch_table.DebugMarkerSetObjectNameEXT( device, reinterpret_cast<VkDebugMarkerObjectNameInfoEXT *>(local_name_info)); return result; } diff --git a/layers/unique_objects.h b/layers/unique_objects.h index 76420a6c..f90c5bfb 100644 --- a/layers/unique_objects.h +++ b/layers/unique_objects.h @@ -46,7 +46,7 @@ struct instance_layer_data { debug_report_data *report_data; std::vector<VkDebugReportCallbackEXT> logging_callback; - VkLayerInstanceDispatchTable *dispatch_table; + VkLayerInstanceDispatchTable dispatch_table = {}; // The following are for keeping track of the temporary callbacks that can // be used in vkCreateInstance and vkDestroyInstance: @@ -65,7 +65,7 @@ struct layer_data { VkInstance instance; debug_report_data *report_data; - VkLayerDispatchTable *dispatch_table; + VkLayerDispatchTable dispatch_table = {}; std::unordered_map<uint64_t, std::unique_ptr<TEMPLATE_STATE>> desc_template_map; diff --git a/scripts/unique_objects_generator.py b/scripts/unique_objects_generator.py index a08276fa..d53c3bc4 100644 --- a/scripts/unique_objects_generator.py +++ b/scripts/unique_objects_generator.py @@ -904,7 +904,7 @@ class UniqueObjectsOutputGenerator(OutputGenerator): else: paramstext = paramstext.replace(param.name, '(%s %s)local_%s' % ('const', param.type, param.name)) # Use correct dispatch table - API = cmdinfo.elem.attrib.get('name').replace('vk','dev_data->dispatch_table->',1) + API = cmdinfo.elem.attrib.get('name').replace('vk','dev_data->dispatch_table.',1) # Put all this together for the final down-chain call self.appendSection('command', ' ' + assignresult + API + '(' + paramstext + ');') # And add the post-API-call codegen |
