@@ -230,6 +230,13 @@ struct dxgi_vk_swap_chain
230
230
struct platform_sleep_state sleep_state ;
231
231
} frame_rate_limit ;
232
232
233
+ struct
234
+ {
235
+ uint64_t last_timestamp_ns ;
236
+ int64_t frame_times_us [256 ];
237
+ unsigned int count ;
238
+ } frame_stats ;
239
+
233
240
struct
234
241
{
235
242
VkSurfaceFormatKHR * formats ;
@@ -2944,6 +2951,40 @@ static void dxgi_vk_swap_chain_delay_next_frame(struct dxgi_vk_swap_chain *chain
2944
2951
vkd3d_queue_timeline_trace_complete_delay_sleep (timeline_trace , cookie );
2945
2952
}
2946
2953
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
+
2947
2988
static void * dxgi_vk_swap_chain_wait_worker (void * chain_ )
2948
2989
{
2949
2990
struct dxgi_vk_swap_chain * chain = chain_ ;
@@ -2987,6 +3028,7 @@ static void *dxgi_vk_swap_chain_wait_worker(void *chain_)
2987
3028
}
2988
3029
2989
3030
end_frame_time_ns = vkd3d_get_current_time_ns ();
3031
+ dxgi_vk_swap_chain_update_frame_stats (chain , end_frame_time_ns );
2990
3032
2991
3033
if (chain -> wait_thread .supports_present_wait )
2992
3034
dxgi_vk_swap_chain_delay_next_frame (chain , end_frame_time_ns );
0 commit comments