display_client.cpp revision 4fe60582f314e381098f8f3bc2e39c5880e9243a
1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "include/private/dvr/display_client.h"
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cutils/native_handle.h>
44fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.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