1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/viz/service/frame_sinks/external_begin_frame_source_android.h"
6 
7 #include "base/android/jni_android.h"
8 #include "components/viz/service/service_jni_headers/ExternalBeginFrameSourceAndroid_jni.h"
9 
10 namespace viz {
11 
ExternalBeginFrameSourceAndroid(uint32_t restart_id,float refresh_rate)12 ExternalBeginFrameSourceAndroid::ExternalBeginFrameSourceAndroid(
13     uint32_t restart_id,
14     float refresh_rate)
15     : ExternalBeginFrameSource(this, restart_id),
16       j_object_(Java_ExternalBeginFrameSourceAndroid_Constructor(
17           base::android::AttachCurrentThread(),
18           reinterpret_cast<jlong>(this),
19           refresh_rate)) {}
20 
~ExternalBeginFrameSourceAndroid()21 ExternalBeginFrameSourceAndroid::~ExternalBeginFrameSourceAndroid() {
22   SetEnabled(false);
23 }
24 
OnVSync(JNIEnv * env,const base::android::JavaParamRef<jobject> & obj,jlong time_micros,jlong period_micros)25 void ExternalBeginFrameSourceAndroid::OnVSync(
26     JNIEnv* env,
27     const base::android::JavaParamRef<jobject>& obj,
28     jlong time_micros,
29     jlong period_micros) {
30   // Warning: It is generally unsafe to manufacture TimeTicks values. The
31   // following assumption is being made, AND COULD EASILY BREAK AT ANY TIME:
32   // Upstream, Java code is providing "System.nanos() / 1000," and this is the
33   // same timestamp that would be provided by the CLOCK_MONOTONIC POSIX clock.
34   DCHECK_EQ(base::TimeTicks::GetClock(),
35             base::TimeTicks::Clock::LINUX_CLOCK_MONOTONIC);
36   base::TimeTicks frame_time =
37       base::TimeTicks() + base::TimeDelta::FromMicroseconds(time_micros);
38   base::TimeDelta vsync_period(
39       base::TimeDelta::FromMicroseconds(period_micros));
40   // Calculate the next frame deadline:
41   base::TimeTicks deadline = frame_time + vsync_period;
42 
43   auto begin_frame_args = begin_frame_args_generator_.GenerateBeginFrameArgs(
44       source_id(), frame_time, deadline, vsync_period);
45   OnBeginFrame(begin_frame_args);
46 }
47 
UpdateRefreshRate(float refresh_rate)48 void ExternalBeginFrameSourceAndroid::UpdateRefreshRate(float refresh_rate) {
49   Java_ExternalBeginFrameSourceAndroid_updateRefreshRate(
50       base::android::AttachCurrentThread(), j_object_, refresh_rate);
51 }
52 
OnNeedsBeginFrames(bool needs_begin_frames)53 void ExternalBeginFrameSourceAndroid::OnNeedsBeginFrames(
54     bool needs_begin_frames) {
55   SetEnabled(needs_begin_frames);
56 }
57 
SetEnabled(bool enabled)58 void ExternalBeginFrameSourceAndroid::SetEnabled(bool enabled) {
59   Java_ExternalBeginFrameSourceAndroid_setEnabled(
60       base::android::AttachCurrentThread(), j_object_, enabled);
61 }
62 
63 }  // namespace viz
64