10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/ozone/platform/dri/dri_vsync_provider.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/time/time.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_delegate.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/ozone/platform/dri/hardware_display_controller.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace ui {
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDriVSyncProvider::DriVSyncProvider(DriWindowDelegate* window_delegate)
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : window_delegate_(window_delegate) {
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)DriVSyncProvider::~DriVSyncProvider() {}
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DriVSyncProvider::GetVSyncParameters(const UpdateVSyncCallback& callback) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HardwareDisplayController* controller = window_delegate_->GetController();
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!controller)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The value is invalid, so we can't update the parameters.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (controller->get_time_of_last_flip() == 0 ||
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      controller->get_mode().vrefresh == 0)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Stores the time of the last refresh.
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::TimeTicks timebase =
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeTicks::FromInternalValue(controller->get_time_of_last_flip());
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Stores the refresh rate.
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::TimeDelta interval =
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta::FromSeconds(1) / controller->get_mode().vrefresh;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  callback.Run(timebase, interval);
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace ui
40