blob: b2dc1d86e8d4245a5ba1357ee64f09068950aca0 [file] [log] [blame]
Alex Vakulenkoa8a92782017-01-27 14:41:57 -08001#include <dvr/vr_flinger.h>
2
3#include <errno.h>
4#include <fcntl.h>
5#include <poll.h>
6#include <signal.h>
7#include <string.h>
8#include <time.h>
9#include <unistd.h>
10#include <memory>
11
Steven Thomas050b2c82017-03-06 11:45:16 -080012#include <binder/IServiceManager.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080013#include <binder/ProcessState.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080014#include <cutils/properties.h>
15#include <cutils/sched_policy.h>
Corey Tabaka2251d822017-04-20 16:04:07 -070016#include <log/log.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080017#include <private/dvr/display_client.h>
Steven Thomas050b2c82017-03-06 11:45:16 -080018#include <sys/prctl.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080019#include <sys/resource.h>
20
21#include <pdx/default_transport/service_dispatcher.h>
22
23#include <functional>
24
25#include "DisplayHardware/ComposerHal.h"
26#include "display_manager_service.h"
27#include "display_service.h"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080028#include "vsync_service.h"
29
30namespace android {
31namespace dvr {
32
Steven Thomas050b2c82017-03-06 11:45:16 -080033std::unique_ptr<VrFlinger> VrFlinger::Create(
34 Hwc2::Composer* hidl, RequestDisplayCallback request_display_callback) {
35 std::unique_ptr<VrFlinger> vr_flinger(new VrFlinger);
36 if (vr_flinger->Init(hidl, request_display_callback))
37 return vr_flinger;
38 else
39 return nullptr;
40}
41
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080042VrFlinger::VrFlinger() {}
43
Steven Thomas050b2c82017-03-06 11:45:16 -080044VrFlinger::~VrFlinger() {
45 if (persistent_vr_state_callback_.get()) {
46 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
47 defaultServiceManager()->checkService(String16("vrmanager")));
48 if (vr_manager.get()) {
49 vr_manager->unregisterPersistentVrStateListener(
50 persistent_vr_state_callback_);
51 }
52 }
53
54 if (dispatcher_)
55 dispatcher_->SetCanceled(true);
56 if (dispatcher_thread_.joinable())
57 dispatcher_thread_.join();
58}
59
60bool VrFlinger::Init(Hwc2::Composer* hidl,
61 RequestDisplayCallback request_display_callback) {
62 if (!hidl || !request_display_callback)
63 return false;
Hendrik Wagenaarae2d58b2017-02-06 08:48:24 -080064
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080065 std::shared_ptr<android::pdx::Service> service;
66
67 ALOGI("Starting up VrFlinger...");
68
69 setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
70 set_sched_policy(0, SP_FOREGROUND);
71
72 // We need to be able to create endpoints with full perms.
73 umask(0000);
74
75 android::ProcessState::self()->startThreadPool();
76
Steven Thomas050b2c82017-03-06 11:45:16 -080077 request_display_callback_ = request_display_callback;
78
Corey Tabaka2251d822017-04-20 16:04:07 -070079 dispatcher_ = android::pdx::default_transport::ServiceDispatcher::Create();
Steven Thomas050b2c82017-03-06 11:45:16 -080080 CHECK_ERROR(!dispatcher_, error, "Failed to create service dispatcher.");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080081
Corey Tabaka2251d822017-04-20 16:04:07 -070082 display_service_ =
83 android::dvr::DisplayService::Create(hidl, request_display_callback);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080084 CHECK_ERROR(!display_service_, error, "Failed to create display service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080085 dispatcher_->AddService(display_service_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080086
87 service = android::dvr::DisplayManagerService::Create(display_service_);
88 CHECK_ERROR(!service, error, "Failed to create display manager service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080089 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080090
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080091 service = android::dvr::VSyncService::Create();
92 CHECK_ERROR(!service, error, "Failed to create vsync service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080093 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080094
95 display_service_->SetVSyncCallback(
96 std::bind(&android::dvr::VSyncService::VSyncEvent,
97 std::static_pointer_cast<android::dvr::VSyncService>(service),
98 std::placeholders::_1, std::placeholders::_2,
99 std::placeholders::_3, std::placeholders::_4));
100
Steven Thomas050b2c82017-03-06 11:45:16 -0800101 dispatcher_thread_ = std::thread([this]() {
102 prctl(PR_SET_NAME, reinterpret_cast<unsigned long>("VrDispatch"), 0, 0, 0);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800103 ALOGI("Entering message loop.");
104
Steven Thomas050b2c82017-03-06 11:45:16 -0800105 int ret = dispatcher_->EnterDispatchLoop();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800106 if (ret < 0) {
107 ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
108 }
109 });
110
Steven Thomas050b2c82017-03-06 11:45:16 -0800111 return true;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800112
113error:
Steven Thomas050b2c82017-03-06 11:45:16 -0800114 return false;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800115}
116
Steven Thomas050b2c82017-03-06 11:45:16 -0800117void VrFlinger::OnBootFinished() {
118 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
119 defaultServiceManager()->checkService(String16("vrmanager")));
120 if (vr_manager.get()) {
121 persistent_vr_state_callback_ =
122 new PersistentVrStateCallback(request_display_callback_);
123 vr_manager->registerPersistentVrStateListener(
124 persistent_vr_state_callback_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800125 } else {
Steven Thomas050b2c82017-03-06 11:45:16 -0800126 ALOGE("Unable to register vr flinger for persistent vr mode changes");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800127 }
128}
129
Steven Thomas050b2c82017-03-06 11:45:16 -0800130void VrFlinger::GrantDisplayOwnership() {
131 display_service_->GrantDisplayOwnership();
132}
133
134void VrFlinger::SeizeDisplayOwnership() {
135 display_service_->SeizeDisplayOwnership();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800136}
137
Steven Thomas3cfac282017-02-06 12:29:30 -0800138void VrFlinger::OnHardwareComposerRefresh() {
Steven Thomas050b2c82017-03-06 11:45:16 -0800139 display_service_->OnHardwareComposerRefresh();
140}
141
142void VrFlinger::PersistentVrStateCallback::onPersistentVrStateChanged(
143 bool enabled) {
144 ALOGV("Notified persistent vr mode is %s", enabled ? "on" : "off");
Corey Tabaka2251d822017-04-20 16:04:07 -0700145 // TODO(eieio): Determine the correct signal to request display control.
146 // Persistent VR mode is not enough.
147 // request_display_callback_(enabled);
Steven Thomas3cfac282017-02-06 12:29:30 -0800148}
149
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800150} // namespace dvr
151} // namespace android