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