From 6814d87b30b8ae431d693f4b2163b3b7f26ea003 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 5 Jan 2016 16:34:59 -0700 Subject: layers: UniqueObject updates based on review Remove all of the DebugReport stuff, this layer doesn't use it. Update some corner cases to make sure objects are correctly restored. --- layers/unique_objects.h | 208 ++++++++++-------------------------------------- vk-layer-generate.py | 42 +++++++--- 2 files changed, 69 insertions(+), 181 deletions(-) diff --git a/layers/unique_objects.h b/layers/unique_objects.h index f12cf8c3..68505e28 100644 --- a/layers/unique_objects.h +++ b/layers/unique_objects.h @@ -23,7 +23,6 @@ * Author: Tobin Ehlis */ -// CODEGEN : file vk-layer-generate.py line #1757 #include #include #include @@ -37,26 +36,27 @@ #include "vulkan/vk_layer.h" #include "vk_layer_config.h" -//#include "vulkan/vk_lunarg_debug_report.h" #include "vk_layer_table.h" #include "vk_layer_data.h" #include "vk_layer_logging.h" #include "vk_layer_extension_utils.h" struct layer_data { - debug_report_data *report_data; - VkDebugReportCallbackEXT logging_callback; bool wsi_enabled; layer_data() : - report_data(nullptr), - logging_callback(VK_NULL_HANDLE), wsi_enabled(false) {}; }; struct instExts { bool wsi_enabled; + bool xlib_enabled; + bool xcb_enabled; + bool wayland_enabled; + bool mir_enabled; + bool android_enabled; + bool win32_enabled; }; static std::unordered_map instanceExtMap; @@ -70,33 +70,6 @@ struct VkUniqueObject uint64_t actualObject; }; -static void -initUniqueObjects( - layer_data *my_data, - const VkAllocationCallbacks *pAllocator) -{ - uint32_t report_flags = 0; - uint32_t debug_action = 0; - FILE *log_output = NULL; - const char *option_str; - // initialize UniqueObjects options - report_flags = getLayerOptionFlags("UniqueObjectsReportFlags", 0); - getLayerOptionEnum("UniqueObjectsDebugAction", (uint32_t *) &debug_action); - - if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG) - { - option_str = getLayerOption("UniqueObjectsLogFilename"); - log_output = getLayerLogOutput(option_str, "UniqueObjects"); - VkDebugReportCallbackCreateInfoEXT dbgInfo; - memset(&dbgInfo, 0, sizeof(dbgInfo)); - dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; - dbgInfo.pfnCallback = log_callback; - dbgInfo.pUserData = log_output; - dbgInfo.flags = report_flags; - layer_create_msg_callback(my_data->report_data, &dbgInfo, pAllocator, &my_data->logging_callback); - } -} - // Handle CreateInstance static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance) { @@ -107,7 +80,7 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); pDisp->GetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); pDisp->GetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); -#if VK_USE_PLATFORM_WIN32_KHR +#ifdef VK_USE_PLATFORM_WIN32_KHR pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR) gpa(instance, "vkCreateWin32SurfaceKHR"); pDisp->GetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); #endif // VK_USE_PLATFORM_WIN32_KHR @@ -131,10 +104,34 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR) gpa(instance, "vkCreateAndroidSurfaceKHR"); #endif // VK_USE_PLATFORM_ANDROID_KHR - instanceExtMap[pDisp].wsi_enabled = false; + instanceExtMap[pDisp] = {}; for (i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) { if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) instanceExtMap[pDisp].wsi_enabled = true; +#ifdef VK_USE_PLATFORM_XLIB_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].xlib_enabled = true; +#endif +#ifdef VK_USE_PLATFORM_XCB_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].xcb_enabled = true; +#endif +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].wayland_enabled = true; +#endif +#ifdef VK_USE_PLATFORM_MIR_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].mir_enabled = true; +#endif +#ifdef VK_USE_PLATFORM_ANDROID_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].android_enabled = true; +#endif +#ifdef VK_USE_PLATFORM_WIN32_KHR + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) + instanceExtMap[pDisp].win32_enabled = true; +#endif } } @@ -149,15 +146,7 @@ explicit_CreateInstance( VkResult result = pInstanceTable->CreateInstance(pCreateInfo, pAllocator, pInstance); if (result == VK_SUCCESS) { - layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); - my_data->report_data = debug_report_create_instance( - pInstanceTable, - *pInstance, - pCreateInfo->enabledExtensionNameCount, - pCreateInfo->ppEnabledExtensionNames); createInstanceRegisterExtensions(pCreateInfo, *pInstance); - - initUniqueObjects(my_data, pAllocator); } return result; } @@ -190,9 +179,6 @@ explicit_CreateDevice( VkLayerDispatchTable *pDeviceTable = get_dispatch_table(unique_objects_device_table_map, *pDevice); VkResult result = pDeviceTable->CreateDevice(gpu, pCreateInfo, pAllocator, pDevice); if (result == VK_SUCCESS) { - layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); - layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); - my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice); createDeviceRegisterExtensions(pCreateInfo, *pDevice); } return result; @@ -449,11 +435,11 @@ VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipeli } } if (VK_SUCCESS == result) { - std::vector uniquePipelines = {}; + VkUniqueObject* pUO = NULL; for (uint32_t i=0; iactualObject = (uint64_t)pPipelines[i]; - pPipelines[i] = (VkPipeline)uniquePipelines[i]; + pUO = new VkUniqueObject(); + pUO->actualObject = (uint64_t)pPipelines[i]; + pPipelines[i] = (VkPipeline)pUO; } } return result; @@ -524,130 +510,16 @@ VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipel } } if (VK_SUCCESS == result) { - std::vector uniquePipelines = {}; + VkUniqueObject* pUO = NULL; for (uint32_t i=0; iactualObject = (uint64_t)pPipelines[i]; - pPipelines[i] = (VkPipeline)uniquePipelines[i]; + pUO = new VkUniqueObject(); + pUO->actualObject = (uint64_t)pPipelines[i]; + pPipelines[i] = (VkPipeline)pUO; } } return result; } -void explicit_UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) -{ -// UNWRAP USES: -// 0 : pDescriptorWrites[descriptorWriteCount]->dstSet,VkDescriptorSet, pDescriptorWrites[descriptorWriteCount]->pImageInfo[descriptorCount]->sampler,VkSampler, pDescriptorWrites[descriptorWriteCount]->pImageInfo[descriptorCount]->imageView,VkImageView, pDescriptorWrites[descriptorWriteCount]->pBufferInfo[descriptorCount]->buffer,VkBuffer, pDescriptorCopies[descriptorCopyCount]->srcSet,VkDescriptorSet, pDescriptorCopies[descriptorCopyCount]->dstSet,VkDescriptorSet - std::vector original_dstSet1 = {}; - std::vector original_sampler = {}; - std::vector original_imageView = {}; - std::vector original_buffer = {}; - std::vector original_srcSet = {}; - std::vector original_dstSet2 = {}; -// descriptorCount : pDescriptorWrites[descriptorWriteCount]->pTexelBufferView,VkBufferView - std::vector original_pTexelBufferView = {}; - if (pDescriptorWrites) { - for (uint32_t index0=0; index0actualObject; - } - if (pDescriptorWrites[index0].pImageInfo) { - for (uint32_t index1=0; index1actualObject; - } - if (pDescriptorWrites[index0].pImageInfo[index1].imageView) { - VkImageView* pImageView = (VkImageView*)&(pDescriptorWrites[index0].pImageInfo[index1].imageView); - original_imageView.push_back(pDescriptorWrites[index0].pImageInfo[index1].imageView); - *(pImageView) = (VkImageView)((VkUniqueObject*)pDescriptorWrites[index0].pImageInfo[index1].imageView)->actualObject; - } - } - } - if (pDescriptorWrites[index0].pBufferInfo) { - for (uint32_t index1=0; index1actualObject; - } - } - } - if (pDescriptorWrites[index0].pTexelBufferView) { - for (uint32_t index1=0; index1actualObject; - } - } - } - } - if (pDescriptorCopies) { - for (uint32_t index0=0; index0actualObject; - } - if (pDescriptorCopies[index0].dstSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].dstSet); - original_dstSet2.push_back(pDescriptorCopies[index0].dstSet); - *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorCopies[index0].dstSet)->actualObject; - } - } - } - get_dispatch_table(unique_objects_device_table_map, device)->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); - if (pDescriptorWrites) { - for (uint32_t index0=0; index0 0): + if (array_index > 0) or array != '': # TODO : This is not ideal, really want to know if we're anywhere under an array pre_code += '%sif (%s%s) {\n' %(indent, prefix, name) post_code += '%sif (%s%s) {\n' %(indent, prefix, name) indent += ' ' # Append unique_count to make sure name is unique (some aliasing for "buffer" and "image" names - vec_name = 'original_%s%s' % (name, unique_count) + vec_name = 'original_%s' % (name) if array != '': idx = 'idx%s' % str(array_index) array_index += 1 @@ -2013,7 +2015,9 @@ class UniqueObjectsSubcommand(Subcommand): pName = 'p%s' % (struct_uses[obj][2:]) pre_code += '%s%s* %s = (%s*)&(%s%s);\n' % (indent, struct_uses[obj], pName, struct_uses[obj], prefix, name) post_code += '%s%s* %s = (%s*)&(%s%s);\n' % (indent, struct_uses[obj], pName, struct_uses[obj], prefix, name) - decls += ' std::vector<%s> %s = {};\n' % (struct_uses[obj], vec_name) + if name not in vector_name_set: + vector_name_set.add(name) + decls += ' std::vector<%s> %s = {};\n' % (struct_uses[obj], vec_name) pre_code += '%s%s.push_back(%s%s);\n' % (indent, vec_name, prefix, name) pre_code += '%s*(%s) = (%s)((VkUniqueObject*)%s%s)->actualObject;\n' % (indent, pName, struct_uses[obj], prefix, name) post_code += '%s*(%s) = %s.front();\n' % (indent, pName, vec_name) @@ -2028,10 +2032,19 @@ class UniqueObjectsSubcommand(Subcommand): else: pre_code += '%sif (%s%s) {\n' %(indent, prefix, name) indent += ' ' - pre_code += '%s%s* p%s = (%s*)%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], prefix, name) + deref_txt = '&' + if ptr_type: + deref_txt = '' + pre_code += '%s%s* p%s = (%s*)%s%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], deref_txt, prefix, name) pre_code += '%s*p%s = (%s)((VkUniqueObject*)%s%s)->actualObject;\n' % (indent, name, struct_uses[obj], prefix, name) indent = indent[4:] pre_code += '%s}\n' % (indent) + if not first_level_param: # embedded in a ptr/struct so need to undo the update + decls += ' %s local_%s = %s%s;\n' % (struct_uses[obj], name, prefix, name) + post_code += '%sif (%s%s) {\n' %(indent, prefix, name) + post_code += '%s %s* p%s = (%s*)%s%s%s;\n' % (indent, struct_uses[obj], name, struct_uses[obj], deref_txt, prefix, name) + post_code += '%s *p%s = local_%s;\n' % (indent, name, name) + post_code += '%s}\n' % (indent) return decls, pre_code, post_code def generate_intercept(self, proto, qual): @@ -2044,9 +2057,12 @@ class UniqueObjectsSubcommand(Subcommand): indent = ' ' # indent level for generated code decl = proto.c_func(prefix="vk", attr="VKAPI") # A few API cases that are manual code + # TODO : Special case Create*Pipelines funcs to handle creating multiple unique objects explicit_object_tracker_functions = ['GetSwapchainImagesKHR', 'CreateInstance', - 'CreateDevice',] + 'CreateDevice', + 'CreateComputePipelines', + 'CreateGraphicsPipelines'] # Give special treatment to create functions that return multiple new objects # This dict stores array name and size of array custom_create_dict = {'pDescriptorSets' : 'pAllocateInfo->setLayoutCount'} @@ -2072,7 +2088,7 @@ class UniqueObjectsSubcommand(Subcommand): if destroy_func: # only one object for del_obj in struct_uses: pre_call_txt += '%s%s local_%s = %s;\n' % (indent, struct_uses[del_obj], del_obj, del_obj) - (pre_decl, pre_code, post_code) = self._gen_obj_code(struct_uses, ' ', '', 0, 0) + (pre_decl, pre_code, post_code) = self._gen_obj_code(struct_uses, ' ', '', 0, set(), True) pre_call_txt += '%s%s' % (pre_decl, pre_code) post_call_txt += post_code elif create_func: -- cgit v1.2.3