Scientia Conditorium

[Vulkan][오류] Validation Error : VUIT-vkDestroyInstance 오류 본문

프로그래밍/컴퓨터 그래픽스

[Vulkan][오류] Validation Error : VUIT-vkDestroyInstance 오류

크썸 2023. 11. 29. 01:05

[Vulkan][오류] Validation Error : VUIT-vkDestroyInstance 오류

 

Vulkan 프로그램을 종료할 때 리소스를 정리하는 과정에서 아래와 같은 오류가 나왔다.

 

validation layer: Validation Error: [ VUID-vkDestroyInstance-instance-00629 ] Object 0: handle = 0x1ecbcf2ed00, type = VK_OBJECT_TYPE_INSTANCE; Object 1: handle = 0xfd5b260000000001, type = VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT; | MessageID = 0x8b3d8e18 | vkDestroyInstance():  OBJ ERROR : For VkInstance 0x1ecbcf2ed00[], VkDebugUtilsMessengerEXT 0xfd5b260000000001[] has not been destroyed. The Vulkan spec states: All child objects created using instance must have been destroyed prior to destroying instance (https://vulkan.lunarg.com/doc/view/1.3.268.0/windows/1.3-extensions/vkspec.html#VUID-vkDestroyInstance-instance-00629)

validation layer: Validation Error: [ VUID-vkDestroyInstance-instance-00629 ] Object 0: handle = 0x1ecbcf2ed00, type = VK_OBJECT_TYPE_INSTANCE; Object 1: handle = 0xfd5b260000000001, type = VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT; | MessageID = 0x8b3d8e18 | vkDestroyInstance():  OBJ ERROR : For VkInstance 0x1ecbcf2ed00[], VkDebugUtilsMessengerEXT 0xfd5b260000000001[] has not been destroyed. The Vulkan spec states: All child objects created using instance must have been destroyed prior to destroying instance (https://vulkan.lunarg.com/doc/view/1.3.268.0/windows/1.3-extensions/vkspec.html#VUID-vkDestroyInstance-instance-00629)

 

VkDebugUtilsMessengerEXT가 파괴되지 않았으며, Vulkan 사양에 따르면 인스턴스를 사용하여 생성된 모든 자식 개체는 인스턴스를 소멸하기 전에 소멸되어야 한다. 즉, 리소스 정리하는 과정에서 VkDebugUtilsMessengerEXT 개체가 제대로 정리되지 않은 것이다.

 


 

문제 코드

void VulkanRenderer::DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator)
{
	PFN_vkDestroyDebugUtilsMessengerEXT func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroybuUtilsMessengerEXT");
	if (func != nullptr)
	{
		func(instance, debugMessenger, pAllocator);
	}
}

vkDebugUtilsMessengerEXT 개체를 찾아봤을 때, 위 함수에서 생성한다. 여기서 문제는 vkGetInstanceProcAddr 호출할 때, 뒤쪽 매개변수를 잘못 입력한 것이다. vkDestroybuUtilsMessengerEXT 라고 적혀있기 때문에 pName이 맞지 않았던 것이다. 

 

수정 코드

void VulkanRenderer::DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator)
{
	PFN_vkDestroyDebugUtilsMessengerEXT func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
	if (func != nullptr)
	{
		func(instance, debugMessenger, pAllocator);
	}
}

수정은 간단하다. vkDestroyDebugUtilsMessengerEXT 이름을 올바르게 입력해주면 된다. 그러면 Vulkan 프로그램 종료시 다음처럼 깔끔하게 리소스 정리되는 것을 확인할 수 있다.