2929
3030#include " device.hpp"
3131#include " layer_device_functions.hpp"
32+ #include " framework/utils.hpp"
3233
3334extern std::mutex g_vulkanLock;
3435
35- static void registerRenderPass (
36- Device* layer,
37- VkCommandBuffer commandBuffer
38- ) {
39- auto & state = layer->getStateTracker ();
40- auto & stats = state.getCommandBuffer (commandBuffer).getStats ();
41- stats.incRenderPassCount ();
42- }
43-
4436/* See Vulkan API for documentation. */
4537template <>
4638VKAPI_ATTR VkResult VKAPI_CALL layer_vkCreateRenderPass<user_tag>(
@@ -129,10 +121,28 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBeginRenderPass<user_tag>(
129121 std::unique_lock<std::mutex> lock { g_vulkanLock };
130122 auto * layer = Device::retrieve (commandBuffer);
131123
132- registerRenderPass (layer, commandBuffer);
124+ auto & tracker = layer->getStateTracker ();
125+ auto & cb = tracker.getCommandBuffer (commandBuffer);
126+
127+ // Increment the render pass counter in the tracker
128+ cb.getStats ().incRenderPassCount ();
129+
130+ // Update the layer command stream in the tracker
131+ uint64_t tagID = Tracker::LCSWorkload::getTagID ();
132+ cb.renderPassBegin (tagID);
133+
134+ // Emit the unique workload tag into the command stream
135+ std::string tagLabel = fmt_string (" t%llu" , tagID);
136+ VkDebugMarkerMarkerInfoEXT tagInfo {
137+ .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,
138+ .pNext = nullptr ,
139+ .pMarkerName = tagLabel.c_str (),
140+ .color = { 0 .0f , 0 .0f , 0 .0f , 0 .0f }
141+ };
133142
134143 // Release the lock to call into the driver
135144 lock.unlock ();
145+ layer->driver .vkCmdDebugMarkerBeginEXT (commandBuffer, &tagInfo);
136146 layer->driver .vkCmdBeginRenderPass (commandBuffer, pRenderPassBegin, contents);
137147}
138148
@@ -149,10 +159,28 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBeginRenderPass2<user_tag>(
149159 std::unique_lock<std::mutex> lock { g_vulkanLock };
150160 auto * layer = Device::retrieve (commandBuffer);
151161
152- registerRenderPass (layer, commandBuffer);
162+ auto & tracker = layer->getStateTracker ();
163+ auto & cb = tracker.getCommandBuffer (commandBuffer);
164+
165+ // Increment the render pass counter in the tracker
166+ cb.getStats ().incRenderPassCount ();
167+
168+ // Update the layer command stream in the tracker
169+ uint64_t tagID = Tracker::LCSWorkload::getTagID ();
170+ cb.renderPassBegin (tagID);
171+
172+ // Emit the unique workload tag into the command stream
173+ std::string tagLabel = fmt_string (" t%llu" , tagID);
174+ VkDebugMarkerMarkerInfoEXT tagInfo {
175+ .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,
176+ .pNext = nullptr ,
177+ .pMarkerName = tagLabel.c_str (),
178+ .color = { 0 .0f , 0 .0f , 0 .0f , 0 .0f }
179+ };
153180
154181 // Release the lock to call into the driver
155182 lock.unlock ();
183+ layer->driver .vkCmdDebugMarkerBeginEXT (commandBuffer, &tagInfo);
156184 layer->driver .vkCmdBeginRenderPass2 (commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
157185}
158186
@@ -169,10 +197,28 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBeginRenderPass2KHR<user_tag>(
169197 std::unique_lock<std::mutex> lock { g_vulkanLock };
170198 auto * layer = Device::retrieve (commandBuffer);
171199
172- registerRenderPass (layer, commandBuffer);
200+ auto & tracker = layer->getStateTracker ();
201+ auto & cb = tracker.getCommandBuffer (commandBuffer);
202+
203+ // Increment the render pass counter in the tracker
204+ cb.getStats ().incRenderPassCount ();
205+
206+ // Update the layer command stream in the tracker
207+ uint64_t tagID = Tracker::LCSWorkload::getTagID ();
208+ cb.renderPassBegin (tagID);
209+
210+ // Emit the unique workload tag into the command stream
211+ std::string tagLabel = fmt_string (" t%llu" , tagID);
212+ VkDebugMarkerMarkerInfoEXT tagInfo {
213+ .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,
214+ .pNext = nullptr ,
215+ .pMarkerName = tagLabel.c_str (),
216+ .color = { 0 .0f , 0 .0f , 0 .0f , 0 .0f }
217+ };
173218
174219 // Release the lock to call into the driver
175220 lock.unlock ();
221+ layer->driver .vkCmdDebugMarkerBeginEXT (commandBuffer, &tagInfo);
176222 layer->driver .vkCmdBeginRenderPass2KHR (commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
177223}
178224
@@ -188,10 +234,28 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBeginRendering<user_tag>(
188234 std::unique_lock<std::mutex> lock { g_vulkanLock };
189235 auto * layer = Device::retrieve (commandBuffer);
190236
191- registerRenderPass (layer, commandBuffer);
237+ auto & tracker = layer->getStateTracker ();
238+ auto & cb = tracker.getCommandBuffer (commandBuffer);
239+
240+ // Increment the render pass counter in the tracker
241+ cb.getStats ().incRenderPassCount ();
242+
243+ // Update the layer command stream in the tracker
244+ uint64_t tagID = Tracker::LCSWorkload::getTagID ();
245+ cb.renderPassBegin (tagID);
246+
247+ // Emit the unique workload tag into the command stream
248+ std::string tagLabel = fmt_string (" t%llu" , tagID);
249+ VkDebugMarkerMarkerInfoEXT tagInfo {
250+ .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,
251+ .pNext = nullptr ,
252+ .pMarkerName = tagLabel.c_str (),
253+ .color = { 0 .0f , 0 .0f , 0 .0f , 0 .0f }
254+ };
192255
193256 // Release the lock to call into the driver
194257 lock.unlock ();
258+ layer->driver .vkCmdDebugMarkerBeginEXT (commandBuffer, &tagInfo);
195259 layer->driver .vkCmdBeginRendering (commandBuffer, pRenderingInfo);
196260}
197261
@@ -207,9 +271,93 @@ VKAPI_ATTR void VKAPI_CALL layer_vkCmdBeginRenderingKHR<user_tag>(
207271 std::unique_lock<std::mutex> lock { g_vulkanLock };
208272 auto * layer = Device::retrieve (commandBuffer);
209273
210- registerRenderPass (layer, commandBuffer);
274+ auto & tracker = layer->getStateTracker ();
275+ auto & cb = tracker.getCommandBuffer (commandBuffer);
276+
277+ // Increment the render pass counter in the tracker
278+ cb.getStats ().incRenderPassCount ();
279+
280+ // Update the layer command stream in the tracker
281+ uint64_t tagID = Tracker::LCSWorkload::getTagID ();
282+ cb.renderPassBegin (tagID);
283+
284+ // Emit the unique workload tag into the command stream
285+ std::string tagLabel = fmt_string (" t%llu" , tagID);
286+ VkDebugMarkerMarkerInfoEXT tagInfo {
287+ .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT,
288+ .pNext = nullptr ,
289+ .pMarkerName = tagLabel.c_str (),
290+ .color = { 0 .0f , 0 .0f , 0 .0f , 0 .0f }
291+ };
211292
212293 // Release the lock to call into the driver
213294 lock.unlock ();
295+ layer->driver .vkCmdDebugMarkerBeginEXT (commandBuffer, &tagInfo);
214296 layer->driver .vkCmdBeginRenderingKHR (commandBuffer, pRenderingInfo);
215297}
298+
299+ /* See Vulkan API for documentation. */
300+ template <>
301+ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderPass<user_tag>(
302+ VkCommandBuffer commandBuffer
303+ ) {
304+ LAYER_TRACE (__func__);
305+
306+ // Hold the lock to access layer-wide global store
307+ std::unique_lock<std::mutex> lock { g_vulkanLock };
308+ auto * layer = Device::retrieve (commandBuffer);
309+
310+ // Update the layer command stream in the tracker
311+ auto & tracker = layer->getStateTracker ();
312+ auto & cb = tracker.getCommandBuffer (commandBuffer);
313+ cb.workloadEnd ();
314+
315+ // Release the lock to call into the driver
316+ lock.unlock ();
317+ layer->driver .vkCmdEndRenderPass (commandBuffer);
318+ layer->driver .vkCmdDebugMarkerEndEXT (commandBuffer);
319+ }
320+
321+ /* See Vulkan API for documentation. */
322+ template <>
323+ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRendering<user_tag>(
324+ VkCommandBuffer commandBuffer
325+ ) {
326+ LAYER_TRACE (__func__);
327+
328+ // Hold the lock to access layer-wide global store
329+ std::unique_lock<std::mutex> lock { g_vulkanLock };
330+ auto * layer = Device::retrieve (commandBuffer);
331+
332+ // Update the layer command stream in the tracker
333+ auto & tracker = layer->getStateTracker ();
334+ auto & cb = tracker.getCommandBuffer (commandBuffer);
335+ cb.workloadEnd ();
336+
337+ // Release the lock to call into the driver
338+ lock.unlock ();
339+ layer->driver .vkCmdEndRendering (commandBuffer);
340+ layer->driver .vkCmdDebugMarkerEndEXT (commandBuffer);
341+ }
342+
343+ /* See Vulkan API for documentation. */
344+ template <>
345+ VKAPI_ATTR void VKAPI_CALL layer_vkCmdEndRenderingKHR<user_tag>(
346+ VkCommandBuffer commandBuffer
347+ ) {
348+ LAYER_TRACE (__func__);
349+
350+ // Hold the lock to access layer-wide global store
351+ std::unique_lock<std::mutex> lock { g_vulkanLock };
352+ auto * layer = Device::retrieve (commandBuffer);
353+
354+ // Update the layer command stream in the tracker
355+ auto & tracker = layer->getStateTracker ();
356+ auto & cb = tracker.getCommandBuffer (commandBuffer);
357+ cb.workloadEnd ();
358+
359+ // Release the lock to call into the driver
360+ lock.unlock ();
361+ layer->driver .vkCmdEndRenderingKHR (commandBuffer);
362+ layer->driver .vkCmdDebugMarkerEndEXT (commandBuffer);
363+ }
0 commit comments