blob: 9163e71f793260501dd5fb42e6b05b44c93f2eee [file] [log] [blame]
#include <dvr/vr_flinger.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <memory>
#include <binder/ProcessState.h>
#include <log/log.h>
#include <cutils/properties.h>
#include <cutils/sched_policy.h>
#include <private/dvr/display_client.h>
#include <sys/resource.h>
#include <pdx/default_transport/service_dispatcher.h>
#include <functional>
#include "DisplayHardware/ComposerHal.h"
#include "display_manager_service.h"
#include "display_service.h"
#include "screenshot_service.h"
#include "vsync_service.h"
namespace android {
namespace dvr {
VrFlinger::VrFlinger() {}
int VrFlinger::Run(Hwc2::Composer* hidl) {
if (!hidl)
return EINVAL;
std::shared_ptr<android::pdx::Service> service;
ALOGI("Starting up VrFlinger...");
setpriority(PRIO_PROCESS, 0, android::PRIORITY_URGENT_DISPLAY);
set_sched_policy(0, SP_FOREGROUND);
// We need to be able to create endpoints with full perms.
umask(0000);
android::ProcessState::self()->startThreadPool();
std::shared_ptr<android::pdx::ServiceDispatcher> dispatcher =
android::pdx::default_transport::ServiceDispatcher::Create();
CHECK_ERROR(!dispatcher, error, "Failed to create service dispatcher.");
display_service_ = android::dvr::DisplayService::Create(hidl);
CHECK_ERROR(!display_service_, error, "Failed to create display service.");
dispatcher->AddService(display_service_);
service = android::dvr::DisplayManagerService::Create(display_service_);
CHECK_ERROR(!service, error, "Failed to create display manager service.");
dispatcher->AddService(service);
service = android::dvr::ScreenshotService::Create();
CHECK_ERROR(!service, error, "Failed to create screenshot service.");
dispatcher->AddService(service);
service = android::dvr::VSyncService::Create();
CHECK_ERROR(!service, error, "Failed to create vsync service.");
dispatcher->AddService(service);
display_service_->SetVSyncCallback(
std::bind(&android::dvr::VSyncService::VSyncEvent,
std::static_pointer_cast<android::dvr::VSyncService>(service),
std::placeholders::_1, std::placeholders::_2,
std::placeholders::_3, std::placeholders::_4));
displayd_thread_ = std::thread([this, dispatcher]() {
ALOGI("Entering message loop.");
int ret = dispatcher->EnterDispatchLoop();
if (ret < 0) {
ALOGE("Dispatch loop exited because: %s\n", strerror(-ret));
}
});
return NO_ERROR;
error:
display_service_.reset();
return -1;
}
void VrFlinger::EnterVrMode() {
if (display_service_) {
display_service_->SetActive(true);
} else {
ALOGE("Failed to enter VR mode : Display service is not started.");
}
}
void VrFlinger::ExitVrMode() {
if (display_service_) {
display_service_->SetActive(false);
} else {
ALOGE("Failed to exit VR mode : Display service is not started.");
}
}
void VrFlinger::OnHardwareComposerRefresh() {
if (display_service_) {
display_service_->OnHardwareComposerRefresh();
} else {
ALOGE("OnHardwareComposerRefresh failed : Display service is not started.");
}
}
} // namespace dvr
} // namespace android