You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vulkan创建逻辑设备偶发返回VK_ERROR_FEATURE_NOT_PRESENT错误

问题:封装类后调用vkCreateDevice返回VK_ERROR_FEATURE_NOT_PRESENT错误

当使用自定义类封装窗口类和Vulkan类时,调用vkCreateDevice会返回VK_ERROR_FEATURE_NOT_PRESENT错误,但将类中的相同代码移至main函数中时,却能完全正常运行。此前调用SDL_Vulkan_GetInstanceExtensions获取实例扩展时,也遇到过类似问题。

可正常运行的main.cpp

window.createWindow();
engine.window = window.window;

try {
    engine.initialize();
}
catch (XiError error) {
    std::cout << "Error " << error.code << ": " << error.definition << std::endl;
}

window.instance = engine.getVkInstance();

VkPhysicalDeviceProperties deviceProperties;
vkGetPhysicalDeviceProperties(engine.physicalDevice, &deviceProperties);

std::cout << deviceProperties.deviceName << ", Driver Version " << deviceProperties.driverVersion << std::endl;

try {
    window.createSurface();
}
catch (XiError error) {
    std::cout << "Error " << error.code << ": " << error.definition << std::endl;
}
window.mainLoop();

vkDestroyDevice(engine.logicalDevice, nullptr);

vkDestroySurfaceKHR(engine.instance, window.surface, nullptr);
vkDestroyInstance(engine.instance, nullptr);

SDL_DestroyWindow(window.window);
SDL_Quit();

无法正常运行的main.cpp

try {
    app.run();
}
catch (XiError error) {
    std::cout << "Error " << error.code << ": " << error.definition << std::endl;
}

VkPhysicalDeviceProperties deviceProperties;
vkGetPhysicalDeviceProperties(app.engine.physicalDevice, &deviceProperties);

std::cout << deviceProperties.deviceName << ", Driver Version " << deviceProperties.driverVersion << std::endl;

app.window.mainLoop();
app.shutDown();

app.run()实现

window.createWindow();

engine.window = window.window;
engine.createVulkanInstance();

window.instance = engine.getVkInstance();
window.createSurface();

engine.getPhysicalDevices();

engine.selectPhysicalDevice();
engine.createLogicalDevice();

window.mainLoop();

app.shutDown()实现

vkDestroyDevice(engine.logicalDevice, nullptr);

vkDestroySurfaceKHR(engine.instance, window.surface, nullptr);
vkDestroyInstance(engine.instance, nullptr);

SDL_DestroyWindow(window.window);
SDL_Quit();

window、engine和app均为自定义类。尝试手动添加各种所需的支持扩展后问题可解决,但这种方法不够优雅且代码量较大。怀疑这可能是作用域相关的异常,但不确定。

内容的提问来源于stack exchange,提问作者Pixonepro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:40:43