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