gpt4 book ai didi

c++ - 创建 Vulkan 实例导致访问冲突

转载 作者:行者123 更新时间:2023-11-28 01:36:03 25 4
gpt4 key购买 nike

我正在尝试初始化 Vulkan API。
我遇到的问题是在调用 vkCreateInstance 后出现访问冲突错误,我认为问题出在扩展和层列表上。
我正在使用 char buff[20][256] 将它们从字符串传输到 API 调用的结构,我在调试器中看到的层和扩展名称(3 个扩展和 15 个层)都比 256 短很多字符,并且都是空终止的。
扩展或图层名称没有缓冲区溢出,但它崩溃了。

我事先使用 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 应该是指向字符数组的指针 数组。但是您向它传递了一个二维字符数组,实际上它只是一个 20*256 字符的数组。

如果您使用的机器具有 32 位指针,则驱动程序将获取 buffLayer 中的前四个字节并将它们视为指向字符数组的指针。但是你刚刚在那里存储了层名称的前四个字符,'VK_K' 可能不是一个有效的指针值:)。因此,加载程序在尝试取消引用该无效指针时会崩溃。

可能最简单的更改是添加:

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

并将 layerNames 作为 ppEnabledLayerNames 传递。

关于c++ - 创建 Vulkan 实例导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49216604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com