display_service.cpp revision 3cfac28462910d3f976aebac54ac7301aca7e434
176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include "display_service.h"
276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <vector>
476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <pdx/default_transport/service_endpoint.h>
676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <pdx/rpc/remote_method.h>
776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/composite_hmd.h>
876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/display_rpc.h>
976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/display_types.h>
1076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/lucid_metrics.h>
1176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/numeric.h>
1276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/polynomial_radial_distortion.h>
1376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson#include <private/dvr/types.h>
1476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
1576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonusing android::pdx::Channel;
1676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonusing android::pdx::Message;
1776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonusing android::pdx::default_transport::Endpoint;
1876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonusing android::pdx::rpc::DispatchRemoteMethod;
19847cf342c956eac3dec03b7b29fcb188ffe8804fJesse Wilsonusing android::pdx::rpc::WrapBuffer;
20eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
2176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonnamespace android {
2276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonnamespace dvr {
2376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
2476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse WilsonDisplayService::DisplayService() : DisplayService(nullptr) {}
25847cf342c956eac3dec03b7b29fcb188ffe8804fJesse Wilson
2676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse WilsonDisplayService::DisplayService(Hwc2::Composer* hidl)
2776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    : BASE("DisplayService", Endpoint::Create(DisplayRPC::kClientPath)),
2876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      hardware_composer_(hidl) {}
2976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
3076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonstd::string DisplayService::DumpState(size_t max_length) {
3176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::vector<char> buffer(max_length);
3276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  uint32_t max_len_p = static_cast<uint32_t>(max_length);
3376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  hardware_composer_.Dump(buffer.data(), &max_len_p);
3476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return std::string(buffer.data());
3576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
363312b297600ec97f28f979dfbdf6c95e164a304fJesse Wilson
373312b297600ec97f28f979dfbdf6c95e164a304fJesse Wilsonvoid DisplayService::OnChannelClose(pdx::Message& /*message*/,
3876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                                    const std::shared_ptr<Channel>& channel) {
3976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  auto surface = std::static_pointer_cast<SurfaceChannel>(channel);
4076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (surface && surface->type() == SurfaceTypeEnum::Normal) {
4176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    auto display_surface = std::static_pointer_cast<DisplaySurface>(surface);
4276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    display_surface->ManagerSetVisible(false);
4376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    display_surface->ClientSetVisible(false);
4476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    NotifyDisplayConfigurationUpdate();
4576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
4676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // TODO(jwcai) Handle ChannelClose of VideoMeshSurface.
4776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
4876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
4976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson// First-level dispatch for display service messages. Directly handles messages
5076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson// that are independent of the display surface (metrics, creation) and routes
5176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson// surface-specific messages to the per-instance handlers.
5276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonint DisplayService::HandleMessage(pdx::Message& message) {
5376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  auto channel = message.GetChannel<SurfaceChannel>();
5476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
5576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  switch (message.GetOp()) {
5676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::GetMetrics::Opcode:
5776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::GetMetrics>(
5876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnGetMetrics, message);
5976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
6076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
6176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::GetEdsCapture::Opcode:
6276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::GetEdsCapture>(
6376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnGetEdsCapture, message);
6476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
6576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
6676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::CreateSurface::Opcode:
6776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::CreateSurface>(
6876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnCreateSurface, message);
6976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
7076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
7176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::EnterVrMode::Opcode:
7276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::EnterVrMode>(
7376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnEnterVrMode, message);
7476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
7576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
7676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::ExitVrMode::Opcode:
7776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::ExitVrMode>(
7876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnExitVrMode, message);
7976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
8076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
8176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::SetViewerParams::Opcode:
8276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      DispatchRemoteMethod<DisplayRPC::SetViewerParams>(
8376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          *this, &DisplayService::OnSetViewerParams, message);
8476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return 0;
8576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
8676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    // Direct the surface specific messages to the surface instance.
8776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::AllocateBuffer::Opcode:
8876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::SetAttributes::Opcode:
8976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    case DisplayRPC::GetMetadataBuffer::Opcode:
909d30ea033329f76ea9b20fa778f04cddd8fe710cJesse Wilson    case DisplayRPC::CreateVideoMeshSurface::Opcode:
919d30ea033329f76ea9b20fa778f04cddd8fe710cJesse Wilson    case DisplayRPC::VideoMeshSurfaceCreateProducerQueue::Opcode:
929d30ea033329f76ea9b20fa778f04cddd8fe710cJesse Wilson      return HandleSurfaceMessage(message);
939d30ea033329f76ea9b20fa778f04cddd8fe710cJesse Wilson
949d30ea033329f76ea9b20fa778f04cddd8fe710cJesse Wilson    default:
9576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      return Service::HandleMessage(message);
9676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
9776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
9876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
9976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse WilsonSystemDisplayMetrics DisplayService::OnGetMetrics(pdx::Message& message) {
10076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  const Compositor* compositor = hardware_composer_.GetCompositor();
10176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (compositor == nullptr)
10276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    REPLY_ERROR_RETURN(message, EINVAL, {});
10376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
10476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  HeadMountMetrics head_mount = compositor->head_mount_metrics();
10576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  CompositeHmd hmd(head_mount, hardware_composer_.GetHmdDisplayMetrics());
10676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  vec2i distorted_render_size = hmd.GetRecommendedRenderTargetSize();
10776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  FieldOfView left_fov = hmd.GetEyeFov(kLeftEye);
10876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  FieldOfView right_fov = hmd.GetEyeFov(kRightEye);
10976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
11076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  SystemDisplayMetrics metrics;
11176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
11276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.display_native_width = GetDisplayMetrics().width;
11376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.display_native_height = GetDisplayMetrics().height;
11476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.display_x_dpi = GetDisplayMetrics().dpi.x;
11576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.display_y_dpi = GetDisplayMetrics().dpi.y;
11676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.distorted_width = distorted_render_size[0];
11776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.distorted_height = distorted_render_size[1];
11876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.vsync_period_ns =
11976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      hardware_composer_.native_display_metrics().vsync_period_ns;
12076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.hmd_ipd_mm = 0;
12176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.inter_lens_distance_m = head_mount.GetInterLensDistance();
12276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.left_fov_lrbt[0] = left_fov.GetLeft();
12376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.left_fov_lrbt[1] = left_fov.GetRight();
12476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.left_fov_lrbt[2] = left_fov.GetBottom();
12576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.left_fov_lrbt[3] = left_fov.GetTop();
12676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.right_fov_lrbt[0] = right_fov.GetLeft();
12776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.right_fov_lrbt[1] = right_fov.GetRight();
12876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.right_fov_lrbt[2] = right_fov.GetBottom();
12976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  metrics.right_fov_lrbt[3] = right_fov.GetTop();
13076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
13176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return metrics;
13276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
13376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
13476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson// Creates a new DisplaySurface and associates it with this channel. This may
13576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson// only be done once per channel.
13676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonint DisplayService::OnCreateSurface(pdx::Message& message, int width,
13776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                                    int height, int format, int usage,
13876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                                    DisplaySurfaceFlags flags) {
13976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // A surface may only be created once per channel.
14076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (message.GetChannel())
14176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    return -EINVAL;
14276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
14376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  ALOGI_IF(TRACE, "DisplayService::OnCreateSurface: cid=%d",
14476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           message.GetChannelId());
14576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
14676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // Use the channel id as the unique surface id.
14776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  const int surface_id = message.GetChannelId();
14876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  const int process_id = message.GetProcessId();
14976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
15076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  ALOGI_IF(TRACE,
15176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           "DisplayService::OnCreateSurface: surface_id=%d process_id=%d "
15276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           "width=%d height=%d format=%x usage=%x flags=%x",
15376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           surface_id, process_id, width, height, format, usage, flags);
15476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
15576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // TODO(eieio,jbates): Validate request parameters.
15676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  auto channel = std::make_shared<DisplaySurface>(
15776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      this, surface_id, process_id, width, height, format, usage, flags);
15876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
15976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  message.SetChannel(channel);
16076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  NotifyDisplayConfigurationUpdate();
16176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return 0;
16276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
16376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
16476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse WilsonDisplayRPC::ByteBuffer DisplayService::OnGetEdsCapture(pdx::Message& message) {
16576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  Compositor* compositor = hardware_composer_.GetCompositor();
16676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (compositor == nullptr)
16776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    REPLY_ERROR_RETURN(message, EINVAL, {});
16876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
16976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::vector<std::uint8_t> buffer(sizeof(LateLatchOutput));
17076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
17176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (!compositor->GetLastEdsPose(
17276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          reinterpret_cast<LateLatchOutput*>(buffer.data()))) {
17376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    REPLY_ERROR_RETURN(message, EPERM, {});
17476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
17576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
17676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return WrapBuffer(std::move(buffer));
17776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
1789d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
1799d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilsonint DisplayService::OnEnterVrMode(pdx::Message& /*message*/) {
1809d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  hardware_composer_.Resume();
181847cf342c956eac3dec03b7b29fcb188ffe8804fJesse Wilson  return 0;
182847cf342c956eac3dec03b7b29fcb188ffe8804fJesse Wilson}
18376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
18476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonint DisplayService::OnExitVrMode(pdx::Message& /*message*/) {
18576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  hardware_composer_.Suspend();
1861ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  return 0;
1871ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson}
1881ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
18976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonvoid DisplayService::OnSetViewerParams(pdx::Message& message,
19076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                                       const ViewerParams& view_params) {
19176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  Compositor* compositor = hardware_composer_.GetCompositor();
1929d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  if (compositor == nullptr)
1939d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    REPLY_ERROR_RETURN(message, EINVAL);
19476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
19576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  FieldOfView left(55.0f, 55.0f, 55.0f, 55.0f);
19676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  FieldOfView right(55.0f, 55.0f, 55.0f, 55.0f);
19776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (view_params.left_eye_field_of_view_angles.size() >= 4) {
19876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    left = FieldOfView(ToRad(view_params.left_eye_field_of_view_angles[0]),
199febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                       ToRad(view_params.left_eye_field_of_view_angles[1]),
200febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                       ToRad(view_params.left_eye_field_of_view_angles[2]),
201febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                       ToRad(view_params.left_eye_field_of_view_angles[3]));
202febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    right = FieldOfView(ToRad(view_params.left_eye_field_of_view_angles[1]),
203febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                        ToRad(view_params.left_eye_field_of_view_angles[0]),
204febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                        ToRad(view_params.left_eye_field_of_view_angles[2]),
20576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                        ToRad(view_params.left_eye_field_of_view_angles[3]));
20676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
20776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
20876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::shared_ptr<ColorChannelDistortion> red_distortion;
20976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::shared_ptr<ColorChannelDistortion> green_distortion;
21076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::shared_ptr<ColorChannelDistortion> blue_distortion;
21176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
2129d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  // We should always have a red distortion.
21376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  LOG_FATAL_IF(view_params.distortion_coefficients_r.empty());
21476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  red_distortion = std::make_shared<PolynomialRadialDistortion>(
21576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      view_params.distortion_coefficients_r);
21676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
21776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (!view_params.distortion_coefficients_g.empty()) {
21876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    green_distortion = std::make_shared<PolynomialRadialDistortion>(
2199d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        view_params.distortion_coefficients_g);
2209d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  }
2219d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2229d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  if (!view_params.distortion_coefficients_b.empty()) {
22376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    blue_distortion = std::make_shared<PolynomialRadialDistortion>(
2249d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        view_params.distortion_coefficients_b);
2259d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  }
22676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
227d07fb882f84e9fa7b758870261747456f2752ba5Jesse Wilson  HeadMountMetrics::EyeOrientation left_orientation =
228d07fb882f84e9fa7b758870261747456f2752ba5Jesse Wilson      HeadMountMetrics::EyeOrientation::kCCW0Degrees;
229d07fb882f84e9fa7b758870261747456f2752ba5Jesse Wilson  HeadMountMetrics::EyeOrientation right_orientation =
23076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      HeadMountMetrics::EyeOrientation::kCCW0Degrees;
23176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
23276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (view_params.eye_orientations.size() > 1) {
23376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    left_orientation = static_cast<HeadMountMetrics::EyeOrientation>(
23476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        view_params.eye_orientations[0]);
23576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    right_orientation = static_cast<HeadMountMetrics::EyeOrientation>(
23676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        view_params.eye_orientations[1]);
23776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
23876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
23976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  HeadMountMetrics head_mount_metrics(
24076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      view_params.inter_lens_distance, view_params.tray_to_lens_distance,
2411ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson      view_params.screen_to_lens_distance,
2421ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson      static_cast<HeadMountMetrics::VerticalAlignment>(
2431ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson          view_params.vertical_alignment),
2441ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson      left, right, red_distortion, green_distortion, blue_distortion,
2451ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson      left_orientation, right_orientation,
2461ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson      view_params.screen_center_to_lens_distance);
2471ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
2481ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  compositor->UpdateHeadMountMetrics(head_mount_metrics);
2491ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson}
2501ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
2511ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson// Calls the message handler for the DisplaySurface associated with this
2521ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson// channel.
2531ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilsonint DisplayService::HandleSurfaceMessage(pdx::Message& message) {
2541ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  auto surface = std::static_pointer_cast<SurfaceChannel>(message.GetChannel());
2551ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  ALOGW_IF(!surface,
2561ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson           "DisplayService::HandleSurfaceMessage: surface is nullptr!");
2571ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
2581ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  if (surface)
2591ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    return surface->HandleMessage(message);
2601ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  else
2611ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    REPLY_ERROR_RETURN(message, EINVAL, 0);
2621ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson}
2631ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
2641ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilsonstd::shared_ptr<DisplaySurface> DisplayService::GetDisplaySurface(
2651ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    int surface_id) const {
266eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson  return std::static_pointer_cast<DisplaySurface>(GetChannel(surface_id));
267eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson}
268eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
269eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilsonstd::vector<std::shared_ptr<DisplaySurface>>
270eb97c0ddc063176c26065fc6855188edf0c16e03Jesse WilsonDisplayService::GetDisplaySurfaces() const {
271eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson  return GetChannels<DisplaySurface>();
272eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson}
27376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
27476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonstd::vector<std::shared_ptr<DisplaySurface>>
27576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse WilsonDisplayService::GetVisibleDisplaySurfaces() const {
27676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::vector<std::shared_ptr<DisplaySurface>> visible_surfaces;
27776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
27876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  ForEachDisplaySurface(
27976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      [&](const std::shared_ptr<DisplaySurface>& surface) mutable {
28076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        if (surface->IsVisible())
28176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson          visible_surfaces.push_back(surface);
28276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      });
28376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
28476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return visible_surfaces;
28576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
28676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
28776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonint DisplayService::UpdateActiveDisplaySurfaces() {
28876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  auto visible_surfaces = GetVisibleDisplaySurfaces();
28976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
29076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // Sort the surfaces based on manager z order first, then client z order.
29176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  std::sort(visible_surfaces.begin(), visible_surfaces.end(),
29276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            [](const std::shared_ptr<DisplaySurface>& a,
29376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson               const std::shared_ptr<DisplaySurface>& b) {
29476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson              return a->manager_z_order() != b->manager_z_order()
29576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                         ? a->manager_z_order() < b->manager_z_order()
29676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                         : a->client_z_order() < b->client_z_order();
29776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            });
29876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
29976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  ALOGD_IF(TRACE,
30076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           "DisplayService::UpdateActiveDisplaySurfaces: %zd visible surfaces",
30176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson           visible_surfaces.size());
30276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
30376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  // TODO(jbates) Have the shell manage blurred layers.
30476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  bool blur_requested = false;
3051ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson  auto end = visible_surfaces.crend();
30676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  for (auto it = visible_surfaces.crbegin(); it != end; ++it) {
3071ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    auto surface = *it;
3089d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    // Surfaces with exclude_from_blur==true are not blurred
3091ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    // and are excluded from blur computation of other layers.
3101ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    if (surface->client_exclude_from_blur()) {
31176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      surface->ManagerSetBlur(0.0f);
31276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      continue;
31376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
31476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    surface->ManagerSetBlur(blur_requested ? 1.0f : 0.0f);
31576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    if (surface->client_blur_behind())
31676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson      blur_requested = true;
31776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  }
31876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  return hardware_composer_.SetDisplaySurfaces(std::move(visible_surfaces));
3199d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson}
3201ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
32176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonvoid DisplayService::OnHardwareComposerRefresh() {
32276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  hardware_composer_.OnHardwareComposerRefresh();
32376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
32476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
32576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonvoid DisplayService::SetDisplayConfigurationUpdateNotifier(
32676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    DisplayConfigurationUpdateNotifier update_notifier) {
3279d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson  update_notifier_ = update_notifier;
3289d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson}
32976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
33076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonvoid DisplayService::NotifyDisplayConfigurationUpdate() {
33176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson  if (update_notifier_)
33276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    update_notifier_();
33376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
33476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
335eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson}  // namespace dvr
33676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}  // namespace android
33776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson