Vulkan和glfw - glfwVulkanSupported()总是返回false

时间:2017-04-01 09:16:03

标签: c++ glfw vulkan

我正在尝试使用GLFW3.2运行基本的Vulkan测试:

#include <vulkan/vulkan.h>
#include <GLFW/glfw3.h>

#include <iostream>

int main(int argc, char *argv[])
{
    if (glfwVulkanSupported())
    {
        std::cout << "vulkan supported !" << std::endl;

    }
    else 
    {
        std::cout << "vulkan NOT supported !" << std::endl;

    }
    return 0;
}

我使用以下cmake构建:

cmake_minimum_required(VERSION 3.5.1)
project(vktest)

set (CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.9")

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Vulkan REQUIRED)
find_package(glfw3 3.2 REQUIRED)
include_directories(${Vulkan_INCLUDE_DIRS})

message("kek")
message(${Vulkan_INCLUDE_DIRS})
message(${Vulkan_LIBRARIES})
message(${Vulkan_LIBRARY})

add_executable(vktest vulkanTest.cpp)

target_link_libraries(vktest ${Vulkan_LIBRARIES})
target_link_libraries(vktest glfw)

构建此功能正常。

但是当我运行程序时,我总是进入else语句。

我安装了nvidia最后一个驱动程序,lunarg的vulkan sdk以下内容 环境变量:

export VULKAN_SDK=/home/mathias/vulkan/VulkanSDK/1.0.42.2/x86_64
set PATH $VULKAN_SDK/bin $PATH
set LD_LIBRARY_PATH $VULKAN_SDK/lib $LD_LIBRARY_PATH
set VK_LAYER_PATH $VULKAN_SDK/etc/explicit_layer.d 

此外,我可以运行立方体示例。

为什么它永远不会返回真实的任何想法?

2 个答案:

答案 0 :(得分:2)

您的代码丢失了#define GLFW_INCLUDE_VULKAN,不是吗?

#define GLFW_INCLUDE_VULKAN //as required by GLFW
#include "vulkan\vk_cpp.hpp" 
#include "GLFW\glfw3.h" 
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    if (!glfwInit()) //Initialize GLFW
    {
        std::cout << "GLFW not initialized.\n";
        abort();
    }
    if (!glfwVulkanSupported()) //Any Vulkan-related function requires GLFW initialized
    {
        std::cout << "Vulkan not supported.\n";
        abort();
    }
    uint32_t ext_count; // an output placeholder
    auto ext_list = glfwGetRequiredInstanceExtensions(&ext_count);

    std::copy(&ext_list[0], &ext_list[ext_count-1], std::ostream_iterator<const char *>(cout, "\n"));

    //feed extension list into InstanceCreateInfo struct in prepare for Vulkan instance creation
    vk::InstanceCreateInfo ifo{ vk::InstanceCreateFlags(), nullptr, 0, nullptr, ext_count, ext_list };
    glfwDefaultWindowHints();
    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); // Comment out this if you need OpenGL also
    GLFWwindow* hWnd = glfwCreateWindow(640, 480, "Foobar", NULL, NULL); // The usual window
    auto inst = vk::createInstance(ifo); // Vulkan instance creation
    vk::SurfaceKHR surf{};
    auto psurf = VkSurfaceKHR(surf); // you can cast vk::* object to Vk* using a type cast
    auto r = glfwCreateWindowSurface(VkInstance(inst), hWnd, NULL, &psurf); //VK_SUCCESS is somehow...0
    // Draw stuff here

    // Finish drawing
    vkDestroySurfaceKHR((VkInstance)inst, VkSurfaceKHR(surf), nullptr);//vkcpp seems have no destructor for surface object
    glfwDestroyWindow(hWnd); //Destroy the surface before the window
    glfwTerminate(); // Free GLFW resource
    return 0;
}

如果此代码中有拼写错误,可以自由修复它们。我无法在当前位置编译它

答案 1 :(得分:1)

您可能错过了glfwInit()来电。

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <cassert>
int main(int argc, const char** argv) {
    assert(glfwInit()); //< Important!
    if(glfwVVulkanSupported()) {
        puts("Success!");
    }
    return 0;
}

通常,在glfwInit()之前应该调用的唯一glfw函数是glfwSetErrorCallback。 (可能还有其他例外,但我不知道。)