vr_composer.cpp revision 8fc9822f3b20f6547c3398c55e8b70c4f3940db9
1#include "vr_composer.h"
2
3#include <binder/IPCThreadState.h>
4#include <binder/PermissionCache.h>
5
6namespace android {
7namespace dvr {
8namespace {
9
10bool CheckPermission() {
11  const android::IPCThreadState* ipc = android::IPCThreadState::self();
12  const pid_t pid = ipc->getCallingPid();
13  const uid_t uid = ipc->getCallingUid();
14  const bool permission = PermissionCache::checkPermission(
15      String16("android.permission.RESTRICTED_VR_ACCESS"), pid, uid);
16  if (!permission)
17    ALOGE("permission denied to pid=%d uid=%u", pid, uid);
18
19  return permission;
20}
21
22}  // namespace
23
24VrComposer::VrComposer(ComposerView* composer_view)
25  : composer_view_(composer_view) {
26  composer_view_->RegisterObserver(this);
27}
28
29VrComposer::~VrComposer() {
30  composer_view_->UnregisterObserver(this);
31}
32
33binder::Status VrComposer::registerObserver(
34    const sp<IVrComposerCallback>& callback) {
35  {
36    std::lock_guard<std::mutex> guard(mutex_);
37
38    if (!CheckPermission())
39      return binder::Status::fromStatusT(PERMISSION_DENIED);
40
41    if (callback_.get()) {
42      ALOGE("Failed to register callback, already registered");
43      return binder::Status::fromStatusT(ALREADY_EXISTS);
44    }
45
46    callback_ = callback;
47    IInterface::asBinder(callback_)->linkToDeath(this);
48  }
49
50  // Don't take the lock to force display refresh otherwise it could end in a
51  // deadlock since HWC calls this with new frames and it has a lock of its own
52  // to serialize access to the display information.
53  composer_view_->ForceDisplaysRefresh();
54  return binder::Status::ok();
55}
56
57binder::Status VrComposer::clearObserver() {
58  std::lock_guard<std::mutex> guard(mutex_);
59  callback_ = nullptr;
60  return binder::Status::ok();
61}
62
63base::unique_fd VrComposer::OnNewFrame(const ComposerView::Frame& frame) {
64  std::lock_guard<std::mutex> guard(mutex_);
65
66  if (!callback_.get())
67    return base::unique_fd();
68
69  ParcelableComposerFrame parcelable_frame(frame);
70  ParcelableUniqueFd fence;
71  binder::Status ret = callback_->onNewFrame(parcelable_frame, &fence);
72  if (!ret.isOk())
73    ALOGE("Failed to send new frame: %s", ret.toString8().string());
74
75  return fence.fence();
76}
77
78void VrComposer::binderDied(const wp<IBinder>& /* who */) {
79  std::lock_guard<std::mutex> guard(mutex_);
80
81  callback_ = nullptr;
82}
83
84}  // namespace dvr
85}  // namespace android
86