| 217 | } |
| 218 | |
| 219 | void TracyVkCollector::Create(VkDevice device, VkQueue queue, uint32_t queue_family_i) { |
| 220 | if (std::find_if(queue_to_collector_map.begin(), queue_to_collector_map.end(), |
| 221 | [queue](const std::unique_ptr<TracyVkCollector>& collector) { return collector->queue == queue; }) != |
| 222 | queue_to_collector_map.end()) { |
| 223 | return; |
| 224 | } |
| 225 | |
| 226 | std::unique_ptr<TracyVkCollector> collector = std::make_unique<TracyVkCollector>(); |
| 227 | collector->device = device; |
| 228 | collector->queue = queue; |
| 229 | |
| 230 | VkCommandPoolCreateInfo cmd_pool_ci = vku::InitStructHelper(); |
| 231 | cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; |
| 232 | cmd_pool_ci.queueFamilyIndex = queue_family_i; |
| 233 | VkResult result = TracyVkCollector::CreateCommandPool(device, &cmd_pool_ci, nullptr, &collector->cmd_pool); |
| 234 | assert(result == VK_SUCCESS); |
| 235 | |
| 236 | { |
| 237 | auto zone_profiling_cmd_pool = new ZoneProfilingCommandPool; |
| 238 | zone_profiling_cmd_pool->device = device; |
| 239 | result = TracyVkCollector::CreateCommandPool(device, &cmd_pool_ci, nullptr, &zone_profiling_cmd_pool->cmd_pool); |
| 240 | assert(result == VK_SUCCESS); |
| 241 | if (auto find_it = GetQueueToGpuZoneProfilingCommandPoolMap().find(queue); |
| 242 | find_it != GetQueueToGpuZoneProfilingCommandPoolMap().end()) { |
| 243 | VVL_TracyMessageL("[tracyvk] Already created command pool for queue"); |
| 244 | assert(false); |
| 245 | } |
| 246 | |
| 247 | VkCommandBufferAllocateInfo cmd_buf_ai = vku::InitStructHelper(); |
| 248 | cmd_buf_ai.commandPool = zone_profiling_cmd_pool->cmd_pool; |
| 249 | cmd_buf_ai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; |
| 250 | cmd_buf_ai.commandBufferCount = zone_profiling_command_buffers_count; |
| 251 | |
| 252 | zone_profiling_cmd_pool->cmd_buffers.resize(cmd_buf_ai.commandBufferCount); |
| 253 | result = |
| 254 | TracyVkCollector::AllocateCommandBuffers(collector->device, &cmd_buf_ai, zone_profiling_cmd_pool->cmd_buffers.data()); |
| 255 | assert(result == VK_SUCCESS); |
| 256 | |
| 257 | zone_profiling_cmd_pool->fences.resize(cmd_buf_ai.commandBufferCount); |
| 258 | for (VkFence& fence : zone_profiling_cmd_pool->fences) { |
| 259 | VkFenceCreateInfo fence_ci = vku::InitStructHelper(); |
| 260 | fence_ci.flags = VK_FENCE_CREATE_SIGNALED_BIT; |
| 261 | result = TracyVkCollector::CreateFence(device, &fence_ci, nullptr, &fence); |
| 262 | assert(result == VK_SUCCESS); |
| 263 | } |
| 264 | |
| 265 | GetQueueToGpuZoneProfilingCommandPoolMap().insert(queue, std::move(zone_profiling_cmd_pool)); |
| 266 | } |
| 267 | |
| 268 | VkCommandBufferAllocateInfo cmd_buf_ai = vku::InitStructHelper(); |
| 269 | cmd_buf_ai.commandPool = collector->cmd_pool; |
| 270 | cmd_buf_ai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; |
| 271 | cmd_buf_ai.commandBufferCount = 1; |
| 272 | |
| 273 | result = TracyVkCollector::AllocateCommandBuffers(device, &cmd_buf_ai, &collector->cmd_buf); |
| 274 | assert(result == VK_SUCCESS); |
| 275 | |
| 276 | VkFenceCreateInfo fence_ci = vku::InitStructHelper(); |
nothing calls this directly
no test coverage detected