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