vkDestroyDevice 返回 vkDevice 尚未销毁并EXC_BAD_ACCESS

vkDestroyDevice returns vkDevice has not been Destroyed and EXC_BAD_ACCESS

本文关键字:EXC BAD ACCESS 返回 vkDevice vkDestroyDevice      更新时间:2023-10-16

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();
}