blob: 21226dba8b1dfb385362678e63b610e7d788ba20 [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>
14#include <log/log.h>
15#include <cutils/properties.h>
16#include <cutils/sched_policy.h>
17#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"
28#include "screenshot_service.h"
29#include "vsync_service.h"
30
31namespace android {
32namespace dvr {
33
Steven Thomas050b2c82017-03-06 11:45:16 -080034std::unique_ptr<VrFlinger> VrFlinger::Create(
35 Hwc2::Composer* hidl, RequestDisplayCallback request_display_callback) {
36 std::unique_ptr<VrFlinger> vr_flinger(new VrFlinger);
37 if (vr_flinger->Init(hidl, request_display_callback))
38 return vr_flinger;
39 else
40 return nullptr;
41}
42
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080043VrFlinger::VrFlinger() {}
44
Steven Thomas050b2c82017-03-06 11:45:16 -080045VrFlinger::~VrFlinger() {
46 if (persistent_vr_state_callback_.get()) {
47 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
48 defaultServiceManager()->checkService(String16("vrmanager")));
49 if (vr_manager.get()) {
50 vr_manager->unregisterPersistentVrStateListener(
51 persistent_vr_state_callback_);
52 }
53 }
54
55 if (dispatcher_)
56 dispatcher_->SetCanceled(true);
57 if (dispatcher_thread_.joinable())
58 dispatcher_thread_.join();
59}
60
61bool VrFlinger::Init(Hwc2::Composer* hidl,
62 RequestDisplayCallback request_display_callback) {
63 if (!hidl || !request_display_callback)
64 return false;
Hendrik Wagenaarae2d58b2017-02-06 08:48:24 -080065
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080066 std::shared_ptr<android::pdx::Service> service;
67
68 ALOGI("Starting up VrFlinger...");
69
70 setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
71 set_sched_policy(0, SP_FOREGROUND);
72
73 // We need to be able to create endpoints with full perms.
74 umask(0000);
75
76 android::ProcessState::self()->startThreadPool();
77
Steven Thomas050b2c82017-03-06 11:45:16 -080078 request_display_callback_ = request_display_callback;
79
80 dispatcher_ =
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080081 android::pdx::default_transport::ServiceDispatcher::Create();
Steven Thomas050b2c82017-03-06 11:45:16 -080082 CHECK_ERROR(!dispatcher_, error, "Failed to create service dispatcher.");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080083
84 display_service_ = android::dvr::DisplayService::Create(hidl);
85 CHECK_ERROR(!display_service_, error, "Failed to create display service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080086 dispatcher_->AddService(display_service_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080087
88 service = android::dvr::DisplayManagerService::Create(display_service_);
89 CHECK_ERROR(!service, error, "Failed to create display manager service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080090 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080091
92 service = android::dvr::ScreenshotService::Create();
93 CHECK_ERROR(!service, error, "Failed to create screenshot service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080094 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080095
96 service = android::dvr::VSyncService::Create();
97 CHECK_ERROR(!service, error, "Failed to create vsync service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080098 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080099
100 display_service_->SetVSyncCallback(
101 std::bind(&android::dvr::VSyncService::VSyncEvent,
102 std::static_pointer_cast<android::dvr::VSyncService>(service),
103 std::placeholders::_1, std::placeholders::_2,
104 std::placeholders::_3, std::placeholders::_4));
105
Steven Thomas050b2c82017-03-06 11:45:16 -0800106 dispatcher_thread_ = std::thread([this]() {
107 prctl(PR_SET_NAME, reinterpret_cast<unsigned long>("VrDispatch"), 0, 0, 0);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800108 ALOGI("Entering message loop.");
109
Steven Thomas050b2c82017-03-06 11:45:16 -0800110 int ret = dispatcher_->EnterDispatchLoop();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800111 if (ret < 0) {
112 ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
113 }
114 });
115
Steven Thomas050b2c82017-03-06 11:45:16 -0800116 return true;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800117
118error:
Steven Thomas050b2c82017-03-06 11:45:16 -0800119 return false;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800120}
121
Steven Thomas050b2c82017-03-06 11:45:16 -0800122void VrFlinger::OnBootFinished() {
123 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
124 defaultServiceManager()->checkService(String16("vrmanager")));
125 if (vr_manager.get()) {
126 persistent_vr_state_callback_ =
127 new PersistentVrStateCallback(request_display_callback_);
128 vr_manager->registerPersistentVrStateListener(
129 persistent_vr_state_callback_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800130 } else {
Steven Thomas050b2c82017-03-06 11:45:16 -0800131 ALOGE("Unable to register vr flinger for persistent vr mode changes");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800132 }
133}
134
Steven Thomas050b2c82017-03-06 11:45:16 -0800135void VrFlinger::GrantDisplayOwnership() {
136 display_service_->GrantDisplayOwnership();
137}
138
139void VrFlinger::SeizeDisplayOwnership() {
140 display_service_->SeizeDisplayOwnership();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800141}
142
Steven Thomas3cfac282017-02-06 12:29:30 -0800143void VrFlinger::OnHardwareComposerRefresh() {
Steven Thomas050b2c82017-03-06 11:45:16 -0800144 display_service_->OnHardwareComposerRefresh();
145}
146
147void VrFlinger::PersistentVrStateCallback::onPersistentVrStateChanged(
148 bool enabled) {
149 ALOGV("Notified persistent vr mode is %s", enabled ? "on" : "off");
150 request_display_callback_(enabled);
Steven Thomas3cfac282017-02-06 12:29:30 -0800151}
152
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800153} // namespace dvr
154} // namespace android