【问题标题】:vkDestroyDevice returns vkDevice has not been Destroyed and EXC_BAD_ACCESSvkDestroyDevice 返回 vkDevice has not been Destroyed 和 EXC_BAD_ACCESS
【发布时间】:2020-05-17 19:23:47
【问题描述】:

运行 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 << "\t\t" << 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 << "\t\t" << 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 = 35\r\n"
@"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.\r\n"
@"    Objects: 1\r\n"
@"        [0] 0x10104e018, type: 3, name: NULL\r\n"

我一直在关注 vulkan 教程,但我无法真正理解,但我发现了一些视频,这些视频解释了教程真正没有涵盖的内容。到目前为止,我已经把它放在一起,但我不确定是什么导致了错误。我见过其他类似的错误,但似乎不知道他们是如何解决的。

【问题讨论】:

  • 我假设您使用 MoltenVK 来支持 Vulkan(因为 macOS 没有原生 Vulkan 支持)。如果是这样,您应该编辑标签以包含moltenvk 标签。
  • 我会调查 MoltenVK,我的实际问题是我在销毁设备之前销毁了实例。我假设破坏实例也会破坏设备。

标签: c++ macos visual-studio-code vulkan


【解决方案1】:

我没有发布的实际上包含问题的代码是这样的

Renderer::~Renderer(){
    DestroyInstance();
    DeinitDevice();
}

我无意中将这两个教程从我正在学习的教程中转了出来。应该是这个

Renderer::~Renderer(){
    DeinitDevice();
    DestroyInstance();
}

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2018-03-19
    • 2019-04-25
    • 2016-11-18
    • 2023-02-24
    • 2011-10-05
    相关资源
    最近更新 更多