From 06ee14dc64a70613a5c2db54c1b8a670f6d6642b Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 7 Jun 2017 14:00:31 -0600 Subject: layers: Make PV GPA handling more consistent Change-Id: I28d4642ca924928b9a76d6ddeb3a4e9ef106710b --- layers/parameter_validation.cpp | 38 ++++++++++++------------------- scripts/parameter_validation_generator.py | 6 ++--- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 87c40bad..7f0f8174 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -5744,36 +5744,28 @@ VKAPI_ATTR void VKAPI_CALL SetHdrMetadataEXT(VkDevice device, uint32_t swapchain } } -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; - } - return NULL; -} - VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { - assert(device); - - PFN_vkVoidFunction addr = layer_intercept_proc(funcName); - if (addr) return addr; - - layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + const auto item = name_to_funcptr_map.find(funcName); + if (item != name_to_funcptr_map.end()) { + return reinterpret_cast(item->second); + } - if (!dev_data->dispatch_table.GetDeviceProcAddr) return nullptr; - return dev_data->dispatch_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 = layer_intercept_proc(funcName); - if (addr) return addr; - - assert(instance); + const auto item = name_to_funcptr_map.find(funcName); + if (item != name_to_funcptr_map.end()) { + return reinterpret_cast(item->second); + } auto instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map); - - if (!instance_data->dispatch_table.GetInstanceProcAddr) return nullptr; - return instance_data->dispatch_table.GetInstanceProcAddr(instance, funcName); + 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) { diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py index 7d3b873d..eacace55 100644 --- a/scripts/parameter_validation_generator.py +++ b/scripts/parameter_validation_generator.py @@ -220,8 +220,8 @@ class ParamCheckerOutputGenerator(OutputGenerator): # Output declarations and record intercepted procedures write('// Declarations', file=self.outFile) write('\n'.join(self.declarations), file=self.outFile) - 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() @@ -437,7 +437,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): if (self.featureExtraProtect != None): self.declarations += [ '#ifdef %s' % self.featureExtraProtect ] self.intercepts += [ '#ifdef %s' % self.featureExtraProtect ] - self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name[2:]) ] + self.intercepts += [ ' {"%s", (void*)%s},' % (name,name[2:]) ] decls = self.makeCDecls(cmdinfo.elem) # Strip off 'vk' from API name self.declarations += [ '%s' % decls[0].replace("VKAPI_CALL vk", "VKAPI_CALL ") ] -- cgit v1.2.3