일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 책리뷰
- 혼공
- 혼공학습단
- 혼공S
- 자바스크립트
- 혼공네트
- 데이터분석
- tutorial
- 혼공스
- 컴퓨터그래픽스
- 나는리뷰어다
- 혼공컴운
- 파이썬
- 혼자공부하는C언어
- vulkan
- 네트워크
- OpenGL
- C++
- 제이펍
- 혼공단
- 불칸
- 혼공단5기
- 머신러닝
- 리뷰리뷰
- 혼자공부하는네트워크
- 한빛미디어
- 벌칸
- 혼공C
- 혼공머신
- 딥러닝
- Today
- Total
Scientia Conditorium
[Vulkan][오류] Validation Error : VUIT-vkDestroyInstance 오류 본문
[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 프로그램 종료시 다음처럼 깔끔하게 리소스 정리되는 것을 확인할 수 있다.