【发布时间】:2022-06-29 02:17:10
【问题描述】:
我目前正在尝试在我的笔记本电脑(配备 Intel Iris Pro GPU 的 MacBook Pro)上开发基于 vulkan 的图形引擎。我在我的台式电脑(带有 NVIDIA GTX 1080 ti GPU 的 Windows)上开始了这个项目。这在我的台式电脑上完美运行。但是当我尝试在我的笔记本电脑上构建和执行它时,可执行文件无法尝试创建 vulkan 实例并返回“VK_ERROR_INCOMPATIBLE_DRIVER”作为 VkResult。
免责声明:我是 C++ 新手,我知道以下代码不符合大多数 C++ 编码约定。我正在努力使我的代码尽可能地具有可读性,以便我能学得更好。
我正在尝试使用以下代码创建一个新的 vulkan 实例:
VkApplicationInfo app_info{}; // APPLICATION INFO
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; // type of the struct
app_info.pApplicationName = application_name; // name of the application
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0); // version
app_info.pEngineName = application_engine_name; // name of the engine
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0); // version
app_info.apiVersion = VK_API_VERSION_1_0; // API version
// get available GLFW extensions
uint32_t glfw_extension_count = 0;
const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&glfw_extension_count);
// setup create info struct
VkInstanceCreateInfo instance_create_info{}; // INSTANCE CREATION INFO
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; // type of struct
instance_create_info.pApplicationInfo = &app_info; // application info from above
instance_create_info.enabledExtensionCount = glfw_extension_count; // amount of extensions to be enabled
instance_create_info.ppEnabledExtensionNames = glfw_extensions; // extensions to enable
instance_create_info.enabledLayerCount = enable_validation_layers ? static_cast<uint32_t>(validation_layers.size()) : 0; // validation layer count
instance_create_info.ppEnabledLayerNames = enable_validation_layers ? validation_layers.data() : nullptr; // validation layer names
// try creating instance, catch potential error code
VkResult creation_result = vkCreateInstance(&instance_create_info, nullptr, &vulkan_instance);
// check result of instance creation, handle errors
if (creation_result != VK_SUCCESS)
{
string message = "ERROR: Instance creation failed with result '";
message += get_result_string(creation_result);
message += "'.";
throw runtime_error(message);
}
// get extensions available for vulkan instance
uint32_t extension_count = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr);
vector<VkExtensionProperties> extensions(extension_count);
vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extensions.data());
验证层被禁用,因此可以忽略 CreateInfo 结构的最后两行。 "get_result_string()" 只是根据提供的 VkResult 返回一个更清晰的错误字符串:
string get_result_string (VkResult vulkan_result)
{
switch (vulkan_result)
{
case VK_SUCCESS:
return "SUCCESS";
case VK_ERROR_OUT_OF_HOST_MEMORY:
return "OUT OF HOST MEMORY";
case VK_ERROR_OUT_OF_DEVICE_MEMORY:
return "OUT OF DEVICE MEMORY";
case VK_ERROR_INITIALIZATION_FAILED:
return "INITIALIZATION FAILED";
case VK_ERROR_LAYER_NOT_PRESENT:
return "LAYER NOT PRESENT";
case VK_ERROR_EXTENSION_NOT_PRESENT:
return "EXTENSION NOT PRESENT";
case VK_ERROR_INCOMPATIBLE_DRIVER:
return "INCOMPATIBLE DRIVER";
default:
return "UNKNOWN RESULT '" + vulkan_result;
}
}
在 VulkanSDK 文件夹的 Applications 文件夹中运行 vkcube 可以正常工作。运行 vulkaninfo 不会返回任何错误,并且可以成功创建实例和物理设备。根据Vulkan Hardware Database,我的笔记本的GPU应该是支持的。操作系统是最新的,这应该意味着驱动程序也是最新的。可执行文件的整体构建命令如下:
g++ -std=c++17 -O2 -g [SRC FILES] -o [OUTPUT FILE] -L /.../VulkanSDK/1.3.216.0/macOS/lib /.../VulkanSDK/1.3.216.0/macOS/lib/libvulkan.1.dylib /.../VulkanSDK/1.3.216.0/macOS/lib/libvulkan.1.3.216.dylib -L /usr/local/Cellar/glfw/3.3.7/lib/ -lglfw -I /.../VulkanSDK/1.3.216.0/macOS/include -I /usr/local/include/glm -I /usr/local/include/GLFW
此时,我不知道为什么我的可执行文件无法创建 vulkan 实例。这里的一些帮助将不胜感激!有人有想法吗?
【问题讨论】:
-
"操作系统是最新的,这意味着驱动程序也是最新的。" 您的操作系统是 MacOS,不支持 Vulkan。除非您使用 MoltenVK 或将 Vulkan 转换为 Metal 的类似工具。
-
@NicolBolas 我认为你必须在 mac 上使用 MoltenVK 的事实不言而喻。在所有官方 Vulkan API 相关网站上都有明确说明。所以是的......我正在使用 MoltenVK。
-
@vandench 不,我已经尝试执行 python 脚本无济于事。正如我已经说过的,我的 GPU 受支持并列在第二个答案中的链接网站上。
-
您使用的是什么版本的 SDK? SDK 1.3.216 发生了变化,需要对可移植性子集进行一些更改。
标签: c++ macos gpu driver vulkan