40 m_EnabledShaderStages{EnabledShaderStages}
51 const VkClearColorValue& Color,
52 const VkImageSubresourceRange& Subresource)
55 VERIFY(m_State.
RenderPass == VK_NULL_HANDLE,
"vkCmdClearColorImage() must be called outside of render pass (17.1)");
56 VERIFY(Subresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT,
"The aspectMask of all image subresource ranges must only include VK_IMAGE_ASPECT_COLOR_BIT (17.1)");
61 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
68 const VkClearDepthStencilValue& DepthStencil,
69 const VkImageSubresourceRange& Subresource)
72 VERIFY(m_State.
RenderPass == VK_NULL_HANDLE,
"vkCmdClearDepthStencilImage() must be called outside of render pass (17.1)");
74 VERIFY((Subresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0 &&
75 (Subresource.aspectMask & ~(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0,
76 "The aspectMask of all image subresource ranges must only include VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT(17.1)");
79 vkCmdClearDepthStencilImage(
82 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
88 __forceinline
void ClearAttachment(
const VkClearAttachment& Attachment,
const VkClearRect& ClearRect)
91 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdClearAttachments() must be called inside render pass (17.2)");
93 vkCmdClearAttachments(
103 __forceinline
void Draw(uint32_t VertexCount, uint32_t InstanceCount, uint32_t FirstVertex, uint32_t FirstInstance)
106 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDraw() must be called inside render pass (19.3)");
109 vkCmdDraw(m_VkCmdBuffer, VertexCount, InstanceCount, FirstVertex, FirstInstance);
112 __forceinline
void DrawIndexed(uint32_t IndexCount, uint32_t InstanceCount, uint32_t FirstIndex, int32_t VertexOffset, uint32_t FirstInstance)
115 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawIndexed() must be called inside render pass (19.3)");
119 vkCmdDrawIndexed(m_VkCmdBuffer, IndexCount, InstanceCount, FirstIndex, VertexOffset, FirstInstance);
122 __forceinline
void DrawIndirect(VkBuffer Buffer, VkDeviceSize Offset, uint32_t DrawCount, uint32_t Stride)
125 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawIndirect() must be called inside render pass (19.3)");
128 vkCmdDrawIndirect(m_VkCmdBuffer,
Buffer, Offset, DrawCount, Stride);
131 __forceinline
void DrawIndexedIndirect(VkBuffer Buffer, VkDeviceSize Offset, uint32_t DrawCount, uint32_t Stride)
134 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawIndirect() must be called inside render pass (19.3)");
138 vkCmdDrawIndexedIndirect(m_VkCmdBuffer,
Buffer, Offset, DrawCount, Stride);
141 __forceinline
void DrawMesh(uint32_t TaskCount, uint32_t FirstTask)
143 #if DILIGENT_USE_VOLK
145 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawMeshTasksNV() must be called inside render pass");
148 vkCmdDrawMeshTasksNV(m_VkCmdBuffer, TaskCount, FirstTask);
150 UNSUPPORTED(
"DrawMesh is not supported when vulkan library is linked statically");
154 __forceinline
void DrawMeshIndirect(VkBuffer Buffer, VkDeviceSize Offset, uint32_t DrawCount, uint32_t Stride)
156 #if DILIGENT_USE_VOLK
158 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawMeshTasksNV() must be called inside render pass");
161 vkCmdDrawMeshTasksIndirectNV(m_VkCmdBuffer,
Buffer, Offset, DrawCount, Stride);
163 UNSUPPORTED(
"DrawMeshIndirect is not supported when vulkan library is linked statically");
167 __forceinline
void DrawMeshIndirectCount(VkBuffer Buffer, VkDeviceSize Offset, VkBuffer CountBuffer, VkDeviceSize CountBufferOffset, uint32_t MaxDrawCount, uint32_t Stride)
169 #if DILIGENT_USE_VOLK
171 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"vkCmdDrawMeshTasksIndirectCountNV() must be called inside render pass");
174 vkCmdDrawMeshTasksIndirectCountNV(m_VkCmdBuffer,
Buffer, Offset, CountBuffer, CountBufferOffset, MaxDrawCount, Stride);
176 UNSUPPORTED(
"DrawMeshIndirectCount is not supported when vulkan library is linked statically");
180 __forceinline
void Dispatch(uint32_t GroupCountX, uint32_t GroupCountY, uint32_t GroupCountZ)
183 VERIFY(m_State.
RenderPass == VK_NULL_HANDLE,
"vkCmdDispatch() must be called outside of render pass (27)");
186 vkCmdDispatch(m_VkCmdBuffer, GroupCountX, GroupCountY, GroupCountZ);
192 VERIFY(m_State.
RenderPass == VK_NULL_HANDLE,
"vkCmdDispatchIndirect() must be called outside of render pass (27)");
195 vkCmdDispatchIndirect(m_VkCmdBuffer,
Buffer, Offset);
199 VkFramebuffer Framebuffer,
200 uint32_t FramebufferWidth,
201 uint32_t FramebufferHeight,
202 uint32_t ClearValueCount = 0,
203 const VkClearValue* pClearValues =
nullptr)
206 VERIFY(m_State.
RenderPass == VK_NULL_HANDLE,
"Current pass has not been ended");
210 VkRenderPassBeginInfo BeginInfo;
211 BeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
212 BeginInfo.pNext =
nullptr;
216 BeginInfo.renderArea = {{0, 0}, {FramebufferWidth, FramebufferHeight}};
217 BeginInfo.clearValueCount = ClearValueCount;
218 BeginInfo.pClearValues = pClearValues;
225 vkCmdBeginRenderPass(m_VkCmdBuffer, &BeginInfo,
226 VK_SUBPASS_CONTENTS_INLINE
239 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"Render pass has not been started");
241 vkCmdEndRenderPass(m_VkCmdBuffer);
248 LOG_ERROR_MESSAGE(
"Ending render pass while there are outstanding queries that have been started inside the pass, "
249 "but have not been ended. Vulkan requires that a query must either begin and end inside the same "
250 "subpass of a render pass instance, or must both begin and end outside of a render pass "
251 "instance (i.e. contain entire render pass instances). (17.2)");
257 VERIFY(m_State.
RenderPass != VK_NULL_HANDLE,
"Render pass has not been started");
259 vkCmdNextSubpass(m_VkCmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
265 vkEndCommandBuffer(m_VkCmdBuffer);
270 m_VkCmdBuffer = VK_NULL_HANDLE;
280 vkCmdBindPipeline(m_VkCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, ComputePipeline);
291 vkCmdBindPipeline(m_VkCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, GraphicsPipeline);
302 vkCmdBindPipeline(m_VkCmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, RayTracingPipeline);
307 __forceinline
void SetViewports(uint32_t FirstViewport, uint32_t ViewportCount,
const VkViewport* pViewports)
310 vkCmdSetViewport(m_VkCmdBuffer, FirstViewport, ViewportCount, pViewports);
313 __forceinline
void SetScissorRects(uint32_t FirstScissor, uint32_t ScissorCount,
const VkRect2D* pScissors)
316 vkCmdSetScissor(m_VkCmdBuffer, FirstScissor, ScissorCount, pScissors);
322 vkCmdSetStencilReference(m_VkCmdBuffer, VK_STENCIL_FRONT_AND_BACK, Reference);
328 vkCmdSetBlendConstants(m_VkCmdBuffer, BlendConstants);
331 __forceinline
void BindIndexBuffer(VkBuffer Buffer, VkDeviceSize Offset, VkIndexType IndexType)
340 vkCmdBindIndexBuffer(m_VkCmdBuffer,
Buffer, Offset, IndexType);
347 __forceinline
void BindVertexBuffers(uint32_t firstBinding, uint32_t bindingCount,
const VkBuffer* pBuffers,
const VkDeviceSize* pOffsets)
350 vkCmdBindVertexBuffers(m_VkCmdBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
355 VkImageLayout OldLayout,
356 VkImageLayout NewLayout,
357 const VkImageSubresourceRange& SubresRange,
358 VkPipelineStageFlags EnabledShaderStages,
359 VkPipelineStageFlags SrcStages = 0,
360 VkPipelineStageFlags DestStages = 0);
363 VkImageLayout OldLayout,
364 VkImageLayout NewLayout,
365 const VkImageSubresourceRange& SubresRange,
366 VkPipelineStageFlags SrcStages = 0,
367 VkPipelineStageFlags DestStages = 0)
382 VkAccessFlags srcAccessMask,
383 VkAccessFlags dstAccessMask,
384 VkPipelineStageFlags EnabledShaderStages,
385 VkPipelineStageFlags SrcStages = 0,
386 VkPipelineStageFlags DestStages = 0);
389 VkAccessFlags srcAccessMask,
390 VkAccessFlags dstAccessMask,
391 VkPipelineStageFlags SrcStages = 0,
392 VkPipelineStageFlags DestStages = 0)
407 VkAccessFlags srcAccessMask,
408 VkAccessFlags dstAccessMask,
409 VkPipelineStageFlags EnabledShaderStages,
410 VkPipelineStageFlags SrcStages = 0,
411 VkPipelineStageFlags DestStages = 0);
414 VkAccessFlags dstAccessMask,
415 VkPipelineStageFlags SrcStages = 0,
416 VkPipelineStageFlags DestStages = 0)
425 ASMemoryBarrier(m_VkCmdBuffer, srcAccessMask, dstAccessMask, m_EnabledShaderStages, SrcStages, DestStages);
429 VkPipelineLayout layout,
431 uint32_t descriptorSetCount,
432 const VkDescriptorSet* pDescriptorSets,
433 uint32_t dynamicOffsetCount = 0,
434 const uint32_t* pDynamicOffsets =
nullptr)
437 vkCmdBindDescriptorSets(m_VkCmdBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
442 uint32_t regionCount,
443 const VkBufferCopy* pRegions)
451 vkCmdCopyBuffer(m_VkCmdBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
455 VkImageLayout srcImageLayout,
457 VkImageLayout dstImageLayout,
458 uint32_t regionCount,
459 const VkImageCopy* pRegions)
468 vkCmdCopyImage(m_VkCmdBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
473 VkImageLayout dstImageLayout,
474 uint32_t regionCount,
475 const VkBufferImageCopy* pRegions)
484 vkCmdCopyBufferToImage(m_VkCmdBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
488 VkImageLayout srcImageLayout,
490 uint32_t regionCount,
491 const VkBufferImageCopy* pRegions)
500 vkCmdCopyImageToBuffer(m_VkCmdBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
504 VkImageLayout srcImageLayout,
506 VkImageLayout dstImageLayout,
507 uint32_t regionCount,
508 const VkImageBlit* pRegions,
518 vkCmdBlitImage(m_VkCmdBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
522 VkImageLayout srcImageLayout,
524 VkImageLayout dstImageLayout,
525 uint32_t regionCount,
526 const VkImageResolve* pRegions)
534 vkCmdResolveImage(m_VkCmdBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
539 VkQueryControlFlags flags,
548 LOG_ERROR_MESSAGE(
"Another query of the same type is already active in the command buffer. "
549 "Overlapping queries are not allowed in Vulkan. The command will be ignored.");
557 vkCmdBeginQuery(m_VkCmdBuffer, queryPool, query, flags);
569 vkCmdEndQuery(m_VkCmdBuffer, queryPool, query);
583 VkQueryPool queryPool,
587 vkCmdWriteTimestamp(m_VkCmdBuffer, pipelineStage, queryPool, query);
600 vkCmdResetQueryPool(m_VkCmdBuffer, queryPool, firstQuery, queryCount);
607 VkDeviceSize dstOffset,
609 VkQueryResultFlags flags)
617 vkCmdCopyQueryPoolResults(m_VkCmdBuffer, queryPool, firstQuery, queryCount,
618 dstBuffer, dstOffset, stride, flags);
622 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
623 const VkAccelerationStructureBuildRangeInfoKHR*
const* ppBuildRangeInfos)
625 #if DILIGENT_USE_VOLK
632 vkCmdBuildAccelerationStructuresKHR(m_VkCmdBuffer, infoCount, pInfos, ppBuildRangeInfos);
634 UNSUPPORTED(
"Ray tracing is not supported when vulkan library is linked statically");
640 #if DILIGENT_USE_VOLK
647 vkCmdCopyAccelerationStructureKHR(m_VkCmdBuffer, &Info);
649 UNSUPPORTED(
"Ray tracing is not supported when vulkan library is linked statically");
655 #if DILIGENT_USE_VOLK
662 vkCmdWriteAccelerationStructuresPropertiesKHR(m_VkCmdBuffer, 1, &accelerationStructure, queryType, queryPool, firstQuery);
664 UNSUPPORTED(
"Ray tracing is not supported when vulkan library is linked statically");
668 __forceinline
void TraceRays(
const VkStridedDeviceAddressRegionKHR& RaygenShaderBindingTable,
669 const VkStridedDeviceAddressRegionKHR& MissShaderBindingTable,
670 const VkStridedDeviceAddressRegionKHR& HitShaderBindingTable,
671 const VkStridedDeviceAddressRegionKHR& CallableShaderBindingTable,
676 #if DILIGENT_USE_VOLK
680 vkCmdTraceRaysKHR(m_VkCmdBuffer, &RaygenShaderBindingTable, &MissShaderBindingTable, &HitShaderBindingTable, &CallableShaderBindingTable, width, height, depth);
682 UNSUPPORTED(
"Ray tracing is not supported when vulkan library is linked statically");
686 __forceinline
void TraceRaysIndirect(
const VkStridedDeviceAddressRegionKHR& RaygenShaderBindingTable,
687 const VkStridedDeviceAddressRegionKHR& MissShaderBindingTable,
688 const VkStridedDeviceAddressRegionKHR& HitShaderBindingTable,
689 const VkStridedDeviceAddressRegionKHR& CallableShaderBindingTable,
690 VkDeviceAddress indirectDeviceAddress)
692 #if DILIGENT_USE_VOLK
696 vkCmdTraceRaysIndirectKHR(m_VkCmdBuffer, &RaygenShaderBindingTable, &MissShaderBindingTable, &HitShaderBindingTable, &CallableShaderBindingTable, indirectDeviceAddress);
698 UNSUPPORTED(
"Ray tracing is not supported when vulkan library is linked statically");
706 m_VkCmdBuffer = VkCmdBuffer;
732 VkCommandBuffer m_VkCmdBuffer = VK_NULL_HANDLE;
733 const VkPipelineStageFlags m_EnabledShaderStages;