Vulkan SDK之 Swapchain
Swapchain是一系列最终会展示给用户的图像的集合。
/*
* Set up swapchain:
* - Get supported uses for all queues
* - Try to find a queue that supports both graphics and present
* - If no queue supports both, find a present queue and make sure we have a
* graphics queue
* - Get a list of supported formats and use the first one
* - Get surface properties and present modes and use them to create a swap
* chain
* - Create swap chain buffers
* - For each buffer, create a color attachment view and set its layout to
* color attachment
*/
Vulkan and the Windowing System
1、跟其他图形API不同,vulkan 将window相关的操作和图形核心的API隔离;窗口使用对应的扩展,KHR 代表了这是一种Khronos Extension.
VK_USE_PLATFORM_ANDROID_KHR - Android VK_USE_PLATFORM_WAYLAND_KHR - Wayland VK_USE_PLATFORM_WIN32_KHR - Microsoft Windows VK_USE_PLATFORM_XCB_KHR - X Window System, using the XCB library VK_USE_PLATFORM_XLIB_KHR - X Window System, using the Xlib library
2、VkSurfaceKHR
是对原生平台设备表面或者窗口的一种抽象;
Revisiting Instance and Device Extensions
Instance Extensions
Device Extensions
1、swapchain只是一系列需要展示的图片,具体要将这些图片显示到显示器上,需要硬件进行操作,这个时候需要用到 VK_KHR_SWAPCHAIN_EXTENSION_NAME;
Queue Family and Present
1、vkQueuePresentKHR() 需要找到一个同时指出graphics和present的famaliy;
Device Surface Formats
1、 VkSurfaceFormatKHR
能获取当前显示设备指出的VkFormat;
Surface Capabilities
1、Swapchain的创建需要提供一些额外的信息,可以通过vkGetPhysicalDeviceSurfaceCapabilitiesKHR()
和 vkGetPhysicalDeviceSurfacePresentModesKHR()获取;
2、 minImageCount用来决定当前使用的是双缓冲还是三缓冲区。 双缓冲区一个render,一个present; 三缓冲区一个用来present,其他两个用来render;
Different Queue Families for Graphics and Present
1、如果graphics queue和 present queue family是不同的,需要做一些额外的工作可以让imagine在各个queue之间进行共享;
swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; swapchain_ci.queueFamilyIndexCount = 0; swapchain_ci.pQueueFamilyIndices = NULL; uint32_t queueFamilyIndices[2] = { (uint32_t)info.graphics_queue_family_index, (uint32_t)info.present_queue_family_index}; if (info.graphics_queue_family_index != info.present_queue_family_index) { // If the graphics and present queues are from different queue families, // we either have to explicitly transfer ownership of images between the // queues, or we have to create the swapchain with imageSharingMode // as VK_SHARING_MODE_CONCURRENT swapchain_ci.imageSharingMode = VK_SHARING_MODE_CONCURRENT; swapchain_ci.queueFamilyIndexCount = 2; swapchain_ci.pQueueFamilyIndices = queueFamilyIndices; }
Create Swapchain
1、vkCreateSwapchainKHR 创建了一系列的图像来组成swapchain,但在实际使用的过程中,我们需要告诉GPU当前使用的是哪个image,这个时候就用到如下的接口
vkGetSwapchainImagesKHR;通过这个接口你可以获得
一系列images的handle;
Create Image Views
1、swapchain是一系列的images,但是当我们需要使用这些image的时候,我们就需要为image创建imagin view。 “view”用来告诉vulkan如何使用这些imagin。
2、VkImageViewCreateInfo
用来创建所需的imageview;