我正在嘗試使用該vkCreateInstance()方法,但我從vulkan-1.dll. 我正在使用 SDL 進行視窗化,并且正在使用 Visual Studio 2022,并且 Windows 和我的圖形驅動程式都是最新的
#include <vulkan/vulkan.hpp>
#include <SDL.h>
#include <SDL_vulkan.h>
#include <vector>
#include <iostream>
SDL_Window* window;
int main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "Video initialization failed:" << std::endl;
}
window = SDL_CreateWindow("vkTest", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_VULKAN);
SDL_vulkanInstance inst;
VkInstanceCreateInfo inst_info;
VkApplicationInfo appInfo;
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "engine";
appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.pEngineName = "engine";
appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
appInfo.apiVersion = VK_API_VERSION_1_0;
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pApplicationInfo = &appInfo;
inst_info.flags = 0;
uint32_t vkExtensionCount = 0;
if (!SDL_Vulkan_GetInstanceExtensions(window, &vkExtensionCount, NULL)) {
std::cout << "Unable to get Vulkan extensions." << std::endl;
exit(EXIT_FAILURE);
}
std::vector<const char*> vkExtensions;
vkExtensions.resize(vkExtensionCount);
if (!SDL_Vulkan_GetInstanceExtensions(window, &vkExtensionCount, vkExtensions.data())) {
std::cout << "Unable to get Vulkan extensions." << std::endl;
exit(EXIT_FAILURE);
}
std::cout << *vkExtensions.data() << std::endl;
inst_info.enabledExtensionCount = vkExtensionCount;
inst_info.ppEnabledExtensionNames = vkExtensions.data();
inst_info.enabledLayerCount = 0;
VkResult res = vkCreateInstance(&inst_info, nullptr, &inst);
if (res == VK_ERROR_INCOMPATIBLE_DRIVER) {
std::cout << "Cannot find compadible vulkan driver." << std::endl;
exit(EXIT_FAILURE);
}
else if (res) {
std::cout << "unknown error" << std::endl;
exit(EXIT_FAILURE);
}
}
uj5u.com熱心網友回復:
最可能的原因是您VkInstanceCreateInfo確實包含未初始化的值。您將其宣告為VkInstanceCreateInfo inst_info;未初始化結構。稍后您只將它的一些成員設定為定義的值,從而將未初始化的值傳遞給實作,然后在解釋它們時失敗。VkInstanceCreateInfo例如,有一個pNext成員,它是指向可以包含用于創建實體的附加引數的結構的指標鏈。如果這是未初始化的,則實作嘗試將其解釋為將導致讀取錯誤的指標。
正確的方法是設定inst_info零初始化它的所有成員,如下所示:
VkInstanceCreateInfo inst_info{};
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pApplicationInfo = &appInfo;
通常(不僅對于 Vulkan),您應該對所有結構進行零初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520676.html
