| #include "include/private/dvr/vsync_client.h" | |
| #include <log/log.h> | |
| #include <pdx/default_transport/client_channel_factory.h> | |
| #include <private/dvr/display_protocol.h> | |
| using android::dvr::display::VSyncProtocol; | |
| using android::pdx::Transaction; | |
| namespace android { | |
| namespace dvr { | |
| VSyncClient::VSyncClient(long timeout_ms) | |
| : BASE(pdx::default_transport::ClientChannelFactory::Create( | |
| VSyncProtocol::kClientPath), | |
| timeout_ms) {} | |
| VSyncClient::VSyncClient() | |
| : BASE(pdx::default_transport::ClientChannelFactory::Create( | |
| VSyncProtocol::kClientPath)) {} | |
| int VSyncClient::Wait(int64_t* timestamp_ns) { | |
| auto status = InvokeRemoteMethod<VSyncProtocol::Wait>(); | |
| if (!status) { | |
| ALOGE("VSyncClient::Wait: Failed to wait for vsync: %s", | |
| status.GetErrorMessage().c_str()); | |
| return -status.error(); | |
| } | |
| if (timestamp_ns != nullptr) { | |
| *timestamp_ns = status.get(); | |
| } | |
| return 0; | |
| } | |
| int VSyncClient::GetFd() { return event_fd(); } | |
| int VSyncClient::GetLastTimestamp(int64_t* timestamp_ns) { | |
| auto status = InvokeRemoteMethod<VSyncProtocol::GetLastTimestamp>(); | |
| if (!status) { | |
| ALOGE("VSyncClient::GetLastTimestamp: Failed to get vsync timestamp: %s", | |
| status.GetErrorMessage().c_str()); | |
| return -status.error(); | |
| } | |
| *timestamp_ns = status.get(); | |
| return 0; | |
| } | |
| int VSyncClient::GetSchedInfo(int64_t* vsync_period_ns, int64_t* timestamp_ns, | |
| uint32_t* next_vsync_count) { | |
| if (!vsync_period_ns || !timestamp_ns || !next_vsync_count) | |
| return -EINVAL; | |
| auto status = InvokeRemoteMethod<VSyncProtocol::GetSchedInfo>(); | |
| if (!status) { | |
| ALOGE("VSyncClient::GetSchedInfo:: Failed to get warp timestamp: %s", | |
| status.GetErrorMessage().c_str()); | |
| return -status.error(); | |
| } | |
| *vsync_period_ns = status.get().vsync_period_ns; | |
| *timestamp_ns = status.get().timestamp_ns; | |
| *next_vsync_count = status.get().next_vsync_count; | |
| return 0; | |
| } | |
| int VSyncClient::Acknowledge() { | |
| auto status = InvokeRemoteMethod<VSyncProtocol::Acknowledge>(); | |
| ALOGE_IF(!status, "VSuncClient::Acknowledge: Failed to ack vsync because: %s", | |
| status.GetErrorMessage().c_str()); | |
| return ReturnStatusOrError(status); | |
| } | |
| } // namespace dvr | |
| } // namespace android |