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