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