@@ -11894,6 +11894,9 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
11894
11894
size_t num_transitions, num_command_buffers;
11895
11895
struct d3d12_command_queue_submission sub;
11896
11896
struct d3d12_command_list *cmd_list;
11897
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
11898
+ unsigned int *breadcrumb_indices;
11899
+ #endif
11897
11900
VkCommandBuffer *buffers;
11898
11901
LONG **outstanding;
11899
11902
unsigned int i, j;
@@ -11942,6 +11945,19 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
11942
11945
return;
11943
11946
}
11944
11947
11948
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
11949
+ if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_BREADCRUMBS_TRACE)
11950
+ {
11951
+ if (!(breadcrumb_indices = vkd3d_malloc(sizeof(unsigned int) * command_list_count)))
11952
+ {
11953
+ vkd3d_free(outstanding);
11954
+ vkd3d_free(buffers);
11955
+ }
11956
+ }
11957
+ else
11958
+ breadcrumb_indices = NULL;
11959
+ #endif
11960
+
11945
11961
sub.execute.debug_capture = false;
11946
11962
11947
11963
num_transitions = 0;
@@ -11956,6 +11972,9 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
11956
11972
"Command list %p is in recording state.\n", command_lists[i]);
11957
11973
vkd3d_free(outstanding);
11958
11974
vkd3d_free(buffers);
11975
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
11976
+ vkd3d_free(breadcrumb_indices);
11977
+ #endif
11959
11978
return;
11960
11979
}
11961
11980
@@ -11969,6 +11988,11 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
11969
11988
buffers[j++] = cmd_list->vk_command_buffer;
11970
11989
if (cmd_list->debug_capture)
11971
11990
sub.execute.debug_capture = true;
11991
+
11992
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
11993
+ if (breadcrumb_indices)
11994
+ breadcrumb_indices[i] = cmd_list->breadcrumb_context_index;
11995
+ #endif
11972
11996
}
11973
11997
11974
11998
/* Append a full GPU barrier between submissions.
@@ -12009,6 +12033,10 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
12009
12033
sub.execute.cmd_count = num_command_buffers;
12010
12034
sub.execute.outstanding_submissions_counters = outstanding;
12011
12035
sub.execute.outstanding_submissions_counter_count = command_list_count;
12036
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
12037
+ sub.execute.breadcrumb_indices = breadcrumb_indices;
12038
+ sub.execute.breadcrumb_indices_count = breadcrumb_indices ? command_list_count : 0;
12039
+ #endif
12012
12040
d3d12_command_queue_add_submission(command_queue, &sub);
12013
12041
}
12014
12042
@@ -13186,6 +13214,18 @@ static void *d3d12_command_queue_submission_worker_main(void *userdata)
13186
13214
* On error, the counters are freed early, so there is no risk of leak. */
13187
13215
vkd3d_free(submission.execute.cmd);
13188
13216
vkd3d_free(submission.execute.transitions);
13217
+ #ifdef VKD3D_ENABLE_BREADCRUMBS
13218
+ for (i = 0; i < submission.execute.breadcrumb_indices_count; i++)
13219
+ {
13220
+ INFO("=== Executing command list context %u on VkQueue %p, queue family %u ===\n",
13221
+ submission.execute.breadcrumb_indices[i],
13222
+ (void*)queue->vkd3d_queue->vk_queue, queue->vkd3d_queue->vk_family_index);
13223
+ vkd3d_breadcrumb_tracer_dump_command_list(&queue->device->breadcrumb_tracer,
13224
+ submission.execute.breadcrumb_indices[i]);
13225
+ INFO("============================\n");
13226
+ }
13227
+ vkd3d_free(submission.execute.breadcrumb_indices);
13228
+ #endif
13189
13229
VKD3D_REGION_END(queue_execute);
13190
13230
break;
13191
13231
0 commit comments