From f235448688d9d07587fc97ac1bf2f73743a9ad90 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 6 May 2016 11:55:53 +0800 Subject: core_validation: refactor GetInstanceProcAddr Split command intercepting out to intercept_core_instance_command. Assert that instance is valid if intercept_core_instance_command returns nullptr. --- layers/core_validation.cpp | 60 +++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index ae5edf5b..e17ab273 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9752,6 +9752,9 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi return my_data->instance_dispatch_table->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } +static PFN_vkVoidFunction +intercept_core_instance_command(const char *name); + static PFN_vkVoidFunction intercept_core_device_command(const char *name); @@ -9781,35 +9784,17 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice dev, const c } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return (PFN_vkVoidFunction)GetInstanceProcAddr; - if (!strcmp(funcName, "vkGetDeviceProcAddr")) - return (PFN_vkVoidFunction)GetDeviceProcAddr; - if (!strcmp(funcName, "vkCreateInstance")) - return (PFN_vkVoidFunction)CreateInstance; - if (!strcmp(funcName, "vkCreateDevice")) - return (PFN_vkVoidFunction)CreateDevice; - if (!strcmp(funcName, "vkDestroyInstance")) - return (PFN_vkVoidFunction)DestroyInstance; - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; - if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties")) - return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; - - if (instance == NULL) - return NULL; + PFN_vkVoidFunction proc = intercept_core_instance_command(funcName); + if (proc) + return proc; - PFN_vkVoidFunction fptr; + assert(instance); layer_data *my_data; my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); - fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName); - if (fptr) - return fptr; + proc = debug_report_get_instance_proc_addr(my_data->report_data, funcName); + if (proc) + return proc; VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table; if (pTable->GetInstanceProcAddr == NULL) @@ -9817,6 +9802,31 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance return pTable->GetInstanceProcAddr(instance, funcName); } +static PFN_vkVoidFunction +intercept_core_instance_command(const char *name) { + static const struct { + const char *name; + PFN_vkVoidFunction proc; + } core_instance_commands[] = { + { "vkGetInstanceProcAddr", reinterpret_cast(GetInstanceProcAddr) }, + { "vkGetDeviceProcAddr", reinterpret_cast(GetDeviceProcAddr) }, + { "vkCreateInstance", reinterpret_cast(CreateInstance) }, + { "vkCreateDevice", reinterpret_cast(CreateDevice) }, + { "vkDestroyInstance", reinterpret_cast(DestroyInstance) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(vkEnumerateInstanceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(vkEnumerateInstanceExtensionProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(vkEnumerateDeviceLayerProperties) }, + { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, + }; + + for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { + if (!strcmp(core_instance_commands[i].name, name)) + return core_instance_commands[i].proc; + } + + return nullptr; +} + static PFN_vkVoidFunction intercept_core_device_command(const char *name) { static const struct { -- cgit v1.2.3