2727#include < mutex>
2828#include < thread>
2929
30+ #include " utils/misc.hpp"
31+ #include " nlohmann/json.hpp"
32+
3033#include " device.hpp"
3134#include " layer_device_functions.hpp"
32- #include " utils/misc.hpp"
35+
36+ using json = nlohmann::json;
37+
38+ using namespace std ::placeholders;
3339
3440extern std::mutex g_vulkanLock;
3541
@@ -48,6 +54,15 @@ VKAPI_ATTR VkResult VKAPI_CALL layer_vkQueuePresentKHR<user_tag>(
4854 auto & tracker = layer->getStateTracker ();
4955 tracker.queuePresent ();
5056
57+ // This is run with the lock held to ensure that all queue submit
58+ // messages are sent sequentially to the host tool
59+ json frame {
60+ { " type" , " frame" },
61+ { " fid" , tracker.totalStats .getFrameCount () }
62+ };
63+
64+ layer->onFrame (frame.dump ());
65+
5166 // Release the lock to call into the driver
5267 lock.unlock ();
5368 return layer->driver .vkQueuePresentKHR (queue, pPresentInfo);
@@ -67,20 +82,20 @@ VKAPI_ATTR VkResult VKAPI_CALL layer_vkQueueSubmit<user_tag>(
6782 std::unique_lock<std::mutex> lock { g_vulkanLock };
6883 auto * layer = Device::retrieve (queue);
6984
70- using namespace std ::placeholders;
7185 auto onSubmit = std::bind (&Device::onWorkloadSubmit, layer, _1);
7286
7387 auto & tracker = layer->getStateTracker ();
7488 auto & trackQueue = tracker.getQueue (queue);
7589
90+ // This is run with the lock held to ensure that all queue submit
91+ // messages are sent sequentially to the host tool
7692 for (uint32_t i = 0 ; i < submitCount; i++)
7793 {
7894 const auto & submit = pSubmits[i];
7995 for (uint32_t j = 0 ; j < submit.commandBufferCount ; j++)
8096 {
8197 auto & trackCB = tracker.getCommandBuffer (submit.pCommandBuffers [j]);
8298 const auto & LCS = trackCB.getSubmitCommandStream ();
83-
8499 trackQueue.runSubmitCommandStream (LCS, onSubmit);
85100 }
86101 }
@@ -104,6 +119,24 @@ VKAPI_ATTR VkResult VKAPI_CALL layer_vkQueueSubmit2<user_tag>(
104119 std::unique_lock<std::mutex> lock { g_vulkanLock };
105120 auto * layer = Device::retrieve (queue);
106121
122+ auto onSubmit = std::bind (&Device::onWorkloadSubmit, layer, _1);
123+
124+ auto & tracker = layer->getStateTracker ();
125+ auto & trackQueue = tracker.getQueue (queue);
126+
127+ // This is run with the lock held to ensure that all queue submit
128+ // messages are sent sequentially to the host tool
129+ for (uint32_t i = 0 ; i < submitCount; i++)
130+ {
131+ const auto & submit = pSubmits[i];
132+ for (uint32_t j = 0 ; j < submit.commandBufferInfoCount ; j++)
133+ {
134+ auto & trackCB = tracker.getCommandBuffer (submit.pCommandBufferInfos [j].commandBuffer );
135+ const auto & LCS = trackCB.getSubmitCommandStream ();
136+ trackQueue.runSubmitCommandStream (LCS, onSubmit);
137+ }
138+ }
139+
107140 // Release the lock to call into the driver
108141 lock.unlock ();
109142 return layer->driver .vkQueueSubmit2 (queue, submitCount, pSubmits, fence);
@@ -123,6 +156,24 @@ VKAPI_ATTR VkResult VKAPI_CALL layer_vkQueueSubmit2KHR<user_tag>(
123156 std::unique_lock<std::mutex> lock { g_vulkanLock };
124157 auto * layer = Device::retrieve (queue);
125158
159+ auto onSubmit = std::bind (&Device::onWorkloadSubmit, layer, _1);
160+
161+ auto & tracker = layer->getStateTracker ();
162+ auto & trackQueue = tracker.getQueue (queue);
163+
164+ // This is run with the lock held to ensure that all queue submit
165+ // messages are sent sequentially to the host tool
166+ for (uint32_t i = 0 ; i < submitCount; i++)
167+ {
168+ const auto & submit = pSubmits[i];
169+ for (uint32_t j = 0 ; j < submit.commandBufferInfoCount ; j++)
170+ {
171+ auto & trackCB = tracker.getCommandBuffer (submit.pCommandBufferInfos [j].commandBuffer );
172+ const auto & LCS = trackCB.getSubmitCommandStream ();
173+ trackQueue.runSubmitCommandStream (LCS, onSubmit);
174+ }
175+ }
176+
126177 // Release the lock to call into the driver
127178 lock.unlock ();
128179 return layer->driver .vkQueueSubmit2KHR (queue, submitCount, pSubmits, fence);
0 commit comments