Новый проект Vulkan в CLion на Mac OS не создаст VkInstance - PullRequest
0 голосов
/ 05 декабря 2018

После моей первой успешной попытки 3D-движка с использованием Java и OpenGL (LWJGL3) я решил попробовать свои силы в Vulkan, используя C ++.У меня почти нет опыта работы с C / C ++, и я знаю о крутой кривой обучения Vulkan.Это, однако, не проблема.

Я решил следовать этому руководству: https://vulkan -tutorial.com / Введение

Он показал мне, как создать новыйпроект с Vulkan с использованием XCode (как я на Mac OS Mojave).Однако я хотел бы продолжить оставшуюся часть учебника, используя CLion, так как я переключаюсь между несколькими операционными системами.

Я попробовал свои силы в создании проекта CLion и преуспел в создании моего первого файла CMakeLists, однакокажется, что-то не так.Файл в настоящее время состоит из следующего:

cmake_minimum_required(VERSION 3.12)
project(VulkanTesting)

set(CMAKE_CXX_STANDARD 14)

add_executable(VulkanTesting main.cpp)

include_directories(/usr/local/include)
include_directories(/Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/include)

target_link_libraries(VulkanTesting /usr/local/lib/libglfw.3.3.dylib)
target_link_libraries(VulkanTesting /Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib/libvulkan.1.dylib)
target_link_libraries(VulkanTesting /Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib/libvulkan.1.1.92.dylib)

# Don't know if I need the next two lines
link_directories(/usr/local/lib)
link_directories(/Users/[username]/Documents/Vulkan/SDK/vulkansdk-macos-1.1.92.1/macOS/lib)

Причина, по которой я показал вышеупомянутый файл, станет очевидной в вопросе.

До сих пор «Программа» выглядит следующим образом:

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

#include <iostream>
#include <stdexcept>
#include <functional>
#include <cstdlib>
#include <vector>

const int WIDTH = 800;
const int HEIGHT = 600;

class HelloTriangleApplication {
public:
    void run() {
        initWindow();
        initVulkan();
        mainLoop();
        cleanup();
    }

private:
    GLFWwindow* window;
    VkInstance instance;

    void initWindow(){
        glfwInit();
        glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
        window = glfwCreateWindow(WIDTH, HEIGHT, "My first Vulkan window", nullptr, nullptr);
    }

    void initVulkan() {
        createInstance();
    }

    void createInstance(){
        // Instantiate Application Info
        VkApplicationInfo applicationInfo = {};
        applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
        applicationInfo.pApplicationName = "Hello Triangle";
        applicationInfo.applicationVersion = VK_MAKE_VERSION(1,0,0);
        applicationInfo.pEngineName = "No Engine";
        applicationInfo.engineVersion = VK_MAKE_VERSION(1,0,0);
        applicationInfo.apiVersion = VK_API_VERSION_1_0;

        // Instantiate Instance Creation Info
        VkInstanceCreateInfo createInfo = {};
        createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
        createInfo.pApplicationInfo = &applicationInfo;

        // Get GLFW platform specific extensions
        uint32_t glfwExtensionCount = 0;
        const char** glfwExtensions;
        glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);


        // Fill in required extensions in Instance Creation Info
        createInfo.enabledExtensionCount = glfwExtensionCount;
        createInfo.ppEnabledExtensionNames = glfwExtensions;

        // For validation layers, this is a later step in the tutorial.
        createInfo.enabledLayerCount = 0;

        // Create the Vulkan instance, and check if it was successful.
        VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
        if(result != VK_SUCCESS){
            std::cout << "glfwExtensionCount: " << glfwExtensionCount << "\n";
            std::cout << "glfwExtensionNames: " << &glfwExtensions << "\n";
            std::cout << "result: " << result << "\n";
            throw std::runtime_error("Failed to create Vulkan Instance");
        }

    }

    void mainLoop() {
        while(!glfwWindowShouldClose(window)){
            glfwPollEvents();
        }
    }

    void cleanup() {
        glfwDestroyWindow(window);
        glfwTerminate();
    }
};

int main() {
    HelloTriangleApplication app;

    try {
        app.run();
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

Проблема, с которой я столкнулся, заключается в том, что при попытке запустить программу она не создает VkInstance.Функция возвращает VK_ERROR_INCOMPATIBLE_DRIVER.Теперь я сомневаюсь, что драйвер на самом деле несовместим, поскольку я запустил демонстрационные приложения, которые поставлялись с Vulkan SDK для одного, а для другого я смог запустить точно такую ​​же «программу» в XCode.Когда я исследовал проблему немного дальше, я заметил, что функция glfwGetRequiredInstanceExtensions не возвращает никаких расширений, когда программа запускается в CLion, как это, но возвращает одно в эквиваленте XCode.

Все это приводит меня кПолагаю, что я неправильно сделал, связав библиотеки / фреймворки в файле Cmake, потому что мне известно о том, что Vulkan не поддерживается напрямую в Mac OS, а вместо этого (каким-то образом?) проходит через слой для связи с Metal.

Нужно ли указывать способ, с помощью которого программа пропускает свои функциональные возможности Vulkan через слой Metal, и это выполняется автоматически в XCode, или есть другая проблема с моим подходом?

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 05 декабря 2018

Возможно, вы захотите взглянуть на Руководство по началу работы с MacOS на веб-сайте LunarXchange и в своем SDK.В конце есть раздел, в котором показано, как использовать CMake для создания приложения Vulkan и запуска его на MacOS.Вы также можете захотеть использовать модуль FindVulkan CMake вместо ручной настройки каталогов включения и целевых библиотек ссылок.

Но мое первое предположение о вашей конкретной проблеме состоит в том, что вы, возможно, не устанавливаете переменную среды VK_ICD_FILENAMES,Вы правы в своем наблюдении, что нет прямой поддержки Vulkan.Вместо этого поддержка предоставляется библиотекой MoltenVK, которая рассматривается как драйвер Vulkan.Но этот «драйвер» не устанавливается ни в один системный каталог с помощью SDK.SDK просто распаковывается в вашей структуре домашних каталогов, поэтому вы должны указать загрузчику Vulkan, где его найти с помощью этой переменной среды.

Опять же, раздел CMake в конце руководства по началу работы демонстрирует использованиеэта переменная окружения.И все руководство содержит дополнительную информацию о том, как работают различные компоненты Vulkan и MoltenVK.

...