Skip to content

Commit 18dffcf

Browse files
frog: frame stats for perf debug
1 parent 11ad78b commit 18dffcf

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

libs/vkd3d/swapchain.c

+42
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,13 @@ struct dxgi_vk_swap_chain
230230
struct platform_sleep_state sleep_state;
231231
} frame_rate_limit;
232232

233+
struct
234+
{
235+
uint64_t last_timestamp_ns;
236+
int64_t frame_times_us[256];
237+
unsigned int count;
238+
} frame_stats;
239+
233240
struct
234241
{
235242
VkSurfaceFormatKHR *formats;
@@ -2944,6 +2951,40 @@ static void dxgi_vk_swap_chain_delay_next_frame(struct dxgi_vk_swap_chain *chain
29442951
vkd3d_queue_timeline_trace_complete_delay_sleep(timeline_trace, cookie);
29452952
}
29462953

2954+
static void dxgi_vk_swap_chain_update_frame_stats(struct dxgi_vk_swap_chain *chain, uint64_t end_time_ns)
2955+
{
2956+
if (chain->frame_stats.last_timestamp_ns)
2957+
{
2958+
chain->frame_stats.frame_times_us[chain->frame_stats.count++] =
2959+
(int64_t)(end_time_ns - chain->frame_stats.last_timestamp_ns) / 1000;
2960+
}
2961+
2962+
chain->frame_stats.last_timestamp_ns = end_time_ns;
2963+
2964+
if (chain->frame_stats.count == ARRAY_SIZE(chain->frame_stats.frame_times_us))
2965+
{
2966+
double avg_time, avg_time_squared, variance, stddev;
2967+
int64_t total_time_squared = 0;
2968+
int64_t total_time = 0;
2969+
unsigned int i;
2970+
2971+
for (i = 0; i < ARRAY_SIZE(chain->frame_stats.frame_times_us); i++)
2972+
{
2973+
total_time += chain->frame_stats.frame_times_us[i];
2974+
total_time_squared += chain->frame_stats.frame_times_us[i] * chain->frame_stats.frame_times_us[i];
2975+
}
2976+
2977+
avg_time = (double)total_time / (double)ARRAY_SIZE(chain->frame_stats.frame_times_us);
2978+
avg_time_squared = (double)total_time_squared / (double)ARRAY_SIZE(chain->frame_stats.frame_times_us);
2979+
variance = avg_time_squared - avg_time * avg_time;
2980+
stddev = sqrt(variance);
2981+
2982+
INFO("AVG FRAME TIME: %.3f ms, stddev: %.3f ms.\n", avg_time * 1e-3, stddev * 1e-3);
2983+
2984+
chain->frame_stats.count = 0;
2985+
}
2986+
}
2987+
29472988
static void *dxgi_vk_swap_chain_wait_worker(void *chain_)
29482989
{
29492990
struct dxgi_vk_swap_chain *chain = chain_;
@@ -2987,6 +3028,7 @@ static void *dxgi_vk_swap_chain_wait_worker(void *chain_)
29873028
}
29883029

29893030
end_frame_time_ns = vkd3d_get_current_time_ns();
3031+
dxgi_vk_swap_chain_update_frame_stats(chain, end_frame_time_ns);
29903032

29913033
if (chain->wait_thread.supports_present_wait)
29923034
dxgi_vk_swap_chain_delay_next_frame(chain, end_frame_time_ns);

0 commit comments

Comments
 (0)