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