| #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 |