OSDN Git Service

Force vrhwc/wm to report the native resolution
[android-x86/frameworks-native.git] / services / vr / vr_window_manager / hwc_callback.cpp
1 #include "hwc_callback.h"
2
3 #include <android-base/unique_fd.h>
4 #include <log/log.h>
5 #include <private/dvr/native_buffer.h>
6 #include <sync/sync.h>
7 #include <ui/GraphicBufferMapper.h>
8
9 namespace android {
10 namespace dvr {
11
12 namespace {
13
14 HwcCallback::FrameStatus GetFrameStatus(const HwcCallback::Frame& frame) {
15   for (const auto& layer : frame.layers()) {
16     // If there is no fence it means the buffer is already finished.
17     if (layer.fence->isValid()) {
18       status_t result = layer.fence->wait(0);
19       if (result != OK) {
20         if (result != -ETIME) {
21           ALOGE("fence wait on buffer fence failed. status=%d (%s).",
22                 result, strerror(-result));
23           return HwcCallback::FrameStatus::kError;
24         }
25         return HwcCallback::FrameStatus::kUnfinished;
26       }
27     }
28   }
29
30   return HwcCallback::FrameStatus::kFinished;
31 }
32
33 }  // namespace
34
35 HwcCallback::HwcCallback(Client* client) : client_(client) {
36 }
37
38 HwcCallback::~HwcCallback() {
39 }
40
41 base::unique_fd HwcCallback::OnNewFrame(const ComposerView::Frame& display_frame) {
42   auto& frame = display_frame.layers;
43   std::vector<HwcLayer> hwc_frame(frame.size());
44
45   for (size_t i = 0; i < frame.size(); ++i) {
46     hwc_frame[i] = HwcLayer{
47       .fence = frame[i].fence,
48       .buffer = frame[i].buffer,
49       .crop = frame[i].crop,
50       .display_frame = frame[i].display_frame,
51       .blending = static_cast<int32_t>(frame[i].blend_mode),
52       .appid = frame[i].app_id,
53       .type = static_cast<HwcLayer::LayerType>(frame[i].type),
54       .alpha = frame[i].alpha,
55     };
56   }
57
58   return client_->OnFrame(std::make_unique<Frame>(
59       std::move(hwc_frame), display_frame.display_id, display_frame.removed));
60 }
61
62 HwcCallback::Frame::Frame(std::vector<HwcLayer>&& layers, uint32_t display_id,
63                           bool removed)
64     : display_id_(display_id), removed_(removed), layers_(std::move(layers)) {}
65
66 HwcCallback::FrameStatus HwcCallback::Frame::Finish() {
67   if (status_ == FrameStatus::kUnfinished)
68     status_ = GetFrameStatus(*this);
69   return status_;
70 }
71
72 }  // namespace dvr
73 }  // namespace android