display_client.cpp revision e4eec20f6263f4a42ae462456f60ea6c4518bb0a
1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "include/private/dvr/display_client.h" 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cutils/log.h> 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cutils/native_handle.h> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/default_transport/client_channel.h> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/default_transport/client_channel_factory.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/status.h> 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <mutex> 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/display_rpc.h> 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/late_latch.h> 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/native_buffer.h> 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::LocalHandle; 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::LocalChannelHandle; 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::Status; 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::Transaction; 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::rpc::IfAnyOf; 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoSurfaceClient::SurfaceClient(LocalChannelHandle channel_handle, 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SurfaceType type) 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : Client{pdx::default_transport::ClientChannel::Create( 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::move(channel_handle))}, 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko type_(type) {} 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoSurfaceClient::SurfaceClient(const std::string& endpoint_path, SurfaceType type) 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : Client{pdx::default_transport::ClientChannelFactory::Create( 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko endpoint_path), 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kInfiniteTimeout}, 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko type_(type) {} 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint SurfaceClient::GetMetadataBufferFd(LocalHandle* out_fd) { 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto buffer_producer = GetMetadataBuffer(); 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!buffer_producer) 39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -ENOMEM; 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *out_fd = buffer_producer->GetBlobFd(); 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::shared_ptr<BufferProducer> SurfaceClient::GetMetadataBuffer() { 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!metadata_buffer_) { 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::GetMetadataBuffer>(); 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "SurfaceClient::AllocateMetadataBuffer: Failed to allocate buffer: " 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "%s", 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return nullptr; 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko metadata_buffer_ = BufferProducer::Import(status.take()); 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return metadata_buffer_; 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoDisplaySurfaceClient::DisplaySurfaceClient(int width, int height, int format, 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int usage, int flags) 64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(DisplayRPC::kClientPath, SurfaceTypeEnum::Normal), 65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko width_(width), 66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko height_(height), 67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko format_(format), 68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko usage_(usage), 69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko flags_(flags), 70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko z_order_(0), 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko visible_(true), 72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko exclude_from_blur_(false), 73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko blur_behind_(true), 74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko mapped_metadata_buffer_(nullptr) { 75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::CreateSurface>( 76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko width, height, format, usage, flags); 77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplaySurfaceClient::DisplaySurfaceClient: Failed to create display " 80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "surface: %s", 81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(status.error()); 83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DisplaySurfaceClient::SetVisible(bool visible) { 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SetAttributes({{DisplaySurfaceAttributeEnum::Visible, 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplaySurfaceAttributeValue{visible}}}); 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DisplaySurfaceClient::SetZOrder(int z_order) { 92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SetAttributes({{DisplaySurfaceAttributeEnum::ZOrder, 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplaySurfaceAttributeValue{z_order}}}); 94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DisplaySurfaceClient::SetExcludeFromBlur(bool exclude_from_blur) { 97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SetAttributes({{DisplaySurfaceAttributeEnum::ExcludeFromBlur, 98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplaySurfaceAttributeValue{exclude_from_blur}}}); 99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DisplaySurfaceClient::SetBlurBehind(bool blur_behind) { 102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SetAttributes({{DisplaySurfaceAttributeEnum::BlurBehind, 103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplaySurfaceAttributeValue{blur_behind}}}); 104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid DisplaySurfaceClient::SetAttributes( 107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const DisplaySurfaceAttributes& attributes) { 108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<int> status = 109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko InvokeRemoteMethod<DisplayRPC::SetAttributes>(attributes); 110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplaySurfaceClient::SetAttributes: Failed to set display surface " 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "attributes: %s", 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Set the local cached copies of the attributes we care about from the full 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // set of attributes sent to the display service. 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (const auto& attribute : attributes) { 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const auto& key = attribute.first; 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const auto* variant = &attribute.second; 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko bool invalid_value = false; 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko switch (key) { 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case DisplaySurfaceAttributeEnum::Visible: 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko invalid_value = 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko !IfAnyOf<int32_t, int64_t, bool>::Get(variant, &visible_); 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case DisplaySurfaceAttributeEnum::ZOrder: 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko invalid_value = !IfAnyOf<int32_t>::Get(variant, &z_order_); 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case DisplaySurfaceAttributeEnum::ExcludeFromBlur: 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko invalid_value = 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko !IfAnyOf<int32_t, int64_t, bool>::Get(variant, &exclude_from_blur_); 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case DisplaySurfaceAttributeEnum::BlurBehind: 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko invalid_value = 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko !IfAnyOf<int32_t, int64_t, bool>::Get(variant, &blur_behind_); 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (invalid_value) { 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGW( 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplaySurfaceClient::SetAttributes: Failed to set display " 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "surface attribute '%s' because of incompatible type: %d", 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplaySurfaceAttributeEnum::ToString(key).c_str(), variant->index()); 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::shared_ptr<BufferProducer> DisplaySurfaceClient::AllocateBuffer( 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko uint32_t* buffer_index) { 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::AllocateBuffer>(); 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("DisplaySurfaceClient::AllocateBuffer: Failed to allocate buffer: %s", 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return nullptr; 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (buffer_index) 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *buffer_index = status.get().first; 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return BufferProducer::Import(status.take().second); 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovolatile DisplaySurfaceMetadata* DisplaySurfaceClient::GetMetadataBufferPtr() { 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!mapped_metadata_buffer_) { 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (auto buffer_producer = GetMetadataBuffer()) { 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko void* addr = nullptr; 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = buffer_producer->GetBlobReadWritePointer( 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko sizeof(DisplaySurfaceMetadata), &addr); 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplaySurfaceClient::GetMetadataBufferPtr: Failed to map surface " 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "metadata: %s", 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return nullptr; 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko mapped_metadata_buffer_ = static_cast<DisplaySurfaceMetadata*>(addr); 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return mapped_metadata_buffer_; 183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoLocalChannelHandle DisplaySurfaceClient::CreateVideoMeshSurface() { 186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::CreateVideoMeshSurface>(); 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplaySurfaceClient::CreateVideoMeshSurface: Failed to create " 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "video mesh surface: %s", 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return status.take(); 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoDisplayClient::DisplayClient(int* error) 197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(pdx::default_transport::ClientChannelFactory::Create( 198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko DisplayRPC::kClientPath), 199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko kInfiniteTimeout) { 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (error) 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *error = Client::error(); 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint DisplayClient::GetDisplayMetrics(SystemDisplayMetrics* metrics) { 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::GetMetrics>(); 206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("DisplayClient::GetDisplayMetrics: Failed to get metrics: %s", 208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *metrics = status.get(); 213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkopdx::Status<void> DisplayClient::SetViewerParams(const ViewerParams& viewer_params) { 217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::SetViewerParams>(viewer_params); 218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("DisplayClient::SetViewerParams: Failed to set viewer params: %s", 220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 221e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return status; 223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 224e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint DisplayClient::GetLastFrameEdsTransform(LateLatchOutput* ll_out) { 226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::GetEdsCapture>(); 227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplayClient::GetLastFrameLateLatch: Failed to get most recent late" 230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko " latch: %s", 231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (status.get().size() != sizeof(LateLatchOutput)) { 236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplayClient::GetLastFrameLateLatch: Error expected to receive %zu " 238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "bytes but received %zu", 239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko sizeof(LateLatchOutput), status.get().size()); 240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EIO; 241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *ll_out = *reinterpret_cast<const LateLatchOutput*>(status.get().data()); 244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint DisplayClient::EnterVrMode() { 248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::EnterVrMode>(); 249e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 250e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 251e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplayClient::EnterVrMode: Failed to set display service to Vr mode"); 252e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 253e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 256e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 257e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 258e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint DisplayClient::ExitVrMode() { 259e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<DisplayRPC::ExitVrMode>(); 260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "DisplayClient::ExitVrMode: Failed to revert display service from Vr " 263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "mode"); 264e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 265e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 267e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 268e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::unique_ptr<DisplaySurfaceClient> DisplayClient::CreateDisplaySurface( 271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int width, int height, int format, int usage, int flags) { 272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return DisplaySurfaceClient::Create(width, height, format, usage, flags); 273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 277