blob: a8a847664fa43f38a997e4338eb0e7faf6aec401 [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>
Corey Tabaka2251d822017-04-20 16:04:07 -070015#include <log/log.h>
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080016#include <private/dvr/display_client.h>
Suren Baghdasaryancd829052018-11-02 19:15:37 -070017#include <processgroup/sched_policy.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
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080021#include <functional>
22
23#include "DisplayHardware/ComposerHal.h"
24#include "display_manager_service.h"
25#include "display_service.h"
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080026
27namespace android {
28namespace dvr {
29
Steven Thomas050b2c82017-03-06 11:45:16 -080030std::unique_ptr<VrFlinger> VrFlinger::Create(
Steven Thomas6e8f7062017-11-22 14:15:29 -080031 Hwc2::Composer* hidl, hwc2_display_t primary_display_id,
32 RequestDisplayCallback request_display_callback) {
Steven Thomas050b2c82017-03-06 11:45:16 -080033 std::unique_ptr<VrFlinger> vr_flinger(new VrFlinger);
Steven Thomas6e8f7062017-11-22 14:15:29 -080034 if (vr_flinger->Init(hidl, primary_display_id, request_display_callback))
Steven Thomas050b2c82017-03-06 11:45:16 -080035 return vr_flinger;
36 else
37 return nullptr;
38}
39
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080040VrFlinger::VrFlinger() {}
41
Steven Thomas050b2c82017-03-06 11:45:16 -080042VrFlinger::~VrFlinger() {
43 if (persistent_vr_state_callback_.get()) {
44 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
45 defaultServiceManager()->checkService(String16("vrmanager")));
46 if (vr_manager.get()) {
47 vr_manager->unregisterPersistentVrStateListener(
48 persistent_vr_state_callback_);
49 }
50 }
51
52 if (dispatcher_)
53 dispatcher_->SetCanceled(true);
54 if (dispatcher_thread_.joinable())
55 dispatcher_thread_.join();
56}
57
58bool VrFlinger::Init(Hwc2::Composer* hidl,
Steven Thomas6e8f7062017-11-22 14:15:29 -080059 hwc2_display_t primary_display_id,
Steven Thomas050b2c82017-03-06 11:45:16 -080060 RequestDisplayCallback request_display_callback) {
61 if (!hidl || !request_display_callback)
62 return false;
Hendrik Wagenaarae2d58b2017-02-06 08:48:24 -080063
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080064 std::shared_ptr<android::pdx::Service> service;
65
66 ALOGI("Starting up VrFlinger...");
67
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080068 // We need to be able to create endpoints with full perms.
69 umask(0000);
70
71 android::ProcessState::self()->startThreadPool();
72
Steven Thomas050b2c82017-03-06 11:45:16 -080073 request_display_callback_ = request_display_callback;
74
Alex Vakulenko5a244ed2017-06-09 16:29:04 -070075 dispatcher_ = android::pdx::ServiceDispatcher::Create();
Steven Thomas050b2c82017-03-06 11:45:16 -080076 CHECK_ERROR(!dispatcher_, error, "Failed to create service dispatcher.");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080077
Steven Thomas6e8f7062017-11-22 14:15:29 -080078 display_service_ = android::dvr::DisplayService::Create(
79 hidl, primary_display_id, request_display_callback);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080080 CHECK_ERROR(!display_service_, error, "Failed to create display service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080081 dispatcher_->AddService(display_service_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080082
83 service = android::dvr::DisplayManagerService::Create(display_service_);
84 CHECK_ERROR(!service, error, "Failed to create display manager service.");
Steven Thomas050b2c82017-03-06 11:45:16 -080085 dispatcher_->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080086
Steven Thomas050b2c82017-03-06 11:45:16 -080087 dispatcher_thread_ = std::thread([this]() {
88 prctl(PR_SET_NAME, reinterpret_cast<unsigned long>("VrDispatch"), 0, 0, 0);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080089 ALOGI("Entering message loop.");
90
Corey Tabakab3732f02017-09-16 00:58:54 -070091 setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
92 set_sched_policy(0, SP_FOREGROUND);
93
Steven Thomas050b2c82017-03-06 11:45:16 -080094 int ret = dispatcher_->EnterDispatchLoop();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080095 if (ret < 0) {
96 ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
97 }
98 });
99
Steven Thomas050b2c82017-03-06 11:45:16 -0800100 return true;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800101
102error:
Steven Thomas050b2c82017-03-06 11:45:16 -0800103 return false;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800104}
105
Steven Thomas050b2c82017-03-06 11:45:16 -0800106void VrFlinger::OnBootFinished() {
Steven Thomasaf336272018-01-04 17:36:47 -0800107 display_service_->OnBootFinished();
Steven Thomas050b2c82017-03-06 11:45:16 -0800108 sp<IVrManager> vr_manager = interface_cast<IVrManager>(
109 defaultServiceManager()->checkService(String16("vrmanager")));
110 if (vr_manager.get()) {
111 persistent_vr_state_callback_ =
112 new PersistentVrStateCallback(request_display_callback_);
113 vr_manager->registerPersistentVrStateListener(
114 persistent_vr_state_callback_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800115 } else {
Steven Thomas050b2c82017-03-06 11:45:16 -0800116 ALOGE("Unable to register vr flinger for persistent vr mode changes");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800117 }
118}
119
Steven Thomas050b2c82017-03-06 11:45:16 -0800120void VrFlinger::GrantDisplayOwnership() {
121 display_service_->GrantDisplayOwnership();
122}
123
124void VrFlinger::SeizeDisplayOwnership() {
125 display_service_->SeizeDisplayOwnership();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800126}
127
Karthik Ravi Shankar171155a2017-06-28 15:40:24 -0700128std::string VrFlinger::Dump() {
129 // TODO(karthikrs): Add more state information here.
130 return display_service_->DumpState(0/*unused*/);
131}
132
Steven Thomas050b2c82017-03-06 11:45:16 -0800133void VrFlinger::PersistentVrStateCallback::onPersistentVrStateChanged(
134 bool enabled) {
135 ALOGV("Notified persistent vr mode is %s", enabled ? "on" : "off");
Corey Tabaka2251d822017-04-20 16:04:07 -0700136 // TODO(eieio): Determine the correct signal to request display control.
137 // Persistent VR mode is not enough.
138 // request_display_callback_(enabled);
Steven Thomas3cfac282017-02-06 12:29:30 -0800139}
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800140} // namespace dvr
141} // namespace android