blob: 9163e71f793260501dd5fb42e6b05b44c93f2eee [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
12#include <binder/ProcessState.h>
13#include <log/log.h>
14#include <cutils/properties.h>
15#include <cutils/sched_policy.h>
16#include <private/dvr/display_client.h>
17#include <sys/resource.h>
18
19#include <pdx/default_transport/service_dispatcher.h>
20
21#include <functional>
22
23#include "DisplayHardware/ComposerHal.h"
24#include "display_manager_service.h"
25#include "display_service.h"
26#include "screenshot_service.h"
27#include "vsync_service.h"
28
29namespace android {
30namespace dvr {
31
32VrFlinger::VrFlinger() {}
33
Jin Qian7480c062017-03-21 00:04:15 +000034int VrFlinger::Run(Hwc2::Composer* hidl) {
35 if (!hidl)
36 return EINVAL;
Hendrik Wagenaarae2d58b2017-02-06 08:48:24 -080037
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080038 std::shared_ptr<android::pdx::Service> service;
39
40 ALOGI("Starting up VrFlinger...");
41
42 setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
43 set_sched_policy(0, SP_FOREGROUND);
44
45 // We need to be able to create endpoints with full perms.
46 umask(0000);
47
48 android::ProcessState::self()->startThreadPool();
49
Jin Qian7480c062017-03-21 00:04:15 +000050 std::shared_ptr<android::pdx::ServiceDispatcher> dispatcher =
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080051 android::pdx::default_transport::ServiceDispatcher::Create();
Jin Qian7480c062017-03-21 00:04:15 +000052 CHECK_ERROR(!dispatcher, error, "Failed to create service dispatcher.");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080053
54 display_service_ = android::dvr::DisplayService::Create(hidl);
55 CHECK_ERROR(!display_service_, error, "Failed to create display service.");
Jin Qian7480c062017-03-21 00:04:15 +000056 dispatcher->AddService(display_service_);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080057
58 service = android::dvr::DisplayManagerService::Create(display_service_);
59 CHECK_ERROR(!service, error, "Failed to create display manager service.");
Jin Qian7480c062017-03-21 00:04:15 +000060 dispatcher->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080061
62 service = android::dvr::ScreenshotService::Create();
63 CHECK_ERROR(!service, error, "Failed to create screenshot service.");
Jin Qian7480c062017-03-21 00:04:15 +000064 dispatcher->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080065
66 service = android::dvr::VSyncService::Create();
67 CHECK_ERROR(!service, error, "Failed to create vsync service.");
Jin Qian7480c062017-03-21 00:04:15 +000068 dispatcher->AddService(service);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080069
70 display_service_->SetVSyncCallback(
71 std::bind(&android::dvr::VSyncService::VSyncEvent,
72 std::static_pointer_cast<android::dvr::VSyncService>(service),
73 std::placeholders::_1, std::placeholders::_2,
74 std::placeholders::_3, std::placeholders::_4));
75
Jin Qian7480c062017-03-21 00:04:15 +000076 displayd_thread_ = std::thread([this, dispatcher]() {
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080077 ALOGI("Entering message loop.");
78
Jin Qian7480c062017-03-21 00:04:15 +000079 int ret = dispatcher->EnterDispatchLoop();
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080080 if (ret < 0) {
81 ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
82 }
83 });
84
Jin Qian7480c062017-03-21 00:04:15 +000085 return NO_ERROR;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080086
87error:
Jin Qian7480c062017-03-21 00:04:15 +000088 display_service_.reset();
89
90 return -1;
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080091}
92
Jin Qian7480c062017-03-21 00:04:15 +000093void VrFlinger::EnterVrMode() {
94 if (display_service_) {
95 display_service_->SetActive(true);
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080096 } else {
Jin Qian7480c062017-03-21 00:04:15 +000097 ALOGE("Failed to enter VR mode : Display service is not started.");
Alex Vakulenkoa8a92782017-01-27 14:41:57 -080098 }
99}
100
Jin Qian7480c062017-03-21 00:04:15 +0000101void VrFlinger::ExitVrMode() {
102 if (display_service_) {
103 display_service_->SetActive(false);
104 } else {
105 ALOGE("Failed to exit VR mode : Display service is not started.");
106 }
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800107}
108
Steven Thomas3cfac282017-02-06 12:29:30 -0800109void VrFlinger::OnHardwareComposerRefresh() {
Jin Qian7480c062017-03-21 00:04:15 +0000110 if (display_service_) {
111 display_service_->OnHardwareComposerRefresh();
112 } else {
113 ALOGE("OnHardwareComposerRefresh failed : Display service is not started.");
114 }
Steven Thomas3cfac282017-02-06 12:29:30 -0800115}
116
Alex Vakulenkoa8a92782017-01-27 14:41:57 -0800117} // namespace dvr
118} // namespace android