vkDestroyDevice 返回 vkDevice 尚未销毁并EXC_BAD_ACCESS
vkDestroyDevice returns vkDevice has not been Destroyed and EXC_BAD_ACCESS
Running MacOS Catalina和VSCode.
这就是我初始化设备的方式
void Renderer::InitDevice() {
{
uint32_t gpu_count = 0;
vkEnumeratePhysicalDevices(Instance, &gpu_count, nullptr);
std::vector<VkPhysicalDevice> gpu_list(gpu_count);
vkEnumeratePhysicalDevices(Instance, &gpu_count, gpu_list.data()); //populates gpu_list with all gpu handles
GPU = gpu_list[0]; //grab first gpu. debug and figure out a ranking system
vkGetPhysicalDeviceProperties(GPU, &GPU_device_properties);
}
{
uint32_t family_count = 0;
vkGetPhysicalDeviceQueueFamilyProperties(GPU, &family_count, nullptr);
std::vector<VkQueueFamilyProperties> family_properties(family_count);
vkGetPhysicalDeviceQueueFamilyProperties(GPU, &family_count, family_properties.data());
bool found_graphics_bit = false;
for ( u_int32_t i = 0; i<family_count; i++){
if(family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT){
found_graphics_bit = true;
graphics_family_index = i;
}
}
if (!found_graphics_bit){
assert(1 && "Vulkan Error: Queue family supporting graphics card not found");
std::exit(-1);
}
}
{
uint32_t layer_count = 0;
vkEnumerateInstanceLayerProperties(&layer_count, nullptr);
std::vector<VkLayerProperties> layer_properties(layer_count);
vkEnumerateInstanceLayerProperties(&layer_count, layer_properties.data()); //something about system layers
std::cout << "Instance Layers: n";
for (auto &layer_property: layer_properties){
std::cout << "t" << layer_property.layerName << "n";
std::cout << "tt" << layer_property.description << "n";
}
std::cout << "n";
}
{
uint32_t layer_count = 0;
vkEnumerateDeviceLayerProperties(GPU, &layer_count, nullptr);
std::vector<VkLayerProperties> layer_properties(layer_count);
vkEnumerateDeviceLayerProperties(GPU, &layer_count, layer_properties.data()); //something about system layers
std::cout << "Device Layers: n";
for (auto &layer_property: layer_properties){
std::cout << "t" << layer_property.layerName << "n";
std::cout << "tt" << layer_property.description << "n";
}
std::cout << "n";
}
float queue_priorities[] { 1.0f };
VkDeviceQueueCreateInfo device_queue_info = {};
//need to understand queue properties
device_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
device_queue_info.queueFamilyIndex = graphics_family_index;
device_queue_info.queueCount = 1;
device_queue_info.pQueuePriorities = queue_priorities;
VkDeviceCreateInfo device_info{};
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_info.queueCreateInfoCount = 1;
device_info.pQueueCreateInfos = &device_queue_info;
device_info.enabledLayerCount = device_layers.size();
device_info.ppEnabledLayerNames = device_layers.data();
device_info.enabledExtensionCount = device_extensions.size();
device_info.ppEnabledExtensionNames = device_extensions.data();
auto err = vkCreateDevice(GPU, &device_info, nullptr, &Device);
if (err != VK_SUCCESS){
assert(1 && "Vulkan Error: Device Creation Failed");
std::exit(-1);
}
}
发生此错误时,Vulkan 设备创建将返回VK_SUCCESS。 这就是我摧毁它的方式
void Renderer::DeinitDevice() {
vkDeviceWaitIdle(Device);
vkDestroyDevice(Device, nullptr); //uncommenting this causes program to crash.
Device = nullptr;
}
在vkDeviceWaitIdle(Device);
上,或者如果将其删除,则发生在vkDestroyDevice(Device, nullptr);
我得到EXC_BAD_ACCESS
和
@"2020-05-17 15:06:54.832625-0400 main[4816:29494] flock failed to lock maps file: errno = 35rn"
@"UNASSIGNED-ObjectTracker-ObjectLeak(ERROR / SPEC): msgNum: 699204130 - Validation Error: [ UNASSIGNED-ObjectTracker-ObjectLeak ] Object 0: handle = 0x10104e018, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x29ad0222 | OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT object VkDevice 0x10104e018[] has not been destroyed.rn"
@" Objects: 1rn"
@" [0] 0x10104e018, type: 3, name: NULLrn"
我正在遵循 vulkan 教程,我无法真正理解,但我找到了一些视频来解释教程真正没有完成的事情。到目前为止,我已经把它放在一起,但我不确定是什么导致了错误。我见过其他类似的错误,但似乎无法找出他们是如何修复它的。
我没有发布的实际包含该问题的代码是这样的
Renderer::~Renderer(){
DestroyInstance();
DeinitDevice();
}
我从我意外遵循的教程中转置了这两个。 应该是这个
Renderer::~Renderer(){
DeinitDevice();
DestroyInstance();
}
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- 成员函数 bad() 的 std::ftsream 用于检查
- 使用 boost::asio 和 boost::thread 时"Bad file descriptor"
- OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误