Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for queue profiling when using NV_low_latency2. #1920

Merged
merged 3 commits into from
Mar 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions libs/vkd3d/queue_timeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ void vkd3d_queue_timeline_trace_complete_present_wait(struct vkd3d_queue_timelin
vkd3d_queue_timeline_trace_free_index(trace, cookie.index);
}

void vkd3d_queue_timeline_trace_complete_present_block(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie)
void vkd3d_queue_timeline_trace_complete_blocking(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie, const char *pid)
{
const struct vkd3d_queue_timeline_trace_state *state;
double end_ts, start_ts;
Expand All @@ -234,12 +234,24 @@ void vkd3d_queue_timeline_trace_complete_present_block(struct vkd3d_queue_timeli
end_ts = (double)(vkd3d_get_current_time_ns() - trace->base_ts) * 1e-3;
start_ts = (double)(state->start_ts - trace->base_ts) * 1e-3;

fprintf(trace->file, "{ \"name\": \"%s\", \"ph\": \"X\", \"tid\": \"0x%04x\", \"pid\": \"IDXGISwapChain::Present()\", \"ts\": %f, \"dur\": %f },\n",
state->desc, state->tid, start_ts, end_ts - start_ts);
fprintf(trace->file, "{ \"name\": \"%s\", \"ph\": \"X\", \"tid\": \"0x%04x\", \"pid\": \"%s\", \"ts\": %f, \"dur\": %f },\n",
state->desc, state->tid, pid, start_ts, end_ts - start_ts);

vkd3d_queue_timeline_trace_free_index(trace, cookie.index);
}

void vkd3d_queue_timeline_trace_complete_present_block(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie)
{
vkd3d_queue_timeline_trace_complete_blocking(trace, cookie, "IDXGISwapChain::Present()");
}

void vkd3d_queue_timeline_trace_complete_low_latency_sleep(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie)
{
vkd3d_queue_timeline_trace_complete_blocking(trace, cookie, "ID3DLowLatencyDevice::LatencySleep()");
}

struct vkd3d_queue_timeline_trace_cookie
vkd3d_queue_timeline_trace_register_execute(struct vkd3d_queue_timeline_trace *trace,
ID3D12CommandList * const *command_lists, unsigned int count)
Expand Down Expand Up @@ -419,6 +431,14 @@ vkd3d_queue_timeline_trace_register_present_block(struct vkd3d_queue_timeline_tr
return vkd3d_queue_timeline_trace_register_generic_op(trace, VKD3D_QUEUE_TIMELINE_TRACE_STATE_TYPE_PRESENT_BLOCK, str);
}

struct vkd3d_queue_timeline_trace_cookie
vkd3d_queue_timeline_trace_register_low_latency_sleep(struct vkd3d_queue_timeline_trace *trace, uint64_t present_id)
{
char str[128];
snprintf(str, sizeof(str), "LATENCY SLEEP (id = %"PRIu64")", present_id);
return vkd3d_queue_timeline_trace_register_generic_op(trace, VKD3D_QUEUE_TIMELINE_TRACE_STATE_TYPE_LOW_LATENCY_SLEEP, str);
}

static void vkd3d_queue_timeline_trace_flush_instantaneous(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_fence_worker *worker)
{
Expand Down
14 changes: 12 additions & 2 deletions libs/vkd3d/swapchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -949,7 +949,10 @@ static HRESULT STDMETHODCALLTYPE dxgi_vk_swap_chain_Present(IDXGIVkSwapChain *if
chain->user.index = (chain->user.index + 1) % chain->desc.BufferCount;

cookie = vkd3d_queue_timeline_trace_register_present_block(
&chain->queue->device->queue_timeline_trace, chain->user.blit_count);
&chain->queue->device->queue_timeline_trace,
chain->queue->device->frame_markers.present ?
chain->queue->device->frame_markers.present :
chain->user.blit_count);

/* Relevant if application does not use latency fence, or we force a lower latency through VKD3D_SWAPCHAIN_FRAME_LATENCY overrides. */
if (vkd3d_native_sync_handle_is_valid(chain->frame_latency_event_internal))
Expand Down Expand Up @@ -1810,7 +1813,9 @@ static void dxgi_vk_swap_chain_present_signal_blit_semaphore(struct dxgi_vk_swap

/* Mark frame boundary. */
cookie = vkd3d_queue_timeline_trace_register_swapchain_blit(
&chain->queue->device->queue_timeline_trace, chain->present.complete_count);
&chain->queue->device->queue_timeline_trace,
chain->present.present_id_valid ?
chain->present.present_id : chain->present.complete_count);

if (vkd3d_queue_timeline_trace_cookie_is_valid(cookie))
{
Expand Down Expand Up @@ -2697,6 +2702,7 @@ bool dxgi_vk_swap_chain_low_latency_enabled(struct dxgi_vk_swap_chain *chain)
void dxgi_vk_swap_chain_latency_sleep(struct dxgi_vk_swap_chain *chain)
{
const struct vkd3d_vk_device_procs *vk_procs = &chain->queue->device->vk_procs;
struct vkd3d_queue_timeline_trace_cookie cookie;
VkLatencySleepInfoNV latency_sleep_info;
VkSemaphoreWaitInfo sem_wait_info;
bool should_sleep = false;
Expand Down Expand Up @@ -2730,7 +2736,11 @@ void dxgi_vk_swap_chain_latency_sleep(struct dxgi_vk_swap_chain *chain)
sem_wait_info.pSemaphores = &chain->present.low_latency_sem;
sem_wait_info.pValues = &chain->present.low_latency_sem_value;

cookie = vkd3d_queue_timeline_trace_register_low_latency_sleep(
&chain->queue->device->queue_timeline_trace, chain->present.low_latency_sem_value);
VK_CALL(vkWaitSemaphores(chain->queue->device->vk_device, &sem_wait_info, UINT64_MAX));
vkd3d_queue_timeline_trace_complete_low_latency_sleep(
&chain->queue->device->queue_timeline_trace, cookie);
}
}

Expand Down
8 changes: 8 additions & 0 deletions libs/vkd3d/vkd3d_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -4536,6 +4536,9 @@ enum vkd3d_queue_timeline_trace_state_type
/* Time spent blocking in ::Present() in user thread. */
VKD3D_QUEUE_TIMELINE_TRACE_STATE_TYPE_PRESENT_BLOCK,

/* Time spent blocking in LowLatencySleep in user thread. */
VKD3D_QUEUE_TIMELINE_TRACE_STATE_TYPE_LOW_LATENCY_SLEEP,

/* Reset() and Close() are useful instant events to see when command recording is happening and
* which threads do so. */
VKD3D_QUEUE_TIMELINE_TRACE_STATE_TYPE_COMMAND_LIST,
Expand Down Expand Up @@ -4605,6 +4608,9 @@ struct vkd3d_queue_timeline_trace_cookie
vkd3d_queue_timeline_trace_register_present_block(struct vkd3d_queue_timeline_trace *trace,
uint64_t present_id);
struct vkd3d_queue_timeline_trace_cookie
vkd3d_queue_timeline_trace_register_low_latency_sleep(struct vkd3d_queue_timeline_trace *trace,
uint64_t present_id);
struct vkd3d_queue_timeline_trace_cookie
vkd3d_queue_timeline_trace_register_execute(struct vkd3d_queue_timeline_trace *trace,
ID3D12CommandList * const *command_lists, unsigned int count);
struct vkd3d_queue_timeline_trace_cookie
Expand All @@ -4623,6 +4629,8 @@ void vkd3d_queue_timeline_trace_complete_present_wait(struct vkd3d_queue_timelin
struct vkd3d_queue_timeline_trace_cookie cookie);
void vkd3d_queue_timeline_trace_complete_present_block(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie);
void vkd3d_queue_timeline_trace_complete_low_latency_sleep(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie);
void vkd3d_queue_timeline_trace_close_command_list(struct vkd3d_queue_timeline_trace *trace,
struct vkd3d_queue_timeline_trace_cookie cookie);
void vkd3d_queue_timeline_trace_begin_execute(struct vkd3d_queue_timeline_trace *trace,
Expand Down
Loading