创建启用了WSI扩展的Vulkan实例
译者注:示例代码点击此处
为了能够在屏幕上正确显示图像,我们需要启用一组WSI扩展。 它们分为实例级和设备级,具体取决于它们引入的功能。 第一步是创建一个Vulkan实例,其中包含一组启用的扩展,允许我们创建一个表示表面 - 应用程序窗口的Vulkan表示。
怎么做...
在windows操作系统上:
1.准备一个名为instance的VkInstance类型变量。
2.准备名为desired_extensions的typestd::vector<charconst*>类型变量。在desired_extensions中储存要启用的所有扩展名的名称。
3.使用VK_KHR_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
4.使用VK_KHR_WIN32_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
5.创建一个Vulkan实例对象,为其启用desired_extensions变量中指定的所有扩展(请参阅第一章的创建Vulkan实例)。
在具有XILB接口的X11窗口的Liunx操作系统上:
1.准备一个名为instance的VkInstance类型变量。
2.准备名为desired_extensions的typestd::vector<charconst*>类型变量。在desired_extensions中储存要启用的所有扩展名的名称。
3.使用VK_KHR_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
4.使用VK_KHR_XLIB_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
5.创建一个Vulkan实例对象,为其启用desired_extensions变量中指定的所有扩展(请参阅第一章的创建Vulkan实例)。
在具有XCB接口的X11窗口的Liunx操作系统上:
1.准备一个名为instance的VkInstance类型变量。
2.准备名为desired_extensions的typestd::vector<charconst*>类型变量。在desired_extensions中储存要启用的所有扩展名的名称。
3.使用VK_KHR_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
4.使用VK_KHR_XCB_SURFACE_EXTENSION_NAME值将另一个元素添加到desired_extensions向量。
5.创建一个Vulkan实例对象,为其启用desired_extensions变量中指定的所有扩展(请参阅第一章的创建Vulkan实例)。
这个怎么运作...
实例级扩展负责管理创建和销毁表示层。它是应用程序窗口的(跨平台)表示。通过它,我们可以检查是否能够绘制到窗口(显示图像,呈现文稿,队列系列的附加属性),它的参数是什么,或支持什么样的呈现模式(如果我们想要垂直)同步启用或禁用)。
表示表面(presentation surface)直接连接到我们的应用程序窗口,因此只能以特定于给定操作系统的方式创建它。这就是为什么通过扩展引入此功能的原因,并且每个操作系统都有自己的扩展来创建表示层。在Windows操作系统系列中,此扩展名为VK_KHR_win32_surface。在具有XILB接口的X11窗口的Liunx操作系统系列中,此扩展名为VK_KHR_xlib_surface。在具有XCB窗口系统的Linux操作系统系列中,此扩展名为VK_KHR_xcb_surface。
通过称为VK_KHR_surface的附加扩展来启用销毁表示表面的功能。它适用于所有操作系统。因此,为了正确管理表示表面,检查其参数并验证呈现给它的能力,我们需要在Vulkan实例创建期间启用两个扩展。
提示:
VK_KHR_win32_surface和VK_KHR_surface扩展在Windows系统上引入了创建和销毁表示表面的功能。
VK_KHR_xlib_surface和VK_KHR_surface扩展在使用X11窗口系统和XLIB接口的Linux系统上引入了创建和销毁表示表面的功能。
VK_KHR_xcb_surface和VK_KHR_surface扩展在使用X11窗口系统和XCB接口的Linux系统上引入了创建和销毁表示表面的功能。
为了创建支持创建和销毁表示表面的函数的Vulkan实例,我们需要准备以下代码:
desired_extensions.emplace_back( VK_KHR_SURFACE_EXTENSION_NAME ); desired_extensions.emplace_back(
#ifdef VK_USE_PLATFORM_WIN32_KHR
VK_KHR_WIN32_SURFACE_EXTENSION_NAME
#elif defined VK_USE_PLATFORM_XCB_KHR
VK_KHR_XCB_SURFACE_EXTENSION_NAME
#elif defined VK_USE_PLATFORM_XLIB_KHR
VK_KHR_XLIB_SURFACE_EXTENSION_NAME
#endif
);
return CreateVulkanInstance( desired_extensions, application_name, instance );
在上面的代码中,我们从一个vector变量开始,其中包含我们想要的所有扩展名。
存储并启用。 然后,我们将所需的WSI扩展添加到向量中。 这些扩展的名称是预处理器定义提供的。 它们在vulkan.h文件中定义。 有了它们,我们不需要记住扩展的确切名称,如果我们犯了错误,编译器会告诉我们它。
在完成所需扩展列表的准备工作之后,我们可以按照第1章实例和设备中的创建Vulkan实例内容中所述的相同方式创建Vulkan实例对象。