Skip to content

Commit 98f5c1f

Browse files
VulkanCommandBuffer: fixed references to the spec
1 parent 2bed042 commit 98f5c1f

File tree

2 files changed

+58
-31
lines changed

2 files changed

+58
-31
lines changed

Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanCommandBuffer.hpp

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2024 Diligent Graphics LLC
2+
* Copyright 2019-2025 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -51,8 +51,12 @@ class VulkanCommandBuffer
5151
const VkImageSubresourceRange& Subresource)
5252
{
5353
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
54-
VERIFY(m_State.RenderPass == VK_NULL_HANDLE, "vkCmdClearColorImage() must be called outside of render pass (17.1)");
55-
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)");
54+
VERIFY(m_State.RenderPass == VK_NULL_HANDLE,
55+
"vkCmdClearColorImage() must be called outside of render pass "
56+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdClearColorImage-renderpass)");
57+
VERIFY(Subresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT,
58+
"The aspectMask of all image subresource ranges must only include VK_IMAGE_ASPECT_COLOR_BIT "
59+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdClearColorImage-aspectMask-02498)");
5660

5761
FlushBarriers();
5862
vkCmdClearColorImage(
@@ -69,11 +73,14 @@ class VulkanCommandBuffer
6973
const VkImageSubresourceRange& Subresource)
7074
{
7175
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
72-
VERIFY(m_State.RenderPass == VK_NULL_HANDLE, "vkCmdClearDepthStencilImage() must be called outside of render pass (17.1)");
76+
VERIFY(m_State.RenderPass == VK_NULL_HANDLE,
77+
"vkCmdClearDepthStencilImage() must be called outside of render pass "
78+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-renderpass)");
7379
// clang-format off
7480
VERIFY((Subresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0 &&
7581
(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)");
82+
"The aspectMask of all image subresource ranges must only include VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT "
83+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-aspectMask-02824)");
7784
// clang-format on
7885

7986
FlushBarriers();
@@ -89,7 +96,9 @@ class VulkanCommandBuffer
8996
__forceinline void ClearAttachment(const VkClearAttachment& Attachment, const VkClearRect& ClearRect)
9097
{
9198
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
92-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdClearAttachments() must be called inside render pass (17.2)");
99+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
100+
"vkCmdClearAttachments() must be called inside render pass "
101+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdClearAttachments-renderpass)");
93102

94103
vkCmdClearAttachments(
95104
m_VkCmdBuffer,
@@ -104,7 +113,9 @@ class VulkanCommandBuffer
104113
__forceinline void Draw(uint32_t VertexCount, uint32_t InstanceCount, uint32_t FirstVertex, uint32_t FirstInstance)
105114
{
106115
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
107-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDraw() must be called inside render pass (19.3)");
116+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
117+
"vkCmdDraw() must be called inside render pass "
118+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDraw-renderpass)");
108119
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
109120

110121
vkCmdDraw(m_VkCmdBuffer, VertexCount, InstanceCount, FirstVertex, FirstInstance);
@@ -113,7 +124,9 @@ class VulkanCommandBuffer
113124
__forceinline void DrawIndexed(uint32_t IndexCount, uint32_t InstanceCount, uint32_t FirstIndex, int32_t VertexOffset, uint32_t FirstInstance)
114125
{
115126
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
116-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndexed() must be called inside render pass (19.3)");
127+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
128+
"vkCmdDrawIndexed() must be called inside render pass "
129+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDrawIndexed-renderpass)");
117130
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
118131
VERIFY(m_State.IndexBuffer != VK_NULL_HANDLE, "No index buffer bound");
119132

@@ -123,7 +136,9 @@ class VulkanCommandBuffer
123136
__forceinline void DrawIndirect(VkBuffer Buffer, VkDeviceSize Offset, uint32_t DrawCount, uint32_t Stride)
124137
{
125138
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
126-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndirect() must be called inside render pass (19.3)");
139+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
140+
"vkCmdDrawIndirect() must be called inside render pass "
141+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDrawIndirect-renderpass)");
127142
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
128143

129144
vkCmdDrawIndirect(m_VkCmdBuffer, Buffer, Offset, DrawCount, Stride);
@@ -132,7 +147,9 @@ class VulkanCommandBuffer
132147
__forceinline void DrawIndexedIndirect(VkBuffer Buffer, VkDeviceSize Offset, uint32_t DrawCount, uint32_t Stride)
133148
{
134149
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
135-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndirect() must be called inside render pass (19.3)");
150+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
151+
"vkCmdDrawIndexedIndirect() must be called inside render pass "
152+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderpass)");
136153
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
137154
VERIFY(m_State.IndexBuffer != VK_NULL_HANDLE, "No index buffer bound");
138155

@@ -143,7 +160,9 @@ class VulkanCommandBuffer
143160
{
144161
#if DILIGENT_USE_VOLK
145162
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
146-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndirectCountKHR() must be called inside render pass (19.3)");
163+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
164+
"vkCmdDrawIndirectCountKHR() must be called inside render pass "
165+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDrawIndirectCount-renderpass)");
147166
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
148167

149168
vkCmdDrawIndirectCountKHR(m_VkCmdBuffer, Buffer, Offset, CountBuffer, CountBufferOffset, MaxDrawCount, Stride);
@@ -156,7 +175,9 @@ class VulkanCommandBuffer
156175
{
157176
#if DILIGENT_USE_VOLK
158177
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
159-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndirect() must be called inside render pass (19.3)");
178+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE,
179+
"vkCmdDrawIndexedIndirectCountKHR() must be called inside render pass "
180+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-renderpass)");
160181
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
161182
VERIFY(m_State.IndexBuffer != VK_NULL_HANDLE, "No index buffer bound");
162183

@@ -212,7 +233,7 @@ class VulkanCommandBuffer
212233
{
213234
#if DILIGENT_USE_VOLK
214235
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
215-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDraw() must be called inside render pass (19.3)");
236+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawMultiEXT() must be called inside render pass");
216237
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
217238

218239
vkCmdDrawMultiEXT(m_VkCmdBuffer, DrawCount, pVertexInfo, InstanceCount, FirstInstance, sizeof(VkMultiDrawInfoEXT));
@@ -228,7 +249,7 @@ class VulkanCommandBuffer
228249
{
229250
#if DILIGENT_USE_VOLK
230251
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
231-
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawIndexed() must be called inside render pass (19.3)");
252+
VERIFY(m_State.RenderPass != VK_NULL_HANDLE, "vkCmdDrawMultiIndexedEXT() must be called inside render pass");
232253
VERIFY(m_State.GraphicsPipeline != VK_NULL_HANDLE, "No graphics pipeline bound");
233254
VERIFY(m_State.IndexBuffer != VK_NULL_HANDLE, "No index buffer bound");
234255

@@ -244,7 +265,9 @@ class VulkanCommandBuffer
244265
__forceinline void Dispatch(uint32_t GroupCountX, uint32_t GroupCountY, uint32_t GroupCountZ)
245266
{
246267
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
247-
VERIFY(m_State.RenderPass == VK_NULL_HANDLE, "vkCmdDispatch() must be called outside of render pass (27)");
268+
VERIFY(m_State.RenderPass == VK_NULL_HANDLE,
269+
"vkCmdDispatch() must be called outside of render pass "
270+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDispatch-renderpass)");
248271
VERIFY(m_State.ComputePipeline != VK_NULL_HANDLE, "No compute pipeline bound");
249272

250273
FlushBarriers();
@@ -254,7 +277,9 @@ class VulkanCommandBuffer
254277
__forceinline void DispatchIndirect(VkBuffer Buffer, VkDeviceSize Offset)
255278
{
256279
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
257-
VERIFY(m_State.RenderPass == VK_NULL_HANDLE, "vkCmdDispatchIndirect() must be called outside of render pass (27)");
280+
VERIFY(m_State.RenderPass == VK_NULL_HANDLE,
281+
"vkCmdDispatchIndirect() must be called outside of render pass "
282+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdDispatchIndirect-renderpass)");
258283
VERIFY(m_State.ComputePipeline != VK_NULL_HANDLE, "No compute pipeline bound");
259284

260285
FlushBarriers();
@@ -316,7 +341,8 @@ class VulkanCommandBuffer
316341
LOG_ERROR_MESSAGE("Ending render pass while there are outstanding queries that have been started inside the pass, "
317342
"but have not been ended. Vulkan requires that a query must either begin and end inside the same "
318343
"subpass of a render pass instance, or must both begin and end outside of a render pass "
319-
"instance (i.e. contain entire render pass instances). (17.2)");
344+
"instance (i.e. contain entire render pass instances). "
345+
"(https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdEndRenderPass-None-07004)");
320346
}
321347
}
322348

@@ -562,7 +588,8 @@ class VulkanCommandBuffer
562588
}
563589

564590
// A query must either begin and end inside the same subpass of a render pass instance, or must both
565-
// begin and end outside a render pass instance (i.e. contain entire render pass instances) (17.2).
591+
// begin and end outside a render pass instance (i.e. contain entire render pass instances)
592+
// (https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VUID-vkCmdEndRenderPass-None-07004).
566593

567594
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
568595
vkCmdBeginQuery(m_VkCmdBuffer, queryPool, query, flags);
@@ -623,7 +650,7 @@ class VulkanCommandBuffer
623650
VERIFY_EXPR(m_VkCmdBuffer != VK_NULL_HANDLE);
624651
if (m_State.RenderPass != VK_NULL_HANDLE)
625652
{
626-
// Copy query results must be performed outside of render pass (17.2).
653+
// Copy query results must be performed outside of render pass.
627654
EndRenderPass();
628655
}
629656
FlushBarriers();

Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanCommandBuffer.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2022 Diligent Graphics LLC
2+
* Copyright 2019-2025 Diligent Graphics LLC
33
* Copyright 2015-2019 Egor Yusov
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,56 +45,56 @@ static VkAccessFlags AccessMaskFromImageLayout(VkImageLayout Layout,
4545
{
4646
// does not support device access. This layout must only be used as the initialLayout member
4747
// of VkImageCreateInfo or VkAttachmentDescription, or as the oldLayout in an image transition.
48-
// When transitioning out of this layout, the contents of the memory are not guaranteed to be preserved (11.4)
48+
// When transitioning out of this layout, the contents of the memory are not guaranteed to be preserved
4949
case VK_IMAGE_LAYOUT_UNDEFINED:
5050
if (IsDstMask)
5151
{
5252
UNEXPECTED("The new layout used in a transition must not be VK_IMAGE_LAYOUT_UNDEFINED. "
5353
"This layout must only be used as the initialLayout member of VkImageCreateInfo "
54-
"or VkAttachmentDescription, or as the oldLayout in an image transition. (11.4)");
54+
"or VkAttachmentDescription, or as the oldLayout in an image transition.");
5555
}
5656
break;
5757

5858
// supports all types of device access
5959
case VK_IMAGE_LAYOUT_GENERAL:
60-
// VK_IMAGE_LAYOUT_GENERAL must be used for image load/store operations (13.1.1, 13.2.4)
60+
// VK_IMAGE_LAYOUT_GENERAL must be used for image load/store operations
6161
AccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
6262
break;
6363

64-
// must only be used as a color or resolve attachment in a VkFramebuffer (11.4)
64+
// must only be used as a color or resolve attachment in a VkFramebuffer
6565
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
6666
AccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
6767
break;
6868

69-
// must only be used as a depth/stencil attachment in a VkFramebuffer (11.4)
69+
// must only be used as a depth/stencil attachment in a VkFramebuffer
7070
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
7171
AccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
7272
break;
7373

74-
// must only be used as a read-only depth/stencil attachment in a VkFramebuffer and/or as a read-only image in a shader (11.4)
74+
// must only be used as a read-only depth/stencil attachment in a VkFramebuffer and/or as a read-only image in a shader
7575
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
7676
AccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
7777
break;
7878

7979
// must only be used as a read-only image in a shader (which can be read as a sampled image,
80-
// combined image/sampler and/or input attachment) (11.4)
80+
// combined image/sampler and/or input attachment)
8181
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
8282
AccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
8383
break;
8484

85-
// must only be used as a source image of a transfer command (11.4)
85+
// must only be used as a source image of a transfer command
8686
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
8787
AccessMask = VK_ACCESS_TRANSFER_READ_BIT;
8888
break;
8989

90-
// must only be used as a destination image of a transfer command (11.4)
90+
// must only be used as a destination image of a transfer command
9191
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
9292
AccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9393
break;
9494

9595
// does not support device access. This layout must only be used as the initialLayout member
9696
// of VkImageCreateInfo or VkAttachmentDescription, or as the oldLayout in an image transition.
97-
// When transitioning out of this layout, the contents of the memory are preserved. (11.4)
97+
// When transitioning out of this layout, the contents of the memory are preserved.
9898
case VK_IMAGE_LAYOUT_PREINITIALIZED:
9999
if (!IsDstMask)
100100
{
@@ -104,7 +104,7 @@ static VkAccessFlags AccessMaskFromImageLayout(VkImageLayout Layout,
104104
{
105105
UNEXPECTED("The new layout used in a transition must not be VK_IMAGE_LAYOUT_PREINITIALIZED. "
106106
"This layout must only be used as the initialLayout member of VkImageCreateInfo "
107-
"or VkAttachmentDescription, or as the oldLayout in an image transition. (11.4)");
107+
"or VkAttachmentDescription, or as the oldLayout in an image transition.");
108108
}
109109
break;
110110

0 commit comments

Comments
 (0)