簡體   English   中英

創建Vulkan實例會導致訪問沖突

[英]Creating Vulkan instance causes access violation

我正在嘗試初始化Vulkan API。
我遇到的問題是調用vkCreateInstance后收到訪問沖突錯誤,我認為問題來自擴展名和圖層列表。
我正在使用char buff [20] [256]將它們從字符串傳輸到API調用的結構,並且在調試器中看到的層和擴展名(3個擴展和15層)都比256短很多字符,並且均以null終止。
擴展名或圖層名沒有緩沖區溢出,但崩潰了。

我事先使用vkEnumerateInstanceExtensionPropertiesvkEnumerateInstanceLayerProperties接收到的字符串的層和擴展列表都是有效的以空字符結尾的字符串,例如“ VK_KHR_surface”等。

即使它說我支持某些擴展,是否真的不支持它們,並且在嘗試初始化我不支持的擴展時API崩潰,是否有可能?

            void InitializeInstance(void** instance, const vector<string>& layers, const vector<string>& extensions)
    {
        VkApplicationInfo applicationInfo;
            VkInstanceCreateInfo instanceInfo;
            VkInstance* instanceOut = (VkInstance*)instance;

            applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
            applicationInfo.pNext = nullptr;
            applicationInfo.pApplicationName = "MyApp";
            applicationInfo.pEngineName = "MyEngine";
            applicationInfo.engineVersion = 1;
            applicationInfo.apiVersion = VK_API_VERSION_1_0;

            instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
            instanceInfo.pNext = null;
            instanceInfo.flags = 0;
            instanceInfo.pApplicationInfo = &applicationInfo;

            char buffLayer[20][256];
            char buffExt[20][256];

            if(!layers.empty())
            {
                instanceInfo.enabledLayerCount = layers.size();

                for(int i = 0; i < layers.size(); i++)
                {
                    strcpy(buffLayer[i], layers[i].c_str());
                }
                instanceInfo.ppEnabledLayerNames = (char**)buffLayer;
            }
            else
            {
                instanceInfo.enabledLayerCount = 0;
                instanceInfo.ppEnabledLayerNames = nullptr;
            }

            if(!extensions.empty())
            {
                instanceInfo.enabledExtensionCount = extensions.size();

                for(int i = 0; i < extensions.size(); i++)
                {
                    strcpy(buffExt[i], extensions[i].c_str());
                }
                instanceInfo.ppEnabledExtensionNames = (char**)buffExt;
            }
            else
            {
                instanceInfo.enabledExtensionCount = 0;
                instanceInfo.ppEnabledExtensionNames = nullptr;
            }

vkCreateInstance(&instanceInfo, nullptr, instanceOut);
        }

當我只有0個擴展名和0個圖層時,它創建成功。 如果其中任何一個不為0,則崩潰。

char buffLayer[20][256];
instanceInfo.ppEnabledLayerNames = (char**)buffLayer;

ppEnabledLayerNames應該是一個指向字符數組的指針的數組。 但是,您要向其傳遞2D字符數組,實際上是20 * 256個字符的數組。

如果您使用32位指針的計算機,則驅動程序將獲取buffLayer中的前四個字節,並將其視為指向字符數組的指針。 但是,您剛剛在其中存儲了圖層名稱的前四個字符,並且'VK_K'可能不是有效的指針值:)。 因此,當嘗試取消引用該無效指針時,加載程序將崩潰。

可能最簡單的更改是添加:

char* layerNames[20];
for (int i = 0; i < 20; i++)
    layerNames[i] = &buffLayer[i][0];

並將layerNames作為ppEnabledLayerNames傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM