diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-01-05 16:34:59 -0700 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2016-01-07 11:57:45 -0700 |
| commit | 6814d87b30b8ae431d693f4b2163b3b7f26ea003 (patch) | |
| tree | 78ed6e047a7b549f0b7699a8c355182ca8846dfa | |
| parent | ec17404d1a07abf6dbc5e011787f1c43d1f344c6 (diff) | |
| download | usermoji-6814d87b30b8ae431d693f4b2163b3b7f26ea003.tar.xz | |
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.
| -rw-r--r-- | layers/unique_objects.h | 208 | ||||
| -rwxr-xr-x | 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 <tobine@google.com> */ -// CODEGEN : file vk-layer-generate.py line #1757 #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -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<void*, struct instExts> 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<VkUniqueObject*> uniquePipelines = {}; + VkUniqueObject* pUO = NULL; for (uint32_t i=0; i<createInfoCount; ++i) { - uniquePipelines.push_back(new VkUniqueObject()); - uniquePipelines[i]->actualObject = (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<VkUniqueObject*> uniquePipelines = {}; + VkUniqueObject* pUO = NULL; for (uint32_t i=0; i<createInfoCount; ++i) { - uniquePipelines.push_back(new VkUniqueObject()); - uniquePipelines[i]->actualObject = (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<VkDescriptorSet> original_dstSet1 = {}; - std::vector<VkSampler> original_sampler = {}; - std::vector<VkImageView> original_imageView = {}; - std::vector<VkBuffer> original_buffer = {}; - std::vector<VkDescriptorSet> original_srcSet = {}; - std::vector<VkDescriptorSet> original_dstSet2 = {}; -// descriptorCount : pDescriptorWrites[descriptorWriteCount]->pTexelBufferView,VkBufferView - std::vector<VkBufferView> original_pTexelBufferView = {}; - if (pDescriptorWrites) { - for (uint32_t index0=0; index0<descriptorWriteCount; ++index0) { - if (pDescriptorWrites[index0].dstSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorWrites[index0].dstSet); - original_dstSet1.push_back(pDescriptorWrites[index0].dstSet); - *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorWrites[index0].dstSet)->actualObject; - } - if (pDescriptorWrites[index0].pImageInfo) { - for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - if (pDescriptorWrites[index0].pImageInfo[index1].sampler) { - VkSampler* pSampler = (VkSampler*)&(pDescriptorWrites[index0].pImageInfo[index1].sampler); - original_sampler.push_back(pDescriptorWrites[index0].pImageInfo[index1].sampler); - *(pSampler) = (VkSampler)((VkUniqueObject*)pDescriptorWrites[index0].pImageInfo[index1].sampler)->actualObject; - } - 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; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - if (pDescriptorWrites[index0].pBufferInfo[index1].buffer) { - VkBuffer* pBuffer = (VkBuffer*)&(pDescriptorWrites[index0].pBufferInfo[index1].buffer); - original_buffer.push_back(pDescriptorWrites[index0].pBufferInfo[index1].buffer); - *(pBuffer) = (VkBuffer)((VkUniqueObject*)pDescriptorWrites[index0].pBufferInfo[index1].buffer)->actualObject; - } - } - } - if (pDescriptorWrites[index0].pTexelBufferView) { - for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - VkBufferView** ppBufferView = (VkBufferView**)&(pDescriptorWrites[index0].pTexelBufferView); - original_pTexelBufferView.push_back(pDescriptorWrites[index0].pTexelBufferView[index1]); - *(ppBufferView[index1]) = (VkBufferView)((VkUniqueObject*)pDescriptorWrites[index0].pTexelBufferView[index1])->actualObject; - } - } - } - } - if (pDescriptorCopies) { - for (uint32_t index0=0; index0<descriptorCopyCount; ++index0) { - if (pDescriptorCopies[index0].srcSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].srcSet); - original_srcSet.push_back(pDescriptorCopies[index0].srcSet); - *(pDescriptorSet) = (VkDescriptorSet)((VkUniqueObject*)pDescriptorCopies[index0].srcSet)->actualObject; - } - 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<descriptorWriteCount; ++index0) { - if (pDescriptorWrites[index0].dstSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorWrites[index0].dstSet); - *(pDescriptorSet) = original_dstSet1[index0]; - } - if (pDescriptorWrites[index0].pImageInfo) { - for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - if (pDescriptorWrites[index0].pImageInfo[index1].sampler) { - VkSampler* pSampler = (VkSampler*)&(pDescriptorWrites[index0].pImageInfo[index1].sampler); - *(pSampler) = original_sampler[index1]; - } - if (pDescriptorWrites[index0].pImageInfo[index1].imageView) { - VkImageView* pImageView = (VkImageView*)&(pDescriptorWrites[index0].pImageInfo[index1].imageView); - *(pImageView) = original_imageView[index1]; - } - } - } - if (pDescriptorWrites[index0].pBufferInfo) { - for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - if (pDescriptorWrites[index0].pBufferInfo[index1].buffer) { - VkBuffer* pBuffer = (VkBuffer*)&(pDescriptorWrites[index0].pBufferInfo[index1].buffer); - *(pBuffer) = original_buffer[index1]; - } - } - } - if (pDescriptorWrites[index0].pTexelBufferView) { - for (uint32_t index1=0; index1<pDescriptorWrites[index0].descriptorCount; ++index1) { - VkBufferView** ppBufferView = (VkBufferView**)&(pDescriptorWrites[index0].pTexelBufferView); - *(ppBufferView[index1]) = original_pTexelBufferView[index1]; - } - } - } - } - if (pDescriptorCopies) { - for (uint32_t index0=0; index0<descriptorCopyCount; ++index0) { - if (pDescriptorCopies[index0].srcSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].srcSet); - *(pDescriptorSet) = original_srcSet[index0]; - } - if (pDescriptorCopies[index0].dstSet) { - VkDescriptorSet* pDescriptorSet = (VkDescriptorSet*)&(pDescriptorCopies[index0].dstSet); - *(pDescriptorSet) = original_dstSet2[index0]; - } - } - } -} - VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) { // UNWRAP USES: diff --git a/vk-layer-generate.py b/vk-layer-generate.py index f7eabcb1..e4d4ea7b 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -1951,24 +1951,26 @@ class UniqueObjectsSubcommand(Subcommand): return "\n".join(header_txt) # Generate UniqueObjects code for given struct_uses dict of objects that need to be unwrapped + # vector_name_set is used to make sure we don't replicate vector names + # first_level_param indicates if elements are passed directly into the function else they're below a ptr/struct # TODO : Comment this code - def _gen_obj_code(self, struct_uses, indent, prefix, array_index, unique_count): + def _gen_obj_code(self, struct_uses, indent, prefix, array_index, vector_name_set, first_level_param): decls = '' pre_code = '' post_code = '' - for obj in struct_uses: - unique_count += 1 + for obj in sorted(struct_uses): name = obj array = '' if '[' in obj: (name, array) = obj.split('[') array = array.strip(']') + ptr_type = False + if 'p' == obj[0]: # TODO : Not idea way to determine ptr + ptr_type = True if isinstance(struct_uses[obj], dict): local_prefix = '' name = '%s%s' % (prefix, name) - ptr_type = False - if 'p' == obj[0]: - ptr_type = True + if ptr_type: pre_code += '%sif (%s) {\n' % (indent, name) post_code += '%sif (%s) {\n' % (indent, name) indent += ' ' @@ -1984,7 +1986,7 @@ class UniqueObjectsSubcommand(Subcommand): else: local_prefix = '%s.' % (name) assert isinstance(decls, object) - (tmp_decl, tmp_pre, tmp_post) = self._gen_obj_code(struct_uses[obj], indent, local_prefix, array_index, unique_count+1) + (tmp_decl, tmp_pre, tmp_post) = self._gen_obj_code(struct_uses[obj], indent, local_prefix, array_index, vector_name_set, False) decls += tmp_decl pre_code += tmp_pre post_code += tmp_post @@ -1997,12 +1999,12 @@ class UniqueObjectsSubcommand(Subcommand): pre_code += '%s}\n' % (indent) post_code += '%s}\n' % (indent) else: - if (array_index > 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: |
