• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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