1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "base_composer.h"
18
19 #include <string.h>
20
21 #include <log/log.h>
22 #include <hardware/gralloc.h>
23
24 #include "common/vsoc/lib/screen_region_view.h"
25 #include "guest/hals/gralloc/legacy/gralloc_vsoc_priv.h"
26
27 using vsoc::screen::ScreenRegionView;
28
29 namespace cvd {
30
31 namespace {
32
BroadcastFrameBufferChanged(int index)33 void BroadcastFrameBufferChanged(int index) {
34 ScreenRegionView::GetInstance()->BroadcastNewFrame(
35 static_cast<uint32_t>(index));
36 }
37
38 } // namespace
39
BaseComposer(int64_t vsync_base_timestamp,int32_t vsync_period_ns)40 BaseComposer::BaseComposer(int64_t vsync_base_timestamp,
41 int32_t vsync_period_ns)
42 : vsync_base_timestamp_(vsync_base_timestamp),
43 vsync_period_ns_(vsync_period_ns),
44 fb_broadcaster_(BroadcastFrameBufferChanged) {
45 hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
46 reinterpret_cast<const hw_module_t**>(&gralloc_module_));
47 }
48
~BaseComposer()49 BaseComposer::~BaseComposer() {}
50
ReplaceFbBroadcaster(FbBroadcaster fb_broadcaster)51 FbBroadcaster BaseComposer::ReplaceFbBroadcaster(FbBroadcaster fb_broadcaster) {
52 FbBroadcaster tmp = fb_broadcaster_;
53 fb_broadcaster_ = fb_broadcaster;
54 return tmp;
55 }
56
Dump(char * buff __unused,int buff_len __unused)57 void BaseComposer::Dump(char* buff __unused, int buff_len __unused) {}
58
Broadcast(int fb_index)59 void BaseComposer::Broadcast(int fb_index) {
60 fb_broadcaster_(fb_index);
61 }
62
PostFrameBufferTarget(buffer_handle_t buffer_handle)63 int BaseComposer::PostFrameBufferTarget(buffer_handle_t buffer_handle) {
64 int fb_index = NextScreenBuffer();
65 if (fb_index < 0) {
66 ALOGE("Could not get the next buffer. Is the screen region large enough?");
67 return -1;
68 }
69 auto screen_view = ScreenRegionView::GetInstance();
70 void* frame_buffer = screen_view->GetBuffer(fb_index);
71 const private_handle_t* p_handle =
72 reinterpret_cast<const private_handle_t*>(buffer_handle);
73 void* buffer;
74 int retval = gralloc_module_->lock(gralloc_module_, buffer_handle,
75 GRALLOC_USAGE_SW_READ_OFTEN, 0, 0,
76 p_handle->x_res, p_handle->y_res, &buffer);
77 if (retval != 0) {
78 ALOGE("Got error code %d from lock function", retval);
79 return -1;
80 }
81 memcpy(frame_buffer, buffer, screen_view->buffer_size());
82 Broadcast(fb_index);
83 return 0;
84 } // namespace cvd
85
PrepareLayers(size_t num_layers,vsoc_hwc_layer * layers)86 int BaseComposer::PrepareLayers(size_t num_layers, vsoc_hwc_layer* layers) {
87 // find unsupported overlays
88 for (size_t i = 0; i < num_layers; i++) {
89 if (IS_TARGET_FRAMEBUFFER(layers[i].compositionType)) {
90 continue;
91 }
92 layers[i].compositionType = HWC_FRAMEBUFFER;
93 }
94 return 0;
95 }
96
SetLayers(size_t num_layers,vsoc_hwc_layer * layers)97 int BaseComposer::SetLayers(size_t num_layers, vsoc_hwc_layer* layers) {
98 for (size_t idx = 0; idx < num_layers; idx++) {
99 if (IS_TARGET_FRAMEBUFFER(layers[idx].compositionType)) {
100 return PostFrameBufferTarget(layers[idx].handle);
101 }
102 }
103 return -1;
104 }
105
NextScreenBuffer()106 int BaseComposer::NextScreenBuffer() {
107 int num_buffers = ScreenRegionView::GetInstance()->number_of_buffers();
108 last_frame_buffer_ =
109 num_buffers > 0 ? (last_frame_buffer_ + 1) % num_buffers : -1;
110 return last_frame_buffer_;
111 }
112
113 } // namespace cvd
114