获取Vulkan的XVisualInfo

问题描述 投票:1回答:1

对于带有Xlib的OpenGL,为了创建一个窗口,我们可以从GLX获得适当的XVisualInfo并将其传递给XCreateWindow。但是,如果我想将Vulkan与Xlib一起使用,如何获得正确的XVisualInfo?我还必须链接到GLX吗?

opengl vulkan xlib glx
1个回答
0
投票

Vulkan在这方面做的事情有所不同。首先,因为有了OpenGL的经验以及它与窗口系统交互的方式,所以选择了一种截然不同的方法。

传统上使用OpenGL,您是从某个可绘制对象的属性创建渲染上下文的。在Microsoft中,这与窗口紧密结合,因为视觉格式的选择是基于可绘制对象(又称“窗口”)的像素格式进行的,而您要使用哪个设备上下文来创建渲染上下文。在GLX中,可绘制对象没有紧密的联系,但是您仍然必须为要绘制到的可绘制对象的视觉和帧缓冲配置创建一个上下文匹配。

Vulkan不能那样工作!

首先,在Vulkan中,上下文不再存在。您得到的是instances。并且为每个实例创建physical和逻辑devices的句柄,然后为它们创建images进行绘制。所有这些都与窗口系统完全分开。实际上,使用Vulkan进行无头渲染很简单。

[如果使用OpenGL进行无头渲染需要花费额外的精力,而使用Vulkan则是相反的方式:渲染到窗口需要花费额外的精力。

其关键是所谓的“交换链”。交换链是当今的驱动程序和GPU架构用来管理将图像传送到显示器的方式(双缓冲的缓冲区swap和对OpenGL进行的“ SwapBuffers”调用就是该名称)。要创建交换链,您首先需要在交换链的接收端为所需的可绘制对象获取Vulkan曲面。该功能是Vulkan依赖于窗口系统的扩展的一部分;它们是扩展,因此它们不会与窗口系统集成(WSI)相关的东西混淆Vulkan核心。对于X11,您可以使用vkCreateXcbSurfaceKHRvkCreateXcbSurfaceKHR

创建表面后,您可以在其队列上进行迭代,以查看使用vkCreateXlibSurfaceKHR支持的操作,然后使用vkCreateXlibSurfaceKHR可以使用哪些图像格式。 这一步是与创建GLX上下文有关的查询vkGetPhysicalDeviceSurfaceSupportKHRvkGetPhysicalDeviceSurfaceSupportKHR最接近的匹配项。

一旦您决定了格式,就可以创建交换链,为此您必须再次进行球顶管家,即检查表面带来的功能(此处的能力是指沿着链传输数据的方法)。的功能是vkGetPhysicalDeviceSurfaceFormatsKHRvkGetPhysicalDeviceSurfaceFormatsKHR

利用到此为止所获得的所有信息,您现在决定交换链的格式和配置,并使用Visual创建它。完成后,您可以使用FBConfig获取交换链的图像。

现在您有了交换链的图像,您可以照常在其上创建视图,并将它们用作渲染的附件。恭喜您剃了Vulkanic y牛* Phew *

© www.soinside.com 2019 - 2024. All rights reserved.