const VkAllocationCallbacks* pAllocator) {
if (messenger != VK_NULL_HANDLE) {
uint64_t fake_msgr_handle = (uint64_t)(messenger);
- auto found_iter = icd.messenger_handles.erase(
- std::remove(icd.messenger_handles.begin(), icd.messenger_handles.end(), fake_msgr_handle), icd.messenger_handles.end());
- if (found_iter == icd.messenger_handles.end()) {
+ auto found_iter = std::find(icd.messenger_handles.begin(), icd.messenger_handles.end(), fake_msgr_handle);
+ if (found_iter != icd.messenger_handles.end()) {
+ // Remove it from the list
+ icd.messenger_handles.erase(found_iter);
+ // Delete the handle
+ delete (uint8_t*)fake_msgr_handle;
+ } else {
assert(false && "Messenger not found during destroy!");
}
}
}
if (IsInstanceExtensionEnabled(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) {
if (string_eq(pName, "vkCreateDebugUtilsMessengerEXT")) {
- icd.is_using_icd_wsi = UsingICDProvidedWSI::is_using;
return TO_VOID_PFN(test_vkCreateDebugUtilsMessengerEXT);
}
if (string_eq(pName, "vkDestroyDebugUtilsMessengerEXT")) {
- icd.is_using_icd_wsi = UsingICDProvidedWSI::is_using;
return TO_VOID_PFN(test_vkDestroyDebugUtilsMessengerEXT);
}
}
void *obj;
};
+struct wrapped_debutil_mess_obj {
+ VkInstance inst;
+ VkDebugUtilsMessengerEXT obj;
+};
+
// typedef std::unordered_map<void *, VkLayerDispatchTable *> device_table_map;
// typedef std::unordered_map<void *, VkLayerInstanceDispatchTable *> instance_table_map;
typedef void *dispatch_key;
return reinterpret_cast<VkPhysicalDevice>((*phys_dev)->obj);
}
+VkDebugUtilsMessengerEXT unwrap_debutil_messenger(const VkDebugUtilsMessengerEXT messenger, wrapped_debutil_mess_obj **mess) {
+ *mess = reinterpret_cast<wrapped_debutil_mess_obj *>(messenger);
+ return (*mess)->obj;
+}
+
dispatch_key get_dispatch_key(const void *object) { return (dispatch_key) * (VkLayerDispatchTable **)object; }
template <typename T>
wrapped_inst_obj *inst;
auto vk_inst = unwrap_instance(instance, &inst);
VkLayerInstanceDispatchTable *pDisp = &inst->layer_disp;
- return pDisp->CreateDebugUtilsMessengerEXT(vk_inst, pCreateInfo, pAllocator, pMessenger);
+ VkResult result = pDisp->CreateDebugUtilsMessengerEXT(vk_inst, pCreateInfo, pAllocator, pMessenger);
+ auto mess = new wrapped_debutil_mess_obj;
+ if (!mess) return VK_ERROR_OUT_OF_HOST_MEMORY;
+ memset(mess, 0, sizeof(*mess));
+ mess->obj = (*pMessenger);
+ *pMessenger = reinterpret_cast<VkDebugUtilsMessengerEXT>(mess);
+ return result;
}
VKAPI_ATTR void VKAPI_CALL wrap_vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger,
wrapped_inst_obj *inst;
auto vk_inst = unwrap_instance(instance, &inst);
VkLayerInstanceDispatchTable *pDisp = &inst->layer_disp;
- pDisp->DestroyDebugUtilsMessengerEXT(vk_inst, messenger, pAllocator);
+ wrapped_debutil_mess_obj *mess;
+ auto vk_mess = unwrap_debutil_messenger(messenger, &mess);
+ pDisp->DestroyDebugUtilsMessengerEXT(vk_inst, vk_mess, pAllocator);
+ delete mess;
}
VKAPI_ATTR void VKAPI_CALL wrap_vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
return phys_dev->inst->layer_disp.EnumerateDeviceExtensionProperties(vk_phys_dev, pLayerName, pPropertyCount, pProperties);
}
-PFN_vkVoidFunction layer_intercept_proc(const char *name) {
+PFN_vkVoidFunction layer_intercept_device_proc(const char *name) {
if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
name += 2;
- if (!strcmp(name, "CreateInstance")) return (PFN_vkVoidFunction)wrap_vkCreateInstance;
- if (!strcmp(name, "DestroyInstance")) return (PFN_vkVoidFunction)wrap_vkDestroyInstance;
- if (!strcmp(name, "EnumeratePhysicalDevices")) return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
return (PFN_vkVoidFunction)wrap_vkGetPhysicalDeviceQueueFamilyProperties;
if (!strcmp(name, "CreateDevice")) return (PFN_vkVoidFunction)wrap_vkCreateDevice;
if (!strcmp(name, "DestroyDevice")) return (PFN_vkVoidFunction)wrap_vkDestroyDevice;
- if (!strcmp(name, "CreateDebugUtilsMessengerEXT")) return (PFN_vkVoidFunction)wrap_vkCreateDebugUtilsMessengerEXT;
- if (!strcmp(name, "DestroyDebugUtilsMessengerEXT")) return (PFN_vkVoidFunction)wrap_vkDestroyDebugUtilsMessengerEXT;
return NULL;
}
if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
name += 2;
- if (!strcmp(name, "GetInstanceProcAddr")) return (PFN_vkVoidFunction)wrap_vkCreateInstance;
if (!strcmp(name, "DestroyInstance")) return (PFN_vkVoidFunction)wrap_vkDestroyInstance;
+ if (!strcmp(name, "CreateDevice")) return (PFN_vkVoidFunction)wrap_vkCreateDevice;
if (!strcmp(name, "EnumeratePhysicalDevices")) return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices;
+ if (!strcmp(name, "CreateDebugUtilsMessengerEXT")) return (PFN_vkVoidFunction)wrap_vkCreateDebugUtilsMessengerEXT;
+ if (!strcmp(name, "DestroyDebugUtilsMessengerEXT")) return (PFN_vkVoidFunction)wrap_vkDestroyDebugUtilsMessengerEXT;
+
if (!strcmp(name, "GetPhysicalDeviceProperties")) return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties;
if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
return (PFN_vkVoidFunction)wrap_vkGetPhysicalDeviceQueueFamilyProperties;
return (PFN_vkVoidFunction)wrap_vkGetDeviceProcAddr;
}
- addr = layer_intercept_proc(funcName);
+ addr = layer_intercept_device_proc(funcName);
if (addr) return addr;
if (device == VK_NULL_HANDLE) {
return NULL;
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL wrap_vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
PFN_vkVoidFunction addr;
+ if (!strcmp(funcName, "vkGetInstanceProcAddr")) return (PFN_vkVoidFunction)wrap_vkGetInstanceProcAddr;
if (!strcmp(funcName, "vkCreateInstance")) return (PFN_vkVoidFunction)wrap_vkCreateInstance;
- if (!strcmp(funcName, "vkCreateDevice")) return (PFN_vkVoidFunction)wrap_vkCreateDevice;
if (instance == VK_NULL_HANDLE) {
return NULL;
return VK_FALSE;
}
-#if 0 // Disable for now to get this commit in
TEST_F(LoaderHandleValidTests, VerifyHandleWrappingDebugUtilsMessenger) {
Extension ext{"VK_EXT_debug_utils"};
auto& driver = env->get_test_icd();
driver.add_instance_extensions({ext});
const char* wrap_objects_name = "WrapObjectsLayer";
- ManifestLayer::LayerDescription wrap_objects_description{};
- wrap_objects_description.name = wrap_objects_name;
- wrap_objects_description.lib_path = TEST_LAYER_WRAP_OBJECTS;
-
- ManifestLayer wrap_objects_layer;
- wrap_objects_layer.layers.push_back(wrap_objects_description);
- env->AddExplicitLayer(wrap_objects_layer, "wrap_objects_layer.json");
+ env->add_explicit_layer(
+ ManifestLayer{}.add_layer(
+ ManifestLayer::LayerDescription{}.set_name(wrap_objects_name).set_lib_path(TEST_LAYER_WRAP_OBJECTS)),
+ "wrap_objects_layer.json");
driver.physical_devices.emplace_back("physical_device_0");
MockQueueFamilyProperties family_props{{VK_QUEUE_GRAPHICS_BIT, 1, 0, {1, 1, 1}}, true};
ASSERT_EQ(VK_SUCCESS, pfn_CreateMessenger(instance, &debug_messenger_create_info, nullptr, &messenger));
pfn_DestroyMessenger(instance, messenger, nullptr);
}
-#endif
\ No newline at end of file