Skip to content

Commit f615063

Browse files
authored
Timeline: Handle missing DebugUtils extension (#112)
1 parent 65248c9 commit f615063

File tree

6 files changed

+63
-33
lines changed

6 files changed

+63
-33
lines changed

layer_gpu_timeline/source/device.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,17 @@ Device::Device(Instance* _instance,
100100

101101
initDriverDeviceDispatchTable(device, nlayerGetProcAddress, driver);
102102

103+
// Emit a log if debug utils entry points did not load. In this scenario
104+
// the layer will still be loaded and send metadata packets to the server
105+
// socket, but the Perfetto data will not contain any tag labels. We will
106+
// therefore be unable to cross-reference the two data streams to produce a
107+
// usable visualization.
108+
if (!driver.vkCmdBeginDebugUtilsLabelEXT)
109+
{
110+
LAYER_LOG(" - ERROR: Device does not expose VK_EXT_debug_utils");
111+
LAYER_LOG(" Perfetto data will not contain cross-ref tags");
112+
}
113+
103114
// Init the shared comms module for the first device built
104115
if (!commsModule)
105116
{

layer_gpu_timeline/source/device_utils.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,24 @@
4848
.color = {0.0f, 0.0f, 0.0f, 0.0f},
4949
};
5050

51-
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
51+
// Function pointer may be null if driver does not expose the extension
52+
if (layer->driver.vkCmdBeginDebugUtilsLabelEXT)
53+
{
54+
layer->driver.vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &tagInfo);
55+
}
5256
}
57+
58+
/**
59+
* @brief End a tag via a driver debug utils label.
60+
*
61+
* @param layer The layer context for the device.
62+
* @param commandBuffer The command buffer we are recording.
63+
*/
64+
[[maybe_unused]] static void emitEndTag(Device* layer, VkCommandBuffer commandBuffer)
65+
{
66+
// Function pointer may be null if driver does not expose the extension
67+
if (layer->driver.vkCmdEndDebugUtilsLabelEXT)
68+
{
69+
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
70+
}
71+
}

layer_gpu_timeline/source/layer_device_functions_dispatch.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatch<user_tag>(VkCommandBuffer command
7676
lock.unlock();
7777
emitStartTag(layer, commandBuffer, tagID);
7878
layer->driver.vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);
79-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
79+
emitEndTag(layer, commandBuffer);
8080
}
8181

8282
/* See Vulkan API for documentation. */
@@ -106,7 +106,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchBase<user_tag>(VkCommandBuffer com
106106
emitStartTag(layer, commandBuffer, tagID);
107107
layer->driver
108108
.vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
109-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
109+
emitEndTag(layer, commandBuffer);
110110
}
111111

112112
/* See Vulkan API for documentation. */
@@ -136,7 +136,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchBaseKHR<user_tag>(VkCommandBuffer
136136
emitStartTag(layer, commandBuffer, tagID);
137137
layer->driver
138138
.vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
139-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
139+
emitEndTag(layer, commandBuffer);
140140
}
141141

142142
/* See Vulkan API for documentation. */
@@ -157,5 +157,5 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdDispatchIndirect<user_tag>(VkCommandBuffer
157157
lock.unlock();
158158
emitStartTag(layer, commandBuffer, tagID);
159159
layer->driver.vkCmdDispatchIndirect(commandBuffer, buffer, offset);
160-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
160+
emitEndTag(layer, commandBuffer);
161161
}

layer_gpu_timeline/source/layer_device_functions_render_pass.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderPass<user_tag>(VkCommandBuffer co
309309
// Release the lock to call into the driver
310310
lock.unlock();
311311
layer->driver.vkCmdEndRenderPass(commandBuffer);
312-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
312+
emitEndTag(layer, commandBuffer);
313313
}
314314

315315
/* See Vulkan API for documentation. */
@@ -326,7 +326,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderPass2<user_tag>(VkCommandBuffer c
326326
// Release the lock to call into the driver
327327
lock.unlock();
328328
layer->driver.vkCmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
329-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
329+
emitEndTag(layer, commandBuffer);
330330
}
331331

332332
/* See Vulkan API for documentation. */
@@ -343,7 +343,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderPass2KHR<user_tag>(VkCommandBuffe
343343
// Release the lock to call into the driver
344344
lock.unlock();
345345
layer->driver.vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
346-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
346+
emitEndTag(layer, commandBuffer);
347347
}
348348

349349
/* See Vulkan API for documentation. */
@@ -366,7 +366,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRendering<user_tag>(VkCommandBuffer com
366366
layer->driver.vkCmdEndRendering(commandBuffer);
367367
if (!suspending)
368368
{
369-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
369+
emitEndTag(layer, commandBuffer);
370370
}
371371
}
372372

@@ -390,6 +390,6 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderingKHR<user_tag>(VkCommandBuffer
390390
layer->driver.vkCmdEndRenderingKHR(commandBuffer);
391391
if (!suspending)
392392
{
393-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
393+
emitEndTag(layer, commandBuffer);
394394
}
395395
}

layer_gpu_timeline/source/layer_device_functions_trace_rays.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBuildAccelerationStructuresIndirectKHR<use
105105
pIndirectDeviceAddresses,
106106
pIndirectStrides,
107107
ppMaxPrimitiveCounts);
108-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
108+
emitEndTag(layer, commandBuffer);
109109
}
110110

111111
/* See Vulkan API for documentation. */
@@ -131,7 +131,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBuildAccelerationStructuresKHR<user_tag>(
131131
lock.unlock();
132132
emitStartTag(layer, commandBuffer, tagID);
133133
layer->driver.vkCmdBuildAccelerationStructuresKHR(commandBuffer, infoCount, pInfos, ppBuildRangeInfos);
134-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
134+
emitEndTag(layer, commandBuffer);
135135
}
136136

137137
/* See Vulkan API for documentation. */
@@ -151,7 +151,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdTraceRaysIndirect2KHR<user_tag>(VkCommandB
151151
lock.unlock();
152152
emitStartTag(layer, commandBuffer, tagID);
153153
layer->driver.vkCmdTraceRaysIndirect2KHR(commandBuffer, indirectDeviceAddress);
154-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
154+
emitEndTag(layer, commandBuffer);
155155
}
156156

157157
/* See Vulkan API for documentation. */
@@ -181,7 +181,7 @@ VKAPI_ATTR void VKAPI_CALL
181181
pHitShaderBindingTable,
182182
pCallableShaderBindingTable,
183183
indirectDeviceAddress);
184-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
184+
emitEndTag(layer, commandBuffer);
185185
}
186186

187187
/* See Vulkan API for documentation. */
@@ -215,5 +215,5 @@ VKAPI_ATTR void VKAPI_CALL
215215
width,
216216
height,
217217
depth);
218-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
218+
emitEndTag(layer, commandBuffer);
219219
}

layer_gpu_timeline/source/layer_device_functions_transfer.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdFillBuffer<user_tag>(VkCommandBuffer comma
125125
lock.unlock();
126126
emitStartTag(layer, commandBuffer, tagID);
127127
layer->driver.vkCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
128-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
128+
emitEndTag(layer, commandBuffer);
129129
}
130130

131131
/* See Vulkan API for documentation. */
@@ -154,7 +154,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdClearColorImage<user_tag>(VkCommandBuffer
154154
lock.unlock();
155155
emitStartTag(layer, commandBuffer, tagID);
156156
layer->driver.vkCmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
157-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
157+
emitEndTag(layer, commandBuffer);
158158
}
159159

160160
/* See Vulkan API for documentation. */
@@ -183,7 +183,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdClearDepthStencilImage<user_tag>(VkCommand
183183
lock.unlock();
184184
emitStartTag(layer, commandBuffer, tagID);
185185
layer->driver.vkCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
186-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
186+
emitEndTag(layer, commandBuffer);
187187
}
188188

189189
/* See Vulkan API for documentation. */
@@ -214,7 +214,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer<user_tag>(VkCommandBuffer comma
214214
lock.unlock();
215215
emitStartTag(layer, commandBuffer, tagID);
216216
layer->driver.vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
217-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
217+
emitEndTag(layer, commandBuffer);
218218
}
219219

220220
/* See Vulkan API for documentation. */
@@ -242,7 +242,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer2<user_tag>(VkCommandBuffer comm
242242
lock.unlock();
243243
emitStartTag(layer, commandBuffer, tagID);
244244
layer->driver.vkCmdCopyBuffer2(commandBuffer, pCopyBufferInfo);
245-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
245+
emitEndTag(layer, commandBuffer);
246246
}
247247

248248
/* See Vulkan API for documentation. */
@@ -270,7 +270,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBuffer2KHR<user_tag>(VkCommandBuffer c
270270
lock.unlock();
271271
emitStartTag(layer, commandBuffer, tagID);
272272
layer->driver.vkCmdCopyBuffer2KHR(commandBuffer, pCopyBufferInfo);
273-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
273+
emitEndTag(layer, commandBuffer);
274274
}
275275

276276
/* See Vulkan API for documentation. */
@@ -305,7 +305,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyBufferToImage<user_tag>(VkCommandBuffe
305305
lock.unlock();
306306
emitStartTag(layer, commandBuffer, tagID);
307307
layer->driver.vkCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
308-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
308+
emitEndTag(layer, commandBuffer);
309309
}
310310

311311
/* See Vulkan API for documentation. */
@@ -337,7 +337,7 @@ VKAPI_ATTR void VKAPI_CALL
337337
lock.unlock();
338338
emitStartTag(layer, commandBuffer, tagID);
339339
layer->driver.vkCmdCopyBufferToImage2(commandBuffer, pCopyBufferToImageInfo);
340-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
340+
emitEndTag(layer, commandBuffer);
341341
}
342342

343343
/* See Vulkan API for documentation. */
@@ -369,7 +369,7 @@ VKAPI_ATTR void VKAPI_CALL
369369
lock.unlock();
370370
emitStartTag(layer, commandBuffer, tagID);
371371
layer->driver.vkCmdCopyBufferToImage2KHR(commandBuffer, pCopyBufferToImageInfo);
372-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
372+
emitEndTag(layer, commandBuffer);
373373
}
374374

375375
/* See Vulkan API for documentation. */
@@ -406,7 +406,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage<user_tag>(VkCommandBuffer comman
406406
emitStartTag(layer, commandBuffer, tagID);
407407
layer->driver
408408
.vkCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
409-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
409+
emitEndTag(layer, commandBuffer);
410410
}
411411

412412
/* See Vulkan API for documentation. */
@@ -437,7 +437,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage2<user_tag>(VkCommandBuffer comma
437437
lock.unlock();
438438
emitStartTag(layer, commandBuffer, tagID);
439439
layer->driver.vkCmdCopyImage2(commandBuffer, pCopyImageInfo);
440-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
440+
emitEndTag(layer, commandBuffer);
441441
}
442442

443443
/* See Vulkan API for documentation. */
@@ -468,7 +468,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImage2KHR<user_tag>(VkCommandBuffer co
468468
lock.unlock();
469469
emitStartTag(layer, commandBuffer, tagID);
470470
layer->driver.vkCmdCopyImage2KHR(commandBuffer, pCopyImageInfo);
471-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
471+
emitEndTag(layer, commandBuffer);
472472
}
473473

474474
/* See Vulkan API for documentation. */
@@ -507,7 +507,7 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdCopyImageToBuffer<user_tag>(VkCommandBuffe
507507
lock.unlock();
508508
emitStartTag(layer, commandBuffer, tagID);
509509
layer->driver.vkCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
510-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
510+
emitEndTag(layer, commandBuffer);
511511
}
512512

513513
/* See Vulkan API for documentation. */
@@ -543,7 +543,7 @@ VKAPI_ATTR void VKAPI_CALL
543543
lock.unlock();
544544
emitStartTag(layer, commandBuffer, tagID);
545545
layer->driver.vkCmdCopyImageToBuffer2(commandBuffer, pCopyImageToBufferInfo);
546-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
546+
emitEndTag(layer, commandBuffer);
547547
}
548548

549549
/* See Vulkan API for documentation. */
@@ -579,7 +579,7 @@ VKAPI_ATTR void VKAPI_CALL
579579
lock.unlock();
580580
emitStartTag(layer, commandBuffer, tagID);
581581
layer->driver.vkCmdCopyImageToBuffer2KHR(commandBuffer, pCopyImageToBufferInfo);
582-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
582+
emitEndTag(layer, commandBuffer);
583583
}
584584

585585
/* See Vulkan API for documentation. */
@@ -610,7 +610,7 @@ VKAPI_ATTR void VKAPI_CALL
610610
lock.unlock();
611611
emitStartTag(layer, commandBuffer, tagID);
612612
layer->driver.vkCmdCopyAccelerationStructureKHR(commandBuffer, pInfo);
613-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
613+
emitEndTag(layer, commandBuffer);
614614
}
615615

616616
/* See Vulkan API for documentation. */
@@ -641,7 +641,7 @@ VKAPI_ATTR void VKAPI_CALL
641641
lock.unlock();
642642
emitStartTag(layer, commandBuffer, tagID);
643643
layer->driver.vkCmdCopyAccelerationStructureToMemoryKHR(commandBuffer, pInfo);
644-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
644+
emitEndTag(layer, commandBuffer);
645645
}
646646

647647
/* See Vulkan API for documentation. */
@@ -672,5 +672,5 @@ VKAPI_ATTR void VKAPI_CALL
672672
lock.unlock();
673673
emitStartTag(layer, commandBuffer, tagID);
674674
layer->driver.vkCmdCopyMemoryToAccelerationStructureKHR(commandBuffer, pInfo);
675-
layer->driver.vkCmdEndDebugUtilsLabelEXT(commandBuffer);
675+
emitEndTag(layer, commandBuffer);
676676
}

0 commit comments

Comments
 (0)