5.4 全屏画幕
在前一节提到的平台特定的拓展允许创建的VkSurface对象代表一个操作系统或者窗口系统原生的一个窗口。这些拓展通常被用来在一个桌面上可见的窗口做渲染工作。即使我们可以创建一个不带边框、占满真个屏幕的窗口,这样渲染效率更高。
这个功能由VK_KHR_display和VK_KHR_display_swapchain拓展提供。这些拓展提供了一个平台无关的机制,来获取系统的显示器,判定他们的属性和支持模式等等。
如果Vulkan实现支持VK_KHR_display,你就可以通过调用vkGetPhysicalDeviceDisplayPropertiesKHR()函数来获知屋里设备连接了几个显示器。其原型如下:
VkResult vkGetPhysicalDeviceDisplayPropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPropertiesKHR* pProperties);
显示器是连接在物理设备上的,你想获取哪个显示器的信息需要通过physicalDevice参数指定。pPropertyCount是指向一个变量,将被函数覆盖为连接到设备
的显示器数量。如果pProperties为nullptr,那么被pPropertyCount指向的变量的初始值被忽略,仅被覆盖为连接到设备的显示器总数。然而,如果pPropertyCount
不为nullptr,那么pProperties就是一个指向VkDisplayPropertiesKHR类型数组的指针。数组的长度通过pPropertyCount传递。VkDisplayPropertiesKHR定义为
typedef struct VkDisplayPropertiesKHR {
VkDisplayKHR display;
const char* displayName;
VkExtent2D physicalDimensions;
VkExtent2D physicalResolution;
VkSurfaceTransformFlagsKHR supportedTransforms;
VkBool32 planeReorderPossible;
VkBool32 persistentContent;
} VkDisplayPropertiesKHR;
VkDisplayPropertiesKHR的display成员是之后将被用到的显示器的handle。displayName是人可读的显示器描述字符串。physicalDimensions域给出了显示器的维度,
以毫米为单位,physicalResolution给出了显示器的分辨率,以像素为单位。
一些显示器(或者显示器控制器)在显示时支持反转或者旋转。如果是这种情形,这些能力信息包含在supportedTransforms域中。这个位域由VkSurfaceTransformsFlagsKHR
枚举类型的多个值构成。
如果显示器支持多个显示面板,那么当这些面板可被排序时planeReorderPossible将被置为VK_TRUE,。如果这些面板值能以固定的顺序显示,那么
planeReorderPossible被置为VK_FALSE。
最后,一些显示器可以接受部分或者低频率更新,这样可以提高能源利用率。如果显示器支持以这种方式更新,persistentContent将被置为VK_TRUE,否则为
VK_FALSE.。
所有GPU设备都支持与其相连的每一个显示器上有至少一个显示面板。一个面板可以向用户展示图像。在一些场景下,一个GPU设备可以支持把多个面板拼装起来用来
最终显示一幅图像。这些面板也通常被称为叠加面板,因为每一个面板可以逻辑上叠加在另外一个之上或之下。当一个Vulkan应用显示时,它可以向显示器的一个面板
显示图像。也可在一个应用程序中向多个面板显示。
被支持的面板数量被认为是设备的一部分,通常意义上的显示设备(并不是物理显示器),可以用来从多个面板中融合信息并显示单独一张图像。
一个物理设备就可以显示它所支持的面板上图像的一部分。可以调用vkGetPhysicalDeviceDisplayPlanePropertiesKHR()来查询GPU设备可以支持面板的个数
和类型,其原型如下:
VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlanePropertiesKHR* pProperties);
被查询的覆盖能力的物理设备通过physicalDevice传递。如果pProperties为空,那么pPropertyCount是一个其值将被覆盖为设备能够支持的
在前一节提到的平台特定的拓展允许创建的VkSurface对象代表一个操作系统或者窗口系统原生的一个窗口。这些拓展通常被用来在一个桌面上可见的窗口做渲染工作。即使我们可以创建一个不带边框、占满真个屏幕的窗口,这样渲染效率更高。
这个功能由VK_KHR_display和VK_KHR_display_swapchain拓展提供。这些拓展提供了一个平台无关的机制,来获取系统的显示器,判定他们的属性和支持模式等等。
如果Vulkan实现支持VK_KHR_display,你就可以通过调用vkGetPhysicalDeviceDisplayPropertiesKHR()函数来获知屋里设备连接了几个显示器。其原型如下:
VkResult vkGetPhysicalDeviceDisplayPropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPropertiesKHR* pProperties);
显示器是连接在物理设备上的,你想获取哪个显示器的信息需要通过physicalDevice参数指定。pPropertyCount是指向一个变量,将被函数覆盖为连接到设备
的显示器数量。如果pProperties为nullptr,那么被pPropertyCount指向的变量的初始值被忽略,仅被覆盖为连接到设备的显示器总数。然而,如果pPropertyCount
不为nullptr,那么pProperties就是一个指向VkDisplayPropertiesKHR类型数组的指针。数组的长度通过pPropertyCount传递。VkDisplayPropertiesKHR定义为
typedef struct VkDisplayPropertiesKHR {
VkDisplayKHR display;
const char* displayName;
VkExtent2D physicalDimensions;
VkExtent2D physicalResolution;
VkSurfaceTransformFlagsKHR supportedTransforms;
VkBool32 planeReorderPossible;
VkBool32 persistentContent;
} VkDisplayPropertiesKHR;
VkDisplayPropertiesKHR的display成员是之后将被用到的显示器的handle。displayName是人可读的显示器描述字符串。physicalDimensions域给出了显示器的维度,
以毫米为单位,physicalResolution给出了显示器的分辨率,以像素为单位。
一些显示器(或者显示器控制器)在显示时支持反转或者旋转。如果是这种情形,这些能力信息包含在supportedTransforms域中。这个位域由VkSurfaceTransformsFlagsKHR
枚举类型的多个值构成。
如果显示器支持多个显示面板,那么当这些面板可被排序时planeReorderPossible将被置为VK_TRUE,。如果这些面板值能以固定的顺序显示,那么
planeReorderPossible被置为VK_FALSE。
最后,一些显示器可以接受部分或者低频率更新,这样可以提高能源利用率。如果显示器支持以这种方式更新,persistentContent将被置为VK_TRUE,否则为
VK_FALSE.。
所有GPU设备都支持与其相连的每一个显示器上有至少一个显示面板。一个面板可以向用户展示图像。在一些场景下,一个GPU设备可以支持把多个面板拼装起来用来
最终显示一幅图像。这些面板也通常被称为叠加面板,因为每一个面板可以逻辑上叠加在另外一个之上或之下。当一个Vulkan应用显示时,它可以向显示器的一个面板
显示图像。也可在一个应用程序中向多个面板显示。
被支持的面板数量被认为是设备的一部分,通常意义上的显示设备(并不是物理显示器),可以用来从多个面板中融合信息并显示单独一张图像。
一个物理设备就可以显示它所支持的面板上图像的一部分。可以调用vkGetPhysicalDeviceDisplayPlanePropertiesKHR()来查询GPU设备可以支持面板的个数
和类型,其原型如下:
VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlanePropertiesKHR* pProperties);
被查询的覆盖能力的物理设备通过physicalDevice传递。如果pProperties为空,那么pPropertyCount是一个其值将被覆盖为设备能够支持的