void vkCmdBeginRenderPass (
VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo* pRenderPassBegin,
VkSubpassContents contents
);
VkRenderPassBeginInfotypedef struct VkRenderPassBeginInfo
{
//VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
VkStructureType sType;
//nullptr
const void* pNext;
VkRenderPass renderPass;
//被渲染的帧缓冲区
VkFramebuffer framebuffer;
//可以选择只渲染到图像附件的一部分区域
VkRect2D renderArea;
uint32_t clearValueCount;
//转变颜色
const VkClearValue* pClearValues;
} VkRenderPassBeginInfo;
VkClearValuetypedef union VkClearValue
{
VkClearColorValue color;
VkClearDepthStencilValue depthStencil;
} VkClearValue;
VkClearColorValuetypedef union VkClearColorValue
{
float float32[4];
int32_t int32[4];
uint32_t uint32[4];
} VkClearColorValue;
VkClearDepthStencilValuetypedef struct VkClearDepthStencilValue
{
float depth;
uint32_t stencil;
} VkClearDepthStencilValue;
void vkCmdEndRenderPass (VkCommandBuffer commandBuffer);
//要更新顶点缓冲区的非连续绑定范围,需要多次调用
void vkCmdBindVertexBuffers (
VkCommandBuffer commandBuffer,
//更新的第一个绑定的索引
uint32_t firstBinding,
//一个给定的管线可能会引用很多个顶点缓冲
uint32_t bindingCount,
//缓冲区对象
const VkBuffer* pBuffers,
//偏移量的数组
const VkDeviceSize* pOffsets
);
void vkCmdDrawIndexed (
VkCommandBuffer commandBuffer,
uint32_t indexCount,
uint32_t instanceCount,
uint32_t firstIndex,
int32_t vertexOffset,
uint32_t firstInstance
);
void vkCmdBindIndexBuffer (
VkCommandBuffer commandBuffer,
VkBuffer buffer,
VkDeviceSize offset,
//索引的类型
//VK_INDEX_TYPE_UINT16
//VK_INDEX_TYPE_UINT32
VkIndexType indexType
);
vkCmdDrawIndexed() 时,Vulkan 将从当前绑定的索引缓冲区中的如下索引位置开始读取数据
offset + firstIndex * sizeof(index)VkPhysicalDeviceLimits
maxDrawIndexedIndexValueVkPipelineInputAssemblyStateCreateInfo
VkGraphicsPipelineCreateInfotypedef struct VkPipelineInputAssemblyStateCreateInfo
{
VkStructureType sType;
const void* pNext;
VkPipelineInputAssemblyStateCreateFlags flags;
VkPrimitiveTopology topology;
//图元重启索引
VkBool32 primitiveRestartEnable;
} VkPipelineInputAssemblyStateCreateInfo;
vkCmdDraw() 和 vkCmdDrawIndexed() 的 firstInstance 和 instanceCount
void vkCmdDrawIndirect (
VkCommandBuffer commandBuffer,
VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride
);
VkDrawIndirectCommandtypedef struct VkDrawIndirectCommand
{
uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
uint32_t firstInstance;
} VkDrawIndirectCommand;
void vkCmdDrawIndexedIndirect (
VkCommandBuffer commandBuffer,
VkBuffer buffer,
VkDeviceSize offset,
uint32_t drawCount,
uint32_t stride
);
VkDrawIndexedIndirectCommandtypedef struct VkDrawIndexedIndirectCommand
{
uint32_t indexCount;
uint32_t instanceCount;
uint32_t firstIndex;
int32_t vertexOffset;
uint32_t firstInstance;
} VkDrawIndexedIndirectCommand;
VkPhysicalDeviceFeature
tessellationShaderVkPipelineTessellationStateCreateInfotypedef struct VkPipelineTessellationStateCreateInfo
{
VkStructureType sType;
const void* pNext;
VkPipelineTessellationStateCreateFlags flags;
//影响表面细分状态
//用来设置组成每个图元片的控制点的数量
uint32_t patchControlPoints;
} VkPipelineTessellationStateCreateInfo;
VkPhysicalDeviceLimits
maxTessellationPatchSizepolygonMode 设置为 VK_POLYGON_MODE_POINT[1,maxLevel][2,maxLevel][1,maxLevel − 1]layout (cw) in;layout (ccw) in;layout (vertices = 9) out; gl_TessLevelInner 与 gl_TessLevelOuter 两个变量表示VkPhysicalDeviceLimits
maxTessellationGenerationLevelgl_InvocationID
VkPhysicalDeviceLimits
maxTessellationControlTotalOutputComponentsVkPhysicalDeviceLimits
maxTessellationEvaluationInputComponentspatch out myVariable;barrier() 即可生成这些指令VkPhysicalDeviceLimits
maxTessellationEvaluationOutputComponentsVkPhysicalDeviceFeatures
geometryShaderlayout (triangles) in;
layout (triangle_strip) out;
layout (max_vertices = 3) out;
VkPhysicalDeviceLimits
maxGeometryOutputVerticesmaxGeometryOutputComponentsVkPhysicalDeviceLimits
maxGeometryInputComponentslayout (invocations = 8) in; gl_InvocationID 获取VkPhysicalDeviceLimits
maxGeometryShaderInvocationsVkPhysicalDeviceLimits
pointSizeRangeVkPhysicalDeviceLimits
pointSizeGranularityvoid vkCmdSetLineWidth (
VkCommandBuffer commandBuffer,
float lineWidth
);
VkPhysicalDeviceLimits
lineWidthRangeVkPhysicalDeviceLimits
maxClipDistancesVkPhysicalDeviceLimits
maxCullDistancesVkPhysicalDeviceLimits
ClipAndCullDistancesVkPhysicalDeviceLimits
maxViewportDimensionsVkPhysicalDeviceLimits
viewportBoundsRangevoid vkCmdSetViewport (
VkCommandBuffer commandBuffer,
uint32_t firstViewport,
uint32_t viewportCount,
const VkViewport* pViewports
);
VkPipelineViewportStateCreateInfo
viewportCountVkPhysicalDeviceLimits
maxViewportsvoid vkCmdSetScissor(
VkCommandBuffer commandBuffer,
uint32_t firstScissor,
uint32_t scissorCount,
const VkRect2D* pScissors
);
typedef struct VkPipelineDepthStencilStateCreateInfo
{
VkStructureType sType;
const void* pNext;
VkPipelineDepthStencilStateCreateFlags flags;
//启用深度测试
VkBool32 depthTestEnable;
//启用深度缓冲区
VkBool32 depthWriteEnable;
//比较操作,Page 271 表格
VkCompareOp depthCompareOp;
//深度测试范围
//当前深度缓冲区深度值与指定的范围比较,在范围内就通过
VkBool32 depthBoundsTestEnable;
//启用模板测试
VkBool32 stencilTestEnable;
//模板测试可以对图元正面和背面进行不同测试
VkStencilOpState front;
VkStencilOpState back;
//最大范围与最小范围
float minDepthBounds;
float maxDepthBounds;
} VkPipelineDepthStencilStateCreateInfo;
void vkCmdSetDepthBounds (
VkCommandBuffer commandBuffer,
float minDepthBounds,
float maxDepthBounds
);
VkPhysicalDeviceFeatures
depthBoundstypedef struct VkPipelineRasterizationStateCreateInfo
{
VkStructureType sType;
const void* pNext;
VkPipelineRasterizationStateCreateFlags flags;
VkBool32 depthClampEnable;
VkBool32 rasterizerDiscardEnable;
VkPolygonMode polygonMode;
VkCullModeFlags cullMode;
VkFrontFace frontFace;
//深度偏差
VkBool32 depthBiasEnable;
//偏差方程系数 方程:Page274
float depthBiasConstantFactor;
float depthBiasClamp;
float depthBiasSlopeFactor;
float lineWidth;
} VkPipelineRasterizationStateCreateInfo;
void vkCmdSetDepthBias (
VkCommandBuffer commandBuffer,
float depthBiasConstantFactor,
float depthBiasClamp,
float depthBiasSlopeFactor
);
typedef struct VkStencilOpState
{
//VkStencilOp 可执行操作:Page 275
//深度测试成功,模板测试失败执行
VkStencilOp failOp;
//深度测试成功,模板测试成功执行
VkStencilOp passOp;
//深度测试失败,执行,跳过模板测试
VkStencilOp depthFailOp;
//比较模板参考值和缓冲区里的值
VkCompareOp compareOp;
//比较用的资源
uint32_t compareMask;
uint32_t writeMask;
uint32_t reference;
} VkStencilOpState;
void vkCmdSetStencilReference (
VkCommandBuffer commandBuffer,
//是否将新的状态应用到正面、背面或者双面
VkStencilFaceFlags faceMask,
uint32_t reference
);
void vkCmdSetStencilCompareMask (
VkCommandBuffer commandBuffer,
//是否将新的状态应用到正面、背面或者双面
VkStencilFaceFlags faceMask,
uint32_t compareMask
);
void vkCmdSetStencilWriteMask (
VkCommandBuffer commandBuffer,
//是否将新的状态应用到正面、背面或者双面
VkStencilFaceFlags faceMask,
uint32_t writeMask
);
discard()VkResult vkGetPhysicalDeviceImageFormatProperties (
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
VkImageTiling tiling,
VkImageUsageFlags usage,
VkImageCreateFlags flags,
VkImageFormatProperties* pImageFormatProperties
);
VkPhyicalDeviceLimits
standardSampleLocations
VkPipelineMultiSampleStateCreateInfo
sampleShadingEnable
minSampleShading
alphaToCoverage
VkSubpassDescription
pResolveAttachments
void vkCmdResolveImage (
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
//图像解析区域(可以部分解析)
const VkImageResolve* pRegions
);
VkImageResolvetypedef struct VkImageResolve {
VkImageSubresourceLayers srcSubresource;
VkOffset3D srcOffset;
VkImageSubresourceLayers dstSubresource;
VkOffset3D dstOffset;
VkExtent3D extent;
} VkImageResolve;
typedef struct VkPipelineColorBlendStateCreateInfo
{
VkStructureType sType;
const void* pNext;
VkPipelineColorBlendStateCreateFlags flags;
//启用
VkBool32 logicOpEnable;
//操作 Page 282
VkLogicOp logicOp;
uint32_t attachmentCount;
const VkPipelineColorBlendAttachmentState* pAttachments;
float blendConstants[4];
} VkPipelineColorBlendStateCreateInfo;
layout (location = 0) out vec4 o_color1;
layout (location = 1) out vec4 o_color2;
layout (location = 5) out vec4 o_color3;
VkPhysicalDeviceLimits
maxFragmentOutputAttachmentstypedef struct VkPipelineColorBlendAttachmentState
{
//开启混合
VkBool32 blendEnable;
//混合因子 Page 287
VkBlendFactor srcColorBlendFactor;
VkBlendFactor dstColorBlendFactor;
//混合算法设置 Page 286
VkBlendOp colorBlendOp;
VkBlendFactor srcAlphaBlendFactor;
VkBlendFactor dstAlphaBlendFactor;
VkBlendOp alphaBlendOp;
VkColorComponentFlags colorWriteMask;
} VkPipelineColorBlendAttachmentState;
VkPipelineColorBlendStateCreateInfo
blendConstantsvoid vkCmdSetBlendConstants (
VkCommandBuffer commandBuffer,
const float blendConstants[4]
);
VkGetPhysicsDeviceFeature
VkPhysicalDeviceFeatures
dualSrcBlendVkResult vkCreateFence (
VkDevice device,
const VkFenceCreateInfo* pCreateInfo,
//用于分配栅栏所需的主机内存
const VkAllocationCallbacks* pAllocator,
VkFence* pFence
);
VkFenceCreateInfotypedef struct VkFenceCreateInfo
{
//VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//栅栏的行为
//VK_FENCE_CREATE_SIGNALED_BIT
//如果设置,初始状态是有信号的
//未设置,则无信号
VkFenceCreateFlags flags;
} VkFenceCreateInfo;
void vkDestroyFence (
VkDevice device,
VkFence fence,
const VkAllocationCallbacks* pAllocator
);
VkResult vkQueueSubmit (
VkQueue queue,
uint32_t submitCount,
const VkSubmitInfo* pSubmits,
//当队列引发的所有工作都完成后,把字段 fence 指定的栅栏对象设置为有信号的状态
VkFence fence
);
VkResult vkGetFenceStatus (
VkDevice device,
VkFence fence
);
vkWaitForFencesvkWaitForFencesVkResult vkWaitForFences (
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences,
VkBool32 waitAll,
//超时设置
uint64_t timeout
);
waitAllvkGetFenceStatus 高效VkResult vkResetFences (
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences
);
VkResult vkCreateEvent (
VkDevice device,
const VkEventCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkEvent* pEvent
);
VkEventCreateInfotypedef struct VkEventCreateInfo
{
//VK_STRUCTURE_TYPE_EVENT_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkEventCreateFlags flags;
} VkEventCreateInfo;
void vkDestroyEvent (
VkDevice device,
VkEvent event,
const VkAllocationCallbacks* pAllocator
);
VkResult vkSetEvent (
VkDevice device,
VkEvent event
);
vkCmdWaitEvents() 等待这个事件对象,该线程将立即变为非阻塞状态VkResult vkResetEvent (
VkDevice device,
VkEvent event
);
VkResult vkGetEventStatus (
VkDevice device,
VkEvent event
);
vkGetEventStatus() 返回 VK_EVENT_SET 之外,主机没有办法等待事件对象
void vkCmdSetEvent (
VkCommandBuffer commandBuffer,
VkEvent event,
VkPipelineStageFlags stageMask
);
void vkCmdResetEvent (
VkCommandBuffer commandBuffer,
VkEvent event,
VkPipelineStageFlags stageMask
);
void vkCmdWaitEvents (
//指定哪个命令缓冲区会中止运行,以等待事件
VkCommandBuffer commandBuffer,
//需要等待的事件的数量
uint32_t eventCount,
const VkEvent* pEvents,
//在哪些管线阶段会通知事件
VkPipelineStageFlags srcStageMask,
//在哪些阶段等待事件会变为有信号状态
//在 dstStageMask 指定的阶段,等待肯定会发生
VkPipelineStageFlags dstStageMask,
//变为有信号的状态执行内存操作
uint32_t memoryBarrierCount,
const VkMemoryBarrier* pMemoryBarriers,
uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier* pBufferMemoryBarriers,
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier* pImageMemoryBarriers
);
vkQueueSubmit()VkResult vkCreateSemaphore (
VkDevice device,
const VkSemaphoreCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSemaphore* pSemaphore
);
VkSemaphoreCreateInfotypedef struct VkSemaphoreCreateInfo
{
//VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkSemaphoreCreateFlags flags;
} VkSemaphoreCreateInfo;
void vkDestroySemaphore (
VkDevice device,
VkSemaphore semaphore,
const VkAllocationCallbacks* pAllocator
);
vkQueueSubmitVkResult vkQueueSubmit
(
VkQueue queue,
uint32_t submitCount,
const VkSubmitInfo* pSubmits,
VkFence fence
);
VkSubmitInfotypedef struct VkSubmitInfo
{
VkStructureType sType;
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 vkCreateQueryPool (
VkDevice device,
const VkQueryPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkQueryPool* pQueryPool
);
VkQueryPoolCreateInfotypedef struct VkQueryPoolCreateInfo
{
//VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO
VkStructureType sType;
//nullptr
const void* pNext;
//0
VkQueryPoolCreateFlags flags;
//查询的类型
VkQueryType queryType;
uint32_t queryCount;
//如何获取统计信息
VkQueryPipelineStatisticFlags pipelineStatistics;
} VkQueryPoolCreateInfo;
VkQueryType
void vkDestroyQueryPool (
VkDevice device,
VkQueryPool queryPool,
const VkAllocationCallbacks* pAllocator
);
void vkCmdResetQueryPool (
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount
);
vkCmdBeginQuery()void vkCmdBeginQuery (
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query,
//控制查询执行的额外标志位
//VK_QUERY_CONTROL_PRECISE_BIT 获取精确结果,会有额外开销
//未设置返回近似结果
VkQueryControlFlags flags
);
vkCmdEndQuery()void vkCmdEndQuery (
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query
);
VkResult vkGetQueryPoolResults (
VkDevice device,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount,
size_t dataSize,
//指向的主机内存
void* pData,
//间隔写入
VkDeviceSize stride,
//查询的类型将决定什么会写入内存中
VkQueryResultFlags flags
);
VkQueryResultFlags
void vkCmdCopyQueryPoolResults (
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize stride,
VkQueryResultFlags flags
);
pipelineStatistics
void vkCmdWriteTimestamp (
VkCommandBuffer commandBuffer,
//指定的管线阶段将当前设备时间写入指定的查询
VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query
);