| 244 | } |
| 245 | |
| 246 | static void SetupVsync() |
| 247 | { |
| 248 | #if _WIN32_WINNT >= _WIN32_WINNT_WINBLUE && !defined(__MINGW32__) |
| 249 | const auto psz = sizeof( EVENT_TRACE_PROPERTIES ) + MAX_PATH; |
| 250 | s_propVsync = (EVENT_TRACE_PROPERTIES*)tracy_malloc( psz ); |
| 251 | memset( s_propVsync, 0, sizeof( EVENT_TRACE_PROPERTIES ) ); |
| 252 | s_propVsync->LogFileMode = EVENT_TRACE_REAL_TIME_MODE; |
| 253 | s_propVsync->Wnode.BufferSize = psz; |
| 254 | #ifdef TRACY_TIMER_QPC |
| 255 | s_propVsync->Wnode.ClientContext = 1; |
| 256 | #else |
| 257 | s_propVsync->Wnode.ClientContext = 3; |
| 258 | #endif |
| 259 | s_propVsync->LoggerNameOffset = sizeof( EVENT_TRACE_PROPERTIES ); |
| 260 | strcpy( ((char*)s_propVsync) + sizeof( EVENT_TRACE_PROPERTIES ), "TracyVsync" ); |
| 261 | |
| 262 | auto backup = tracy_malloc( psz ); |
| 263 | memcpy( backup, s_propVsync, psz ); |
| 264 | |
| 265 | const auto controlStatus = ControlTraceA( 0, "TracyVsync", s_propVsync, EVENT_TRACE_CONTROL_STOP ); |
| 266 | if( controlStatus != ERROR_SUCCESS && controlStatus != ERROR_WMI_INSTANCE_NOT_FOUND ) |
| 267 | { |
| 268 | tracy_free( backup ); |
| 269 | tracy_free( s_propVsync ); |
| 270 | return; |
| 271 | } |
| 272 | |
| 273 | memcpy( s_propVsync, backup, psz ); |
| 274 | tracy_free( backup ); |
| 275 | |
| 276 | const auto startStatus = StartTraceA( &s_traceHandleVsync, "TracyVsync", s_propVsync ); |
| 277 | if( startStatus != ERROR_SUCCESS ) |
| 278 | { |
| 279 | tracy_free( s_propVsync ); |
| 280 | return; |
| 281 | } |
| 282 | |
| 283 | EVENT_FILTER_EVENT_ID fe = {}; |
| 284 | fe.FilterIn = TRUE; |
| 285 | fe.Count = 1; |
| 286 | fe.Events[0] = 0x0011; // VSyncDPC_Info |
| 287 | |
| 288 | EVENT_FILTER_DESCRIPTOR desc = {}; |
| 289 | desc.Ptr = (ULONGLONG)&fe; |
| 290 | desc.Size = sizeof( fe ); |
| 291 | desc.Type = EVENT_FILTER_TYPE_EVENT_ID; |
| 292 | |
| 293 | ENABLE_TRACE_PARAMETERS params = {}; |
| 294 | params.Version = ENABLE_TRACE_PARAMETERS_VERSION_2; |
| 295 | params.EnableProperty = EVENT_ENABLE_PROPERTY_IGNORE_KEYWORD_0; |
| 296 | params.SourceId = s_propVsync->Wnode.Guid; |
| 297 | params.EnableFilterDesc = &desc; |
| 298 | params.FilterDescCount = 1; |
| 299 | |
| 300 | uint64_t mask = 0x4000000000000001; // Microsoft_Windows_DxgKrnl_Performance | Base |
| 301 | if( EnableTraceEx2( s_traceHandleVsync, &DxgKrnlGuid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_INFORMATION, mask, mask, 0, ¶ms ) != ERROR_SUCCESS ) |
| 302 | { |
| 303 | tracy_free( s_propVsync ); |
no test coverage detected