| OLD | NEW |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/ipc/service/gpu_vsync_provider_win.h" | 5 #include "gpu/ipc/service/gpu_vsync_provider_win.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 monitor_info.cbSize = sizeof(MONITORINFOEX); | 183 monitor_info.cbSize = sizeof(MONITORINFOEX); |
| 184 BOOL success = GetMonitorInfo(monitor, &monitor_info); | 184 BOOL success = GetMonitorInfo(monitor, &monitor_info); |
| 185 CHECK(success); | 185 CHECK(success); |
| 186 | 186 |
| 187 if (current_device_name_.compare(monitor_info.szDevice) != 0) { | 187 if (current_device_name_.compare(monitor_info.szDevice) != 0) { |
| 188 // Monitor changed. Close the current adapter handle and open a new one. | 188 // Monitor changed. Close the current adapter handle and open a new one. |
| 189 CloseAdapter(); | 189 CloseAdapter(); |
| 190 OpenAdapter(monitor_info.szDevice); | 190 OpenAdapter(monitor_info.szDevice); |
| 191 } | 191 } |
| 192 | 192 |
| 193 if (WaitForVBlankEvent()) { | 193 // Crash if WaitForVBlankEvent fails to avoid spinning the loop. |
| 194 vsync_provider_->GetVSyncParameters( | 194 CHECK(WaitForVBlankEvent()); |
| 195 base::Bind(&GpuVSyncWorker::SendVSyncUpdate, base::Unretained(this), | 195 |
| 196 base::TimeTicks::Now())); | 196 vsync_provider_->GetVSyncParameters( |
| 197 } | 197 base::Bind(&GpuVSyncWorker::SendVSyncUpdate, base::Unretained(this), |
| 198 base::TimeTicks::Now())); |
| 198 | 199 |
| 199 Reschedule(); | 200 Reschedule(); |
| 200 } | 201 } |
| 201 | 202 |
| 202 void GpuVSyncWorker::SendVSyncUpdate(base::TimeTicks now, | 203 void GpuVSyncWorker::SendVSyncUpdate(base::TimeTicks now, |
| 203 base::TimeTicks timestamp, | 204 base::TimeTicks timestamp, |
| 204 base::TimeDelta interval) { | 205 base::TimeDelta interval) { |
| 205 base::TimeDelta adjustment; | 206 base::TimeDelta adjustment; |
| 206 | 207 |
| 207 if (!(timestamp.is_null() || interval.is_zero())) { | 208 if (!(timestamp.is_null() || interval.is_zero())) { |
| 208 // Timestamp comes from DwmGetCompositionTimingInfo and apparently it might | 209 // Timestamp comes from DwmGetCompositionTimingInfo and apparently it might |
| 209 // be up to 2-3 vsync cycles in the past or in the future. | 210 // be up to 2-3 vsync cycles in the past or in the future. |
| 210 // The adjustment formula was suggested here: | 211 // The adjustment formula was suggested here: |
| 211 // http://www.vsynctester.com/firefoxisbroken.html | 212 // http://www.vsynctester.com/firefoxisbroken.html |
| 212 base::TimeDelta adjustment = | 213 adjustment = |
| 213 ((now - timestamp + interval / 8) % interval + interval) % interval - | 214 ((now - timestamp + interval / 8) % interval + interval) % interval - |
| 214 interval / 8; | 215 interval / 8; |
| 215 timestamp = now - adjustment; | 216 timestamp = now - adjustment; |
| 216 } else { | 217 } else { |
| 217 // DWM must be disabled. | 218 // DWM must be disabled. |
| 218 timestamp = now; | 219 timestamp = now; |
| 219 } | 220 } |
| 220 | 221 |
| 221 TRACE_EVENT1("gpu", "GpuVSyncWorker::SendVSyncUpdate", "adjustment", | 222 TRACE_EVENT1("gpu", "GpuVSyncWorker::SendVSyncUpdate", "adjustment", |
| 222 adjustment.ToInternalValue()); | 223 adjustment.ToInternalValue()); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 void GpuVSyncProviderWin::OnVSync(base::TimeTicks timestamp, | 385 void GpuVSyncProviderWin::OnVSync(base::TimeTicks timestamp, |
| 385 base::TimeDelta interval) { | 386 base::TimeDelta interval) { |
| 386 DCHECK(vsync_worker_->BelongsToWorkerThread()); | 387 DCHECK(vsync_worker_->BelongsToWorkerThread()); |
| 387 | 388 |
| 388 message_filter_->Send( | 389 message_filter_->Send( |
| 389 base::MakeUnique<GpuCommandBufferMsg_UpdateVSyncParameters>( | 390 base::MakeUnique<GpuCommandBufferMsg_UpdateVSyncParameters>( |
| 390 message_filter_->route_id(), timestamp, interval)); | 391 message_filter_->route_id(), timestamp, interval)); |
| 391 } | 392 } |
| 392 | 393 |
| 393 } // namespace gpu | 394 } // namespace gpu |
| OLD | NEW |