vr_flinger.cpp revision a8a92784bc5f6a50ce00311c6161fbcfc0898c5a
1#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
34int VrFlinger::Run(Hwc2::Composer* hidl) {
35  std::shared_ptr<android::pdx::Service> service;
36
37  ALOGI("Starting up VrFlinger...");
38
39  setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
40  set_sched_policy(0, SP_FOREGROUND);
41
42  // We need to be able to create endpoints with full perms.
43  umask(0000);
44
45  android::ProcessState::self()->startThreadPool();
46
47  std::shared_ptr<android::pdx::ServiceDispatcher> dispatcher =
48      android::pdx::default_transport::ServiceDispatcher::Create();
49  CHECK_ERROR(!dispatcher, error, "Failed to create service dispatcher.");
50
51  display_service_ = android::dvr::DisplayService::Create(hidl);
52  CHECK_ERROR(!display_service_, error, "Failed to create display service.");
53  dispatcher->AddService(display_service_);
54
55  service = android::dvr::DisplayManagerService::Create(display_service_);
56  CHECK_ERROR(!service, error, "Failed to create display manager service.");
57  dispatcher->AddService(service);
58
59  service = android::dvr::ScreenshotService::Create();
60  CHECK_ERROR(!service, error, "Failed to create screenshot service.");
61  dispatcher->AddService(service);
62
63  service = android::dvr::VSyncService::Create();
64  CHECK_ERROR(!service, error, "Failed to create vsync service.");
65  dispatcher->AddService(service);
66
67  display_service_->SetVSyncCallback(
68      std::bind(&android::dvr::VSyncService::VSyncEvent,
69                std::static_pointer_cast<android::dvr::VSyncService>(service),
70                std::placeholders::_1, std::placeholders::_2,
71                std::placeholders::_3, std::placeholders::_4));
72
73  displayd_thread_ = std::thread([this, dispatcher]() {
74    ALOGI("Entering message loop.");
75
76    int ret = dispatcher->EnterDispatchLoop();
77    if (ret < 0) {
78      ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
79    }
80  });
81
82  return NO_ERROR;
83
84error:
85  display_service_.reset();
86
87  return -1;
88}
89
90void VrFlinger::EnterVrMode() {
91  if (display_service_) {
92    display_service_->SetActive(true);
93  } else {
94    ALOGE("Failed to enter VR mode : Display service is not started.");
95  }
96}
97
98void VrFlinger::ExitVrMode() {
99  if (display_service_) {
100    display_service_->SetActive(false);
101  } else {
102    ALOGE("Failed to exit VR mode : Display service is not started.");
103  }
104}
105
106}  // namespace dvr
107}  // namespace android
108