1 #include "hwc_callback.h"
3 #include <android-base/unique_fd.h>
5 #include <private/dvr/native_buffer.h>
7 #include <ui/GraphicBufferMapper.h>
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);
20 if (result != -ETIME) {
21 ALOGE("fence wait on buffer fence failed. status=%d (%s).",
22 result, strerror(-result));
23 return HwcCallback::FrameStatus::kError;
25 return HwcCallback::FrameStatus::kUnfinished;
30 return HwcCallback::FrameStatus::kFinished;
35 HwcCallback::HwcCallback(Client* client) : client_(client) {
38 HwcCallback::~HwcCallback() {
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());
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,
58 return client_->OnFrame(std::make_unique<Frame>(
59 std::move(hwc_frame), display_frame.display_id, display_frame.removed));
62 HwcCallback::Frame::Frame(std::vector<HwcLayer>&& layers, uint32_t display_id,
64 : display_id_(display_id), removed_(removed), layers_(std::move(layers)) {}
66 HwcCallback::FrameStatus HwcCallback::Frame::Finish() {
67 if (status_ == FrameStatus::kUnfinished)
68 status_ = GetFrameStatus(*this);
73 } // namespace android