blob: a0fb313aea7cef6f5eec98594a9a802c2db009aa [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#include "include/private/dvr/vsync_client.h"
2
Alex Vakulenko4fe60582017-02-02 11:35:59 -08003#include <log/log.h>
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08004
5#include <pdx/default_transport/client_channel_factory.h>
6#include <private/dvr/display_rpc.h>
7
8using android::pdx::Transaction;
9
10namespace android {
11namespace dvr {
12
13VSyncClient::VSyncClient(long timeout_ms)
14 : BASE(pdx::default_transport::ClientChannelFactory::Create(
15 DisplayVSyncRPC::kClientPath),
16 timeout_ms) {}
17
18VSyncClient::VSyncClient()
19 : BASE(pdx::default_transport::ClientChannelFactory::Create(
20 DisplayVSyncRPC::kClientPath)) {}
21
22int VSyncClient::Wait(int64_t* timestamp_ns) {
23 auto status = InvokeRemoteMethod<DisplayVSyncRPC::Wait>();
24 if (!status) {
25 ALOGE("VSyncClient::Wait: Failed to wait for vsync: %s",
26 status.GetErrorMessage().c_str());
27 return -status.error();
28 }
29 *timestamp_ns = status.get();
30 return 0;
31}
32
33int VSyncClient::GetFd() { return event_fd(); }
34
35int VSyncClient::GetLastTimestamp(int64_t* timestamp_ns) {
36 auto status = InvokeRemoteMethod<DisplayVSyncRPC::GetLastTimestamp>();
37 if (!status) {
38 ALOGE("VSyncClient::GetLastTimestamp: Failed to get vsync timestamp: %s",
39 status.GetErrorMessage().c_str());
40 return -status.error();
41 }
42 *timestamp_ns = status.get();
43 return 0;
44}
45
46int VSyncClient::GetSchedInfo(int64_t* vsync_period_ns, int64_t* timestamp_ns,
47 uint32_t* next_vsync_count) {
48 if (!vsync_period_ns || !timestamp_ns || !next_vsync_count)
49 return -EINVAL;
50
51 auto status = InvokeRemoteMethod<DisplayVSyncRPC::GetSchedInfo>();
52 if (!status) {
53 ALOGE("VSyncClient::GetSchedInfo:: Failed to get warp timestamp: %s",
54 status.GetErrorMessage().c_str());
55 return -status.error();
56 }
57
58 *vsync_period_ns = status.get().vsync_period_ns;
59 *timestamp_ns = status.get().timestamp_ns;
60 *next_vsync_count = status.get().next_vsync_count;
61 return 0;
62}
63
64int VSyncClient::Acknowledge() {
65 auto status = InvokeRemoteMethod<DisplayVSyncRPC::Acknowledge>();
66 ALOGE_IF(!status, "VSuncClient::Acknowledge: Failed to ack vsync because: %s",
67 status.GetErrorMessage().c_str());
68 return ReturnStatusOrError(status);
69}
70
71} // namespace dvr
72} // namespace android