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>
63f82d31341f66d0c58e1ec3360ea5f528ffe0ea4Corey Tabaka#include <private/dvr/display_protocol.h>
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::display::VSyncProtocol;
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::Transaction;
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr {
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoVSyncClient::VSyncClient(long timeout_ms)
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    : BASE(pdx::default_transport::ClientChannelFactory::Create(
162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka               VSyncProtocol::kClientPath),
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           timeout_ms) {}
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoVSyncClient::VSyncClient()
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    : BASE(pdx::default_transport::ClientChannelFactory::Create(
212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          VSyncProtocol::kClientPath)) {}
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint VSyncClient::Wait(int64_t* timestamp_ns) {
242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = InvokeRemoteMethod<VSyncProtocol::Wait>();
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!status) {
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("VSyncClient::Wait: Failed to wait for vsync: %s",
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          status.GetErrorMessage().c_str());
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -status.error();
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
30b4213f7539a3172eed55dbee75f0a0d4ea747ffaOkan Arikan
31b4213f7539a3172eed55dbee75f0a0d4ea747ffaOkan Arikan  if (timestamp_ns != nullptr) {
32b4213f7539a3172eed55dbee75f0a0d4ea747ffaOkan Arikan    *timestamp_ns = status.get();
33b4213f7539a3172eed55dbee75f0a0d4ea747ffaOkan Arikan  }
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return 0;
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint VSyncClient::GetFd() { return event_fd(); }
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint VSyncClient::GetLastTimestamp(int64_t* timestamp_ns) {
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = InvokeRemoteMethod<VSyncProtocol::GetLastTimestamp>();
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!status) {
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("VSyncClient::GetLastTimestamp: Failed to get vsync timestamp: %s",
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          status.GetErrorMessage().c_str());
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -status.error();
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *timestamp_ns = status.get();
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return 0;
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint VSyncClient::GetSchedInfo(int64_t* vsync_period_ns, int64_t* timestamp_ns,
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                              uint32_t* next_vsync_count) {
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!vsync_period_ns || !timestamp_ns || !next_vsync_count)
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -EINVAL;
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = InvokeRemoteMethod<VSyncProtocol::GetSchedInfo>();
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!status) {
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("VSyncClient::GetSchedInfo:: Failed to get warp timestamp: %s",
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          status.GetErrorMessage().c_str());
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -status.error();
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *vsync_period_ns = status.get().vsync_period_ns;
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *timestamp_ns = status.get().timestamp_ns;
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *next_vsync_count = status.get().next_vsync_count;
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return 0;
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint VSyncClient::Acknowledge() {
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = InvokeRemoteMethod<VSyncProtocol::Acknowledge>();
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGE_IF(!status, "VSuncClient::Acknowledge: Failed to ack vsync because: %s",
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           status.GetErrorMessage().c_str());
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return ReturnStatusOrError(status);
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace dvr
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
77