Skip to content

Commit 8b7144b

Browse files
authored
Merge pull request #253 from inexorgame/hanni/vk_debug_marker_refactoring
Refactor Vulkan debug markers
2 parents a43735d + d1532a3 commit 8b7144b

File tree

13 files changed

+110
-158
lines changed

13 files changed

+110
-158
lines changed

include/inexor/vulkan-renderer/wrapper/device.hpp

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -103,38 +103,30 @@ class Device {
103103
return m_transfer_queue_family_index;
104104
}
105105

106-
#ifndef NDEBUG
107-
108-
/// For more information about Vulkan debugging tools check
109-
/// https://www.saschawillems.de/blog/2016/05/28/tutorial-on-using-vulkans-vk_ext_debug_marker-with-renderdoc/
110-
/// Also check our RenderDoc's official website: https://renderdoc.org/
111-
112-
/// @note Vulkan debug markers are only available in debug mode when VK_EXT_debug_marker device extension is used.
113-
/// @todo Add overloaded methods like "set_image_name" which accept a specific type instead of a pointer. This
114-
/// increases type-safety and would also remove the need for a "type" argument.
115-
116-
/// @brief Set the internal name of a Vulkan resource using vkDebugMarkerSetObjectNameEXT. This internal name can
117-
/// be seen in external debuggers like RenderDoc.
118-
/// @param object A pointer to the Vulkan object whose name will be set.
119-
/// @param type The type of the Vulkan object.
120-
/// @param name The internal name which will be assigned to the Vulkan object.
121-
void set_object_name(std::uint64_t object, const VkDebugReportObjectTypeEXT type, const std::string &name) const;
122-
123-
/// @brief Assign a memory block for debugging to a Vulkan resource using vkDebugMarkerSetObjectTagEXT. This memory
124-
/// block can later be seen in external debuggers like RenderDoc.
125-
/// @param object A pointer to the Vulkan object to which a memory tag will be assigned.
126-
/// @param type The type of the Vulkan object.
127-
/// @param name The internal name of the object ag.
128-
/// @param tag_size The size of the memory tag in bytes.
129-
/// @param tag A pointer to the memory tag.
130-
void set_object_tag(const std::uint64_t object, const VkDebugReportObjectTypeEXT type, const std::uint64_t name,
131-
const std::size_t tag_size, const void *tag) const;
132-
133-
/// @brief Set the color of the current rendering region using vkCmdDebugMarkerBeginEXT. This color can be seen in
134-
/// external debuggers like RenderDoc.
135-
/// @param command_buffer The command buffer which is associated to the debug region.
136-
/// @param name The name of the debug region.
137-
/// @param color An array of red, green, blue and alpha values for the debug region's color.
106+
/// @brief Assign an internal Vulkan debug marker name to a Vulkan object.
107+
/// This internal name can be seen in external debuggers like RenderDoc.
108+
/// @note This method is only available in debug mode with ``VK_EXT_debug_marker`` device extension enabled.
109+
/// @param object The Vulkan object.
110+
/// @param object_type The Vulkan debug report object type.
111+
/// @param name The internal name of the Vulkan object.
112+
void set_debug_marker_name(void *object, VkDebugReportObjectTypeEXT object_type, const std::string &name) const;
113+
114+
/// @brief Assigns a block of memory to a Vulkan resource.
115+
/// This memory block can be seen in external debuggers like RenderDoc.
116+
/// @note This method is only available in debug mode with ``VK_EXT_debug_marker`` device extension enabled.
117+
/// @param object The Vulkan object.
118+
/// @param object_type The Vulkan debug report object type.
119+
/// @param name The name of the memory block which will be connected to this object.
120+
/// @param memory_size The size of the memory block in bytes.
121+
/// @param memory_address The memory address to read from.
122+
void set_memory_block_attachment(void *object, VkDebugReportObjectTypeEXT object_type, const std::uint64_t name,
123+
const std::size_t memory_size, const void *memory_block) const;
124+
125+
/// @param color [in] The rgba color of the rendering region.
126+
/// @param name [in] The name of the rendering region.
127+
/// @param command_buffer [in] The associated command buffer.
128+
/// The rendering region will be visible in external debuggers like RenderDoc.
129+
/// @brief Vulkan debug markers: Annotation of a rendering region.
138130
void bind_debug_region(const VkCommandBuffer command_buffer, const std::string &name,
139131
const std::array<float, 4> color) const;
140132

@@ -149,8 +141,6 @@ class Device {
149141
/// @brief End the debug region of the current renderpass using vkCmdDebugMarkerEndEXT.
150142
/// @param command_buffer The command buffer which is associated to the debug marker.
151143
void end_debug_region(const VkCommandBuffer command_buffer) const;
152-
153-
#endif
154144
};
155145

156146
} // namespace inexor::vulkan_renderer::wrapper

src/vulkan-renderer/frame_graph.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,8 @@ void FrameGraph::build_pipeline_layout(const RenderStage *stage, PhysicalStage *
121121
throw std::runtime_error("Failed to create pipeline layout!");
122122
}
123123

124-
#ifndef NDEBUG
125-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(phys->m_pipeline_layout),
126-
VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, stage->m_name + " pipeline layout");
127-
#endif
124+
m_device.set_debug_marker_name(phys->m_pipeline_layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
125+
stage->m_name + " pipeline layout");
128126
}
129127

130128
void FrameGraph::record_command_buffers(const RenderStage *stage, PhysicalStage *phys) const {

src/vulkan-renderer/wrapper/command_buffer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,8 @@ CommandBuffer::CommandBuffer(const wrapper::Device &device, VkCommandPool comman
2222
throw std::runtime_error("Failed to allocate command buffer!");
2323
}
2424

25-
#ifndef NDEBUG
2625
// Assign an internal name using Vulkan debug markers.
27-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_command_buffer),
28-
VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, m_name);
29-
#endif
26+
m_device.set_debug_marker_name(m_command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, m_name);
3027
}
3128

3229
CommandBuffer::CommandBuffer(CommandBuffer &&other) noexcept

src/vulkan-renderer/wrapper/device.cpp

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -324,89 +324,104 @@ Device::~Device() {
324324
}
325325
}
326326

327+
void Device::set_debug_marker_name(void *object, VkDebugReportObjectTypeEXT object_type,
328+
const std::string &name) const {
327329
#ifndef NDEBUG
328-
void Device::set_object_name(std::uint64_t object, const VkDebugReportObjectTypeEXT type,
329-
const std::string &name) const {
330+
if (!m_enable_vulkan_debug_markers) {
331+
return;
332+
}
330333

331-
if (m_enable_vulkan_debug_markers) {
332-
assert(m_device);
333-
assert(!name.empty());
334-
assert(object);
335-
assert(m_vk_debug_marker_set_object_name);
334+
assert(object);
335+
assert(!name.empty());
336+
assert(m_vk_debug_marker_set_object_name);
336337

337-
auto name_info = make_info<VkDebugMarkerObjectNameInfoEXT>();
338-
name_info.objectType = type;
339-
name_info.object = object;
340-
name_info.pObjectName = name.c_str();
338+
auto name_info = make_info<VkDebugMarkerObjectNameInfoEXT>();
339+
name_info.objectType = object_type;
340+
name_info.object = reinterpret_cast<std::uint64_t>(object);
341+
name_info.pObjectName = name.c_str();
341342

342-
if (m_vk_debug_marker_set_object_name(m_device, &name_info) != VK_SUCCESS) {
343-
throw std::runtime_error("Failed to assign Vulkan debug marker name to Vulkan resource " + name + "!");
344-
}
343+
if (m_vk_debug_marker_set_object_name(m_device, &name_info) != VK_SUCCESS) {
344+
throw std::runtime_error("Failed to assign Vulkan debug marker name " + name + "!");
345345
}
346+
#endif
346347
}
347348

348-
void Device::set_object_tag(const std::uint64_t object, const VkDebugReportObjectTypeEXT type, const std::uint64_t name,
349-
const std::size_t tag_size, const void *tag) const {
350-
if (m_enable_vulkan_debug_markers) {
351-
assert(m_device);
352-
assert(name);
353-
assert(tag_size > 0);
354-
assert(tag);
355-
assert(m_vk_debug_marker_set_object_tag);
349+
void Device::set_memory_block_attachment(void *object, VkDebugReportObjectTypeEXT object_type, const std::uint64_t name,
350+
const std::size_t memory_size, const void *memory_block) const {
351+
#ifndef NDEBUG
352+
if (!m_enable_vulkan_debug_markers) {
353+
return;
354+
}
356355

357-
auto tagInfo = make_info<VkDebugMarkerObjectTagInfoEXT>();
358-
tagInfo.objectType = type;
359-
tagInfo.object = object;
360-
tagInfo.tagName = name;
361-
tagInfo.tagSize = tag_size;
362-
tagInfo.pTag = tag;
356+
assert(name);
357+
assert(memory_size > 0);
358+
assert(memory_block);
359+
assert(m_vk_debug_marker_set_object_tag);
363360

364-
if (m_vk_debug_marker_set_object_tag(m_device, &tagInfo) != VK_SUCCESS) {
365-
throw std::runtime_error("Failed to assign Vulkan debug marker data tag to Vulkan resource!");
366-
}
361+
auto tag_info = make_info<VkDebugMarkerObjectTagInfoEXT>();
362+
tag_info.object = reinterpret_cast<std::uint64_t>(object);
363+
tag_info.objectType = object_type;
364+
tag_info.tagName = name;
365+
tag_info.tagSize = memory_size;
366+
tag_info.pTag = memory_block;
367+
368+
if (m_vk_debug_marker_set_object_tag(m_device, &tag_info) != VK_SUCCESS) {
369+
throw std::runtime_error("Failed to assign Vulkan debug marker memory block!");
367370
}
371+
#endif
368372
}
369373

370374
void Device::bind_debug_region(const VkCommandBuffer command_buffer, const std::string &name,
371375
const std::array<float, 4> color) const {
372-
if (m_enable_vulkan_debug_markers) {
373-
assert(command_buffer);
374-
assert(!name.empty());
375-
assert(m_vk_cmd_debug_marker_begin);
376+
#ifndef NDEBUG
377+
if (!m_enable_vulkan_debug_markers) {
378+
return;
379+
}
376380

377-
auto debug_marker = make_info<VkDebugMarkerMarkerInfoEXT>();
381+
assert(command_buffer);
382+
assert(!name.empty());
383+
assert(m_vk_cmd_debug_marker_begin);
378384

379-
std::copy(color.begin(), color.end(), debug_marker.color);
385+
auto debug_marker = make_info<VkDebugMarkerMarkerInfoEXT>();
380386

381-
debug_marker.pMarkerName = name.c_str();
387+
std::copy(color.begin(), color.end(), debug_marker.color);
382388

383-
m_vk_cmd_debug_marker_begin(command_buffer, &debug_marker);
384-
}
389+
debug_marker.pMarkerName = name.c_str();
390+
391+
m_vk_cmd_debug_marker_begin(command_buffer, &debug_marker);
392+
#endif
385393
}
386394

387395
void Device::insert_debug_marker(const VkCommandBuffer command_buffer, const std::string &name,
388396
const std::array<float, 4> color) const {
389-
if (m_enable_vulkan_debug_markers) {
390-
assert(command_buffer);
391-
assert(!name.empty());
392-
assert(m_vk_cmd_debug_marker_insert);
397+
#ifndef NDEBUG
398+
if (!m_enable_vulkan_debug_markers) {
399+
return;
400+
}
393401

394-
auto debug_marker = make_info<VkDebugMarkerMarkerInfoEXT>();
402+
assert(command_buffer);
403+
assert(!name.empty());
404+
assert(m_vk_cmd_debug_marker_insert);
395405

396-
std::copy(color.begin(), color.end(), debug_marker.color);
406+
auto debug_marker = make_info<VkDebugMarkerMarkerInfoEXT>();
397407

398-
debug_marker.pMarkerName = name.c_str();
408+
std::copy(color.begin(), color.end(), debug_marker.color);
399409

400-
m_vk_cmd_debug_marker_insert(command_buffer, &debug_marker);
401-
}
410+
debug_marker.pMarkerName = name.c_str();
411+
412+
m_vk_cmd_debug_marker_insert(command_buffer, &debug_marker);
413+
#endif
402414
}
403415

404416
void Device::end_debug_region(const VkCommandBuffer command_buffer) const {
405-
if (m_enable_vulkan_debug_markers) {
406-
assert(m_vk_cmd_debug_marker_end);
407-
m_vk_cmd_debug_marker_end(command_buffer);
417+
#ifndef NDEBUG
418+
if (!m_enable_vulkan_debug_markers) {
419+
return;
408420
}
409-
}
421+
422+
assert(m_vk_cmd_debug_marker_end);
423+
m_vk_cmd_debug_marker_end(command_buffer);
410424
#endif
425+
}
411426

412427
} // namespace inexor::vulkan_renderer::wrapper

src/vulkan-renderer/wrapper/fence.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ Fence::Fence(const wrapper::Device &device, const std::string &name, const bool
2323
throw std::runtime_error("Error: vkCreateFence failed!");
2424
}
2525

26-
#ifndef NDEBUG
2726
// Assign an internal name using Vulkan debug markers.
28-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_fence), VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, m_name);
29-
#endif
27+
m_device.set_debug_marker_name(m_fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, m_name);
3028

3129
spdlog::debug("Created fence {} successfully.", m_name);
3230
}

src/vulkan-renderer/wrapper/framebuffer.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,8 @@ Framebuffer::Framebuffer(const Device &device, VkRenderPass render_pass, const s
2727
throw std::runtime_error("Failed to create framebuffer " + m_name + "!");
2828
}
2929

30-
#ifndef NDEBUG
3130
// Assign an internal name using Vulkan debug markers.
32-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_framebuffer),
33-
VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, m_name);
34-
#endif
31+
m_device.set_debug_marker_name(m_framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, m_name);
3532

3633
spdlog::debug("Created framebuffer {} successfully.", m_name);
3734
}

src/vulkan-renderer/wrapper/gpu_memory_buffer.cpp

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,8 @@ GPUMemoryBuffer::GPUMemoryBuffer(const Device &device, const std::string &name,
4141
throw std::runtime_error("Error: GPU memory buffer allocation for " + name + " failed!");
4242
}
4343

44-
// Try to find the Vulkan debug marker function.
45-
auto *vkDebugMarkerSetObjectNameEXT = reinterpret_cast<PFN_vkDebugMarkerSetObjectNameEXT>(
46-
vkGetDeviceProcAddr(m_device.device(), "vkDebugMarkerSetObjectNameEXT"));
47-
48-
if (vkDebugMarkerSetObjectNameEXT != nullptr) {
49-
// Since the function vkDebugMarkerSetObjectNameEXT has been found, we can assign an internal name for
50-
// debugging.
51-
auto name_info = make_info<VkDebugMarkerObjectNameInfoEXT>();
52-
name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT;
53-
name_info.object = reinterpret_cast<std::uint64_t>(m_buffer);
54-
name_info.pObjectName = name.c_str();
55-
56-
spdlog::debug("Assigning internal name '{}' to GPU memory buffer.", name);
57-
if (vkDebugMarkerSetObjectNameEXT(m_device.device(), &name_info) != VK_SUCCESS) {
58-
throw std::runtime_error("Error: vkDebugMarkerSetObjectNameEXT failed for GPU memory buffer " + name + "!");
59-
}
60-
}
44+
// Assign an internal debug marker name to this buffer.
45+
m_device.set_debug_marker_name(m_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, name);
6146
}
6247

6348
GPUMemoryBuffer::GPUMemoryBuffer(const Device &device, const std::string &name, const VkDeviceSize &buffer_size,

src/vulkan-renderer/wrapper/gpu_texture.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,8 @@ void GpuTexture::create_texture_sampler() {
192192
throw std::runtime_error("Error: vkCreateSampler failed for texture " + m_name + " !");
193193
}
194194

195-
#ifndef NDEBUG
196195
// Assign an internal name using Vulkan debug markers.
197-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_sampler), VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT,
198-
m_name);
199-
#endif
196+
m_device.set_debug_marker_name(m_sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, m_name);
200197

201198
spdlog::debug("Image sampler {} created successfully.", m_name);
202199
}

src/vulkan-renderer/wrapper/image.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ Image::Image(const Device &device, const VkFormat format, const VkImageUsageFlag
4747
throw std::runtime_error("Error: vmaCreateImage failed for image " + m_name + "!");
4848
}
4949

50-
#ifndef NDEBUG
5150
// Assign an internal name using Vulkan debug markers.
52-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, m_name);
53-
#endif
51+
m_device.set_debug_marker_name(m_image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, m_name);
5452

5553
auto image_view_ci = make_info<VkImageViewCreateInfo>();
5654
image_view_ci.image = m_image;
@@ -66,11 +64,8 @@ Image::Image(const Device &device, const VkFormat format, const VkImageUsageFlag
6664
throw std::runtime_error("Error: vkCreateImageView failed for image view " + m_name + "!");
6765
}
6866

69-
#ifndef NDEBUG
7067
// Assign an internal name using Vulkan debug markers.
71-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_image_view), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
72-
m_name);
73-
#endif
68+
m_device.set_debug_marker_name(m_image_view, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, m_name);
7469
}
7570

7671
Image::Image(Image &&other) noexcept

src/vulkan-renderer/wrapper/resource_descriptor.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,8 @@ ResourceDescriptor::ResourceDescriptor(const Device &device, std::uint32_t swapc
4949
throw std::runtime_error("Error: vkCreateDescriptorPool failed for descriptor " + m_name + " !");
5050
}
5151

52-
#ifndef NDEBUG
5352
// Assign an internal name using Vulkan debug markers.
54-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_descriptor_pool),
55-
VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, m_name);
56-
#endif
53+
m_device.set_debug_marker_name(m_descriptor_pool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, m_name);
5754

5855
spdlog::debug("Created descriptor pool for descriptor {} successfully.", m_name);
5956

@@ -68,11 +65,9 @@ ResourceDescriptor::ResourceDescriptor(const Device &device, std::uint32_t swapc
6865
throw std::runtime_error("Error: vkCreateDescriptorSetLayout failed for descriptor " + m_name + " !");
6966
}
7067

71-
#ifndef NDEBUG
7268
// Assign an internal name using Vulkan debug markers.
73-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(m_descriptor_set_layout),
74-
VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, m_name);
75-
#endif
69+
m_device.set_debug_marker_name(m_descriptor_set_layout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
70+
m_name);
7671

7772
spdlog::debug("Created descriptor sets for descriptor {} successfully.", m_name);
7873

@@ -91,13 +86,10 @@ ResourceDescriptor::ResourceDescriptor(const Device &device, std::uint32_t swapc
9186
throw std::runtime_error("Error: vkAllocateDescriptorSets failed for descriptor " + m_name + " !");
9287
}
9388

94-
#ifndef NDEBUG
9589
for (const auto &descriptor_set : m_descriptor_sets) {
9690
// Assign an internal name using Vulkan debug markers.
97-
m_device.set_object_name(reinterpret_cast<std::uint64_t>(descriptor_set),
98-
VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, m_name);
91+
m_device.set_debug_marker_name(descriptor_set, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, m_name);
9992
}
100-
#endif
10193

10294
for (std::size_t k = 0; k < swapchain_image_count; k++) {
10395
for (std::size_t j = 0; j < m_write_descriptor_sets.size(); j++) {

0 commit comments

Comments
 (0)