首页 > 解决方案 > 只能在调试中创建 vulkan 设备

问题描述

我正在制作一个 vulkan 渲染器,当我尝试创建一个逻辑设备时,它仅在调试模式下在 vkCreateDevice 上引发以下异常:

在 Game.exe 中的 0x00007FFBA327A34B (vulkan-1.dll) 处引发异常:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。

这是代码(顺便说一句,这主要是按照 vulkan-tutorial.com 教程制作的):

bool FindQueueFamilies(VkPhysicalDevice device, uint32_t* indices)
    {
        bool found = false;

        uint32_t queueFamilyCount = 0;
        vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);

        VkQueueFamilyProperties queueFamilies[512];
        vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies);

        for (uint32_t i = 0; i < queueFamilyCount; i++)
        {
            const auto& queueFamily = queueFamilies[i];

            if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT)
            {
                if (indices != nullptr)
                {
                    *indices = i;
                }

                found = true;
            }
        }

        if (!found)
        {
            Loggers::Error("Didn't find queue family!");
        }

        return found;
    }

...

void* RenderDevice::CreateVulkan(void* physicalDevice)
    {
        //Logical device
        uint32_t indices = 0;
        FindQueueFamilies(*((VkPhysicalDevice*)physicalDevice), &indices);

        float queuePriority = 1.0f;
        VkDeviceQueueCreateInfo queueCreateInfo{};
        queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
        queueCreateInfo.pNext = nullptr;
        queueCreateInfo.flags = 0;
        queueCreateInfo.queueFamilyIndex = indices;
        queueCreateInfo.queueCount = 1;
        queueCreateInfo.pQueuePriorities = &queuePriority;

        VkPhysicalDeviceFeatures deviceFeatures{};

        VkDeviceCreateInfo createInfo{};
        createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
        createInfo.pNext = nullptr;
        createInfo.flags = 0;
        createInfo.queueCreateInfoCount = 1;
        createInfo.pQueueCreateInfos = &queueCreateInfo;

        createInfo.enabledExtensionCount = deviceExtensionsCount;
        createInfo.ppEnabledExtensionNames = deviceExtensions;

        createInfo.pEnabledFeatures = &deviceFeatures;

        VkDevice device;
        if (vkCreateDevice(*((VkPhysicalDevice*)physicalDevice), &createInfo, nullptr, &device) != VK_SUCCESS)
        {
            Loggers::Error("failed to create logical device!");
        }

        VkQueue graphicsQueue;
        vkGetDeviceQueue(device, indices, 0, &graphicsQueue);

        return &device;
    }

标签: c++graphicsc++17vulkan

解决方案


对我来说,您的意思似乎physicalDevice不是*((VkPhysicalDevice*)physicalDevice),因为这就是 vulkan-turorial.com 使用的,这也是我在渲染中使用的。那是你的问题吗?还要记住,访问冲突可能是由错误的指针引起的。


推荐阅读