vkGetPhysicalDeviceQueueFamilyProperties
VkQueueFamilyPropertiesVkDeviceQueueCreateInfotypedef struct VkDeviceQueueCreateInfo
{
//VK_STRUCTURE_TYPE_QUEUE_CREATE_INFO。
VkStructureType sType;
//nullptr
const void* pNext;
//控制队列构建的标记信息, 暂时无标志,设置为 0
VkDeviceQueueCreateFlags flags;
//从哪个族中分配队列
uint32_t queueFamilyIndex;
//需分配的队列的个数
uint32_t queueCount;
const float* pQueuePriorities;
} VkDeviceQueueCreateInfo;
void vkGetDeviceQueue (
VkDevice device,
uint32_t queueFamilyIndex,
uint32_t queueIndex,
VkQueue* pQueue
);
VkResult vkCreateCommandPool
(
VkDevice device,
const VkCommandPoolCreateInfo* pCreateInfo,
//应用程序管理的主机内存分配
const VkAllocationCallbacks* pAllocator,
VkCommandPool* pCommandPool
);
VkCommandPoolCreateInfotypedef struct VkCommandPoolCreateInfo
{
//VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//池以及从池分配的命令缓冲区的行为
VkCommandPoolCreateFlags flags;
//指定队列族
uint32_t queueFamilyIndex;
} VkCommandPoolCreateInfo;
VkCommandPoolCreateFlagBits
VkResult vkAllocateCommandBuffers (
VkDevice device,
const VkCommandBufferAllocateInfo* pAllocateInfo,
VkCommandBuffer* pCommandBuffers
);
VkCommandBufferAllocateInfotypedef struct VkCommandBufferAllocateInfo
{
//VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_ INFO
//or
//VK_COMMAND_BUFFER_LEVEL_SECONDARY
VkStructureType sType;
const void* pNext;
VkCommandPool commandPool;
VkCommandBufferLevel level;
//要从缓存池中分配的命令缓冲区的数量
uint32_t commandBufferCount;
} VkCommandBufferAllocateInfo;
void vkFreeCommandBuffers (
VkDevice device,
VkCommandPool commandPool,
uint32_t commandBufferCount,
const VkCommandBuffer* pCommandBuffers
);
void vkDestroyCommandPool (
VkDevice device,
VkCommandPool commandPool,
const VkAllocationCallbacks* pAllocator
);
VkResult vkBeginCommandBuffer (
VkCommandBuffer commandBuffer,
const VkCommandBufferBeginInfo* pBeginInfo
);
VkCommandBufferBeginInfotypedef struct VkCommandBufferBeginInfo
{
//VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//命令缓冲区将会如何使用
VkCommandBufferUsageFlags flags;
//开启副命令缓冲区所需要的 第 13 章介绍
const VkCommandBufferInheritanceInfo* pInheritanceInfo;
} VkCommandBufferBeginInfo;
VkCommandBufferUsageFlagBits
void vkCmdCopyBuffer (
VkCommandBuffer commandBuffer,
//指定源
VkBuffer srcBuffer,
//指目标
VkBuffer dstBuffer,
//指定区域的数量
uint32_t regionCount,
//区域数组的地址
const VkBufferCopy* pRegions
);
VkBufferCopytypedef struct VkBufferCopy
{
//源偏移值
VkDeviceSize srcOffset;
//目标偏移值
VkDeviceSize dstOffset;
//要复制的区域的大小
VkDeviceSize size;
} VkBufferCopy;
VkResult vkEndCommandBuffer (VkCommandBuffer commandBuffer);
vkAllocateCommand Buffers() 获取一个或者多个命令缓冲区的句柄,将命令记录到命令缓冲区中vkFreeCommandBuffers() 把缓冲区归还到各自的池内VkResult vkResetCommandBuffer (
VkCommandBuffer commandBuffer,
//指定重置命令缓冲区时的附加操作
//现只有 VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT
VkCommandBufferResetFlags flags
);
VkResult vkResetCommandPool (
VkDevice device,
VkCommandPool commandPool,
//VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT
VkCommandPoolResetFlags flags
);
VkResult vkQueueSubmit (
//目标设备队列
VkQueue queue,
//提交的次数
uint32_t submitCount,
//描述了每一次提交的信息
const VkSubmitInfo* pSubmits,
//栅栏(fence)对象的句柄
//可用来等待本次提交执行的命令完成
VkFence fence
);
VkSubmitInfotypedef struct VkSubmitInfo
{
//VK_STRUCTURE_TYPE_SUBMIT_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//第十一章介绍等待信号量数量
uint32_t waitSemaphoreCount;
//第十一章介绍等待信号量
const VkSemaphore* pWaitSemaphores;
//第十一章介绍
const VkPipelineStageFlags* pWaitDstStageMask;
//要执行的命令缓冲区的个数
uint32_t commandBufferCount;
//要执行的命令缓冲区
const VkCommandBuffer* pCommandBuffers;
//第十一章介绍信号量个数
uint32_t signalSemaphoreCount;
//第十一章介绍信号量
const VkSemaphore* pSignalSemaphores;
} VkSubmitInfo;
VkResult vkQueueWaitIdle (VkQueue queue);
VkResult vkDeviceWaitIdle (VkDevice device);
屏障是一种同步机制,用来管理内存访问,以及在 Vulkan 管线各个阶段里的资源状态变化
对资源访问进行同步和改变状态的主要命令
void vkCmdPipelineBarrier (
VkCommandBuffer commandBuffer,
//哪个阶段的管线最后写入资源
VkPipelineStageFlags srcStageMask,
//哪个阶段接下来要从资源读数据
VkPipelineStageFlags dstStageMask,
//由屏障表示的依赖关系如何影响屏障引用的资源
//只有 VK_DEPENDENCY_BY_REGION_BIT
//表示屏障只影响被源阶段(如果能确定)改变的区域,此区域被目标阶段所使用
VkDependencyFlags dependencyFlags,
uint32_t memoryBarrierCount,
const VkMemoryBarrier* pMemoryBarriers,
uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier* pBufferMemoryBarriers,
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier* pImageMemoryBarriers
);
VkPipelineStageFlags
vkCmdCopyImage() 或 vkCmdCopyBuffer() 等调用产生的任何延迟转移已经完成单次调用 vkCmdPipelineBarrier() 可用来触发多个屏障操作
有 3 种类型的屏障操作
vkCmdPipelineBarrier() 的形参 VkMemoryBarrier
typedef struct VkMemoryBarrier
{
//VK_STRUCTURE_TYPE_MEMORY_BARRIER
VkStructureType sType;
//nullptr
const void* pNext;
//源的访问掩码
VkAccessFlags srcAccessMask;
//目标的访问掩码
VkAccessFlags dstAccessMask;
} VkMemoryBarrier;
VkAccessFlagBits
vkCmdDrawIndirect()vkCmdDispatchIndirect()vkCmdDrawIndexed()vkCmdDrawIndexedIndirect()vkCmdCopyImage()vkCmdCopyBuffer()vkCmdCopyBufferToImage()vkCmdPipeline Barrier()
pBufferMemoryBarriersVkBufferMemoryBarriertypedef struct VkBufferMemoryBarrier
{
//VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER
VkStructureType sType;
//nullptr
const void* pNext;
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
//缓冲区的所有权从一个队列转移到另一个队列且这些队列属于不同的族
//没有转移下面两个参数为 VK_QUEUE_FAMILY_IGNORED
uint32_t srcQueueFamilyIndex;
uint32_t dstQueueFamilyIndex;
//缓冲区
VkBuffer buffer;
//控制对整个缓冲区的访问为 0
VkDeviceSize offset;
//控制对整个缓冲区的访问为 VK_WHOLE_SIZE
VkDeviceSize size;
} VkBufferMemoryBarrier;
VkImageMemoryBarriertypedef struct VkImageMemoryBarrier
{
//VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
VkStructureType sType;
//nullptr
const void* pNext;
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
//屏障前面的图像所使用的布局
VkImageLayout oldLayout;
//屏障后面的图像所使用的布局
VkImageLayout newLayout;
uint32_t srcQueueFamilyIndex;
uint32_t dstQueueFamilyIndex;
VkImage image;
//影响到图像的哪些部分
VkImageSubresourceRange subresourceRange;
} VkImageMemoryBarrier;
VkImageSubresourceRangetypedef struct VkImageSubresourceRange
{
VkImageAspectFlags aspectMask;
//指定最小数字的(最高分辨率)mipmap 层级
//无则为0
uint32_t baseMipLevel;
//指定层级数量
//无则为1
uint32_t levelCount;
//设置第一个层的索引
//无则为0
uint32_t baseArrayLayer;
//包含的层数
//无则为1
uint32_t layerCount;
} VkImageSubresourceRange;
void vkCmdFillBuffer (
VkCommandBuffer commandBuffer,
//需要填充数据的缓冲区
VkBuffer dstBuffer,
//指定填充操作开始的位置
//必须是 4 的倍数
//全部填充 0
VkDeviceSize dstOffset,
//指定填充区域的大小
//必须是 4 的倍数
//全部填充 VK_WHOLE_SIZE
VkDeviceSize size,
uint32_t data
);
vkCmdFillBuffer()void vkCmdUpdateBuffer (
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dataSize,
//指向包含数据(最终会复制进缓冲区对象)的主机内存
const uint32_t* pData
);
vkCmdUpdateBuffer() 调用完成后,就可以释放主机内存数据结构体,或覆盖该结构体的内容vkCmdFillBuffer() 比使用缓冲区映射并调用 vkCmdCopyBuffer() 高效得多void vkCmdClearColorImage (
VkCommandBuffer commandBuffer,
//需要清除数据的图像
VkImage image,
//在执行清除操作时,图像期望的布局
//VK_IMAGE_LAYOUT_GENERAL
//VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
VkImageLayout imageLayout,
//用于清除图像的值 union
const VkClearColorValue* pColor,
//指定区域的数量
uint32_t rangeCount,
const VkImageSubresourceRange* pRanges
);
VkClearColorValuetypedef union VkClearColorValue
{
float float32[4];
int32_t int32[4];
uint32_t uint32[4];
} VkClearColorValue;
VkImageSubresourceRangetypedef struct VkImageSubresourceRange
{
//必须设置为 VK_IMAGE_ASPECT_COLOR_BIT
VkImageAspectFlags aspectMask;
uint32_t baseMipLevel;
uint32_t levelCount;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkImageSubresourceRange;
void vkCmdClearDepthStencilImage (
VkCommandBuffer commandBuffer,
VkImage image,
VkImageLayout imageLayout,
const VkClearDepthStencilValue* pDepthStencil,
uint32_t rangeCount,
const VkImageSubresourceRange * pRanges
);
VkClearDepthStencilValuetypedef struct VkClearDepthStencilValue
{
float depth;
uint32_t stencil;
} VkClearDepthStencilValue;
VkImageSubresourceRangetypedef struct VkImageSubresourceRange
{
//含VK_IMAGE_ASPECT_DEPTH_BIT和/或VK_IMAGE_ASPECT_STENCIL_BIT
VkImageAspectFlags aspectMask;
uint32_t baseMipLevel;
uint32_t levelCount;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkImageSubresourceRange;
void vkCmdCopyBufferToImage (
VkCommandBuffer commandBuffer,
VkBuffer srcBuffer,
VkImage dstImage,
//VK_IMAGE_LAYOUT_GENERAL
//VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
VkImageLayout dstImageLayout,
uint32_t regionCount,
//需要更新的区域
const VkBufferImageCopy* pRegions
);
VkBufferImageCopytypedef struct VkBufferImageCopy
{
//缓冲区中数据的偏移量
VkDeviceSize bufferOffset;
//源图像中纹素的个数
//为 0, 图像是在缓冲区中紧密排布与imageExtent.width 相等
uint32_t bufferRowLength;
//指定图像数据的行数
//为 0,为源图像的行数等于imageExtent.height
uint32_t bufferImageHeight;
VkImageSubresourceLayers imageSubresource;
VkOffset3D imageOffset;
VkExtent3D imageExtent;
} VkBufferImageCopy;
VkImageSubresourceLayerstypedef struct VkImageSubresourceLayers
{
//包含一个或者多个图像层面
VkImageAspectFlags aspectMask;
uint32_t mipLevel;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkImageSubresourceLayers;
void vkCmdCopyImageToBuffer (
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkBuffer dstBuffer,
uint32_t regionCount,
const VkBufferImageCopy* pRegions
);
void vkCmdCopyImage (
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkImageCopy* pRegions
);
VkImageCopytypedef struct VkImageCopy
{
VkImageSubresourceLayers srcSubresource;
VkOffset3D srcOffset;
VkImageSubresourceLayers dstSubresource;
VkOffset3D dstOffset;
VkExtent3D extent;
} VkImageCopy;
vkCmdCopyImage() 命令,也可以在两幅压缩图像间或者压缩图像与非压缩图像间复制数据
void vkCmdBlitImage (
VkCommandBuffer commandBuffer,
//必须支持 VK_FORMAT_FEATURE_BLIT_SRC_BIT
VkImage srcImage,
VkImageLayout srcImageLayout,
//必须支持 VK_FORMAT_FEATURE_ BLIT_DST_BIT
VkImage dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkImageBlit* pRegions,
//VK_FILTER_NEAREST 或 VK_FILTER_LINEAR
VkFilter filter
);
VkImageBlitypedef struct VkImageBlit {
//定义源图像的子资源
VkImageSubresourceLayers srcSubresource;
//定义待复制区域的一角
VkOffset3D srcOffsets[2];
//定义目标图像子资源
VkImageSubresourceLayers dstSubresource;
//定义目标区域的另外一角
VkOffset3D dstOffsets[2];
} VkImageBlit;
VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex
);
VkResult vkCreateWin32SurfaceKHR(
VkInstance instance,
const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface
);
VkWin32SurfaceCreateInfoKHRtypedef struct VkWin32SurfaceCreateInfoKHR
{
//VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR
VkStructure Type sType;
//nullptr
const void* pNext;
//为 0
VkWin32SurfaceCreateFlagsKHR flags;
//用来创建本地窗口的应用程序或者模块的 HINSTANCE
//可以调用 Win32 函数 GetModuleHandle 获取
HINSTANCE hinstance;
//本地窗口的句柄
HWND hwnd;
} VkWin32SurfaceCreateInfoKHR;
VkResult vkCreateSwapchainKHR(
VkDevice device,
const VkSwapchainCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSwapchainKHR* pSwapchain
);
VkSwapchainCreateInfoKHRtypedef struct VkSwapchainCreateInfoKHR
{
//VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
VkStructureType sType;
//nullptr
const void* pNext;
//设置为 0
VkSwapchainCreateFlagsKHR flags;
VkSurfaceKHR surface;
//交换链中的图像个数
//双缓冲或者三缓冲
//为 1 表示要求直接渲染到前端缓冲区并显示
//可调用 vkGetPhysicalDeviceSurfaceCapabilitiesKHR()来获取交换链支持的最小和最大图像数目
uint32_t minImageCount;
//的图像的格式
VkFormat imageFormat;
//颜色空间
VkColorSpaceKHR imageColorSpace;
//中图像以像素为单位的维度
VkExtent2D imageExtent;
//每张图像的层数
uint32_t imageArrayLayers;
//图像将如何使用
VkImageUsageFlags imageUsage;
//图像在队列之间是如何共享的
//如果图像在每个时刻仅用在一个队列上
//为 VK_SHARING_MODE_EXCLUSIVE
//用在多个队列上VK_SHARING_MODE_CONCURRENT
VkSharingMode imageSharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices;
//图像在展示给用户之前如何做变换
//允许旋转或者翻转
VkSurfaceTransformFlagBitsKHR preTransform;
//如何处理 alpha 分量
//忽略 alpha,为VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
VkCompositeAlphaFlagBitsKHR compositeAlpha;
//控制了与窗口系统的同步,以及图像展示到表面上的速率
VkPresentModeKHR presentMode;
VkBool32 clipped;
//窗口改变尺寸并且交换链需要重新分配更大的图像时需要
VkSwapchainKHR oldSwapchain;
} VkSwapchainCreateInfoKHR;
VkCompositeAlphaFlagBitsKHR
VkSwapchainCreateInfoKHR 中的参数必须和表面的能力相匹配
VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
VkSurfaceCapabilitiesKHR* pSurfaceCapabilities
);
VkSurfaceCapabilitiesKHRtypedef struct VkSurfaceCapabilitiesKHR {
uint32_t minImageCount;
uint32_t maxImageCount;
VkExtent2D currentExtent;
VkExtent2D minImageExtent;
VkExtent2D maxImageExtent;
uint32_t maxImageArrayLayers;
VkSurfaceTransformFlagsKHR supportedTransforms;
VkSurfaceTransformFlagBitsKHR currentTransform;
VkCompositeAlphaFlagsKHR supportedCompositeAlpha;
VkImageUsageFlags supportedUsageFlags;
} VkSurfaceCapabilitiesKHR;
VkResult vkGetSwapchainImagesKHR(
VkDevice device,
VkSwapchainKHR swapchain,
//获取的图像数量
//pSwapchainImages 为 nullptr时会被重写为交换链中的图像数量
uint32_t* pSwapchainImageCount,
//指向 VkImage 类型数组的指针
VkImage* pSwapchainImages
);
vkGetSwapchainImagesKHR()VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pSurfaceFormatCount,
VkSurfaceFormatKHR* pSurfaceFormats
);
VkSurfaceFormatKHRtypedef struct VkSurfaceFormatKHR {
VkFormat format;
//VK_COLORSPACE_SRGB_NONLINEAR_KHR。
VkColorSpaceKHR colorSpace;
} VkSurfaceFormatKHR;
vkGetSwapchainImagesKHR() 获取的图像并不是马上就能用的
vkAcquireNextImageKHR()获取下一幅可用的图像VkResult vkAcquireNextImageKHR(
VkDevice device,
VkSwapchainKHR swapchain,
//等待时间
//如果超时, 将会返回 VK_NOT_READY
//为 0,可以实现非阻塞行为
uint64_t timeout,
//传入信号量句柄
VkSemaphore semaphore,
//传入栅栏
VkFence fence,
//下一个应用程序渲染的图像的索引
uint32_t* pImageIndex
);
VK_KHR_display 和 VK_KHR_display_swapchain 扩展提供VkResult vkGetPhysicalDeviceDisplayPropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPropertiesKHR* pProperties
);
VkDisplayPropertiesKHRtypedef struct VkDisplayPropertiesKHR
{
VkDisplayKHR display;
//可读的字符串,描述了显示器
const char* displayName;
//显示器的尺寸,以毫米为单位
VkExtent2D physicalDimensions;
//显示器的分辨率,以像素为单位
VkExtent2D physicalResolution;
//显示时支持翻转或者旋转
VkSurfaceTransformFlagsKHR supportedTransforms;
//如果显示器支持多个平面,那么当这些平面相互之间的顺序可重排时
//设置为 VK_TRUE
//如果这些平面只能以固定的顺序显示,设置为 VK_FALSE
VkBool32 planeReorderPossible;
//接受部分更新或者低频率的更新
VkBool32 persistentContent;
} VkDisplayPropertiesKHR;
VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlanePropertiesKHR* pProperties
);
VkDisplayPlanePropertiesKHRtypedef struct VkDisplayPlanePropertiesKHR
{
//显示器
VkDisplayKHR currentDisplay;
//平面之间的叠加顺序
uint32_t currentStackIndex;
} VkDisplayPlanePropertiesKHR;
VkResult vkGetDisplayPlaneSupportedDisplaysKHR(
VkPhysicalDevice physicalDevice,
//显示器平面
uint32_t planeIndex,
//显示器数量
uint32_t* pDisplayCount,
VkDisplayKHR* pDisplays
);
VkResult vkGetDisplayPlaneCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
//显示模式
VkDisplayModeKHR mode,
uint32_t planeIndex,
VkDisplayPlaneCapabilitiesKHR* pCapabilities
);
VkDisplayPlaneCapabilitiesKHRtypedef struct VkDisplayPlaneCapabilitiesKHR
{
//显示平面支持的组合模式
VkDisplayPlaneAlphaFlagsKHR supportedAlpha;
//可展示区域的最小偏移量
VkOffset2D minSrcPosition;
//可展示区域的最大偏移量
VkOffset2D maxSrcPosition;
//最小尺寸
VkExtent2D minSrcExtent;
//最大尺寸
VkExtent2D maxSrcExtent;
//在其上放置对应的物理显示器上的平面最小偏移量
VkOffset2D minDstPosition;
//在其上放置对应的物理显示器上的平面最大偏移量
VkOffset2D maxDstPosition;
//该显示器上以像素为单位的物理尺寸
VkExtent2D minDstExtent;
//该显示器上以像素为单位的物理尺寸
VkExtent2D maxDstExtent;
} VkDisplayPlaneCapabilitiesKHR;
VkDisplayPlaneAlphaFlagsKHR
VkResult vkGetDisplayModePropertiesKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
uint32_t* pPropertyCount,
VkDisplayModePropertiesKHR* pProperties
);
VkDisplayModePropertiesKHRtypedef struct VkDisplayModePropertiesKHR {
//该显示模式
VkDisplayModeKHR displayMode;
VkDisplayModeParametersKHR parameters;
} VkDisplayModePropertiesKHR;
VkDisplayModeParametersKHRtypedef struct VkDisplayModeParametersKHR
{
//显示范围(以像素为单位)
VkExtent2D visibleRegion;
//刷新频率
uint32_t refreshRate;
} VkDisplayModeParametersKHR;
VkResult vkCreateDisplayModeKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
const VkDisplayModeCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDisplayModeKHR* pMode
);
VkDisplayModeCreateInfoKHRtypedef struct VkDisplayModeCreateInfoKHR
{
//VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR
VkStructureType sType;
//nullptr
const void* pNext;
//为 0
VkDisplayModeCreateFlagsKHR flags;
VkDisplayModeParametersKHR parameters;
} VkDisplayModeCreateInfoKHR;
VkResult vkCreateDisplayPlaneSurfaceKHR(
VkInstance instance,
const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface
);
VkDisplaySurfaceCreateInfoKHRtypedef struct VkDisplaySurfaceCreateInfoKHR
{
//VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR
VkStructureType sType;
//nullptr
const void* pNext;
//为 0
VkDisplaySurfaceCreateFlagsKHR flags;
//显示模式
//可以是预定义的模式
//或通过调用 vkCreateDisplayModeKHR() 产生的用户自定义的显示模式
VkDisplayModeKHR displayMode;
//该平面
uint32_t planeIndex;
//相对次序
uint32_t planeStackIndex;
//图像翻转或者旋转
VkSurfaceTransformFlagBitsKHR transform;
float globalAlpha;
//VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR
//VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR
//VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR
VkDisplayPlaneAlphaFlagBitsKHR alphaMode;
//可展示表面的尺寸
//对于全屏渲染,这个应该和 displayMode 选择的显示模式的范围一样
VkExtent2D imageExtent;
} VkDisplaySurfaceCreateInfoKHR;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR() 可以获取该能力VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
VkBool32* pSupported
);
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 布局即可展示VkResult vkQueuePresentKHR(
VkQueue queue,
const VkPresentInfoKHR* pPresentInfo
);
VkPresentInfoKHRtypedef struct VkPresentInfoKHR
{
//VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
VkStructureType sType;
//nullptr
const void* pNext;
//等待一个或者多个信号量
//来使渲染图像和展示操作保持同步
uint32_t waitSemaphoreCount;
const VkSemaphore* pWaitSemaphores;
uint32_t swapchainCount;
const VkSwapchainKHR* pSwapchains;
const uint32_t* pImageIndices;
VkResult* pResults;
} VkPresentInfoKHR;
vkQueuePresentKHR() 可以同时向多个交换链中展示多幅图像void vkDestroySwapchainKHR(
VkDevice device,
VkSwapchainKHR swapchain,
const VkAllocationCallbacks* pAllocator
);