1 /*
2 * Copyright (C) 2021 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 <aidlcommonsupport/NativeHandle.h>
18
19 #include "ResourceManager.h"
20 #include "TranslateHwcAidl.h"
21
22 using android::hardware::graphics::composer::V2_1::Display;
23 using android::hardware::graphics::composer::V2_1::Error;
24 using android::hardware::graphics::composer::V2_1::Layer;
25
26 namespace aidl::android::hardware::graphics::composer3::impl {
27
create()28 std::unique_ptr<IResourceManager> IResourceManager::create() {
29 return std::make_unique<ResourceManager>();
30 }
31
createReleaser(bool isBuffer)32 std::unique_ptr<IBufferReleaser> ResourceManager::createReleaser(bool isBuffer) {
33 return std::make_unique<BufferReleaser>(isBuffer);
34 }
35
clear(RemoveDisplay removeDisplay)36 void ResourceManager::clear(RemoveDisplay removeDisplay) {
37 mResources->clear([removeDisplay](Display hwcDisplay, bool isVirtual,
38 const std::vector<Layer> hwcLayers) {
39 int64_t display;
40 std::vector<int64_t> layers;
41 h2a::translate(hwcDisplay, display);
42 h2a::translate(hwcLayers, layers);
43
44 removeDisplay(display, isVirtual, layers);
45 });
46 }
47
hasDisplay(int64_t display)48 bool ResourceManager::hasDisplay(int64_t display) {
49 Display hwcDisplay;
50 a2h::translate(display, hwcDisplay);
51
52 return mResources->hasDisplay(hwcDisplay);
53 }
54
addPhysicalDisplay(int64_t display)55 int32_t ResourceManager::addPhysicalDisplay(int64_t display) {
56 Display hwcDisplay;
57 a2h::translate(display, hwcDisplay);
58
59 Error hwcErr = mResources->addPhysicalDisplay(hwcDisplay);
60
61 int32_t err;
62 h2a::translate(hwcErr, err);
63 return err;
64 }
65
66
addVirtualDisplay(int64_t display,uint32_t outputBufferCacheSize)67 int32_t ResourceManager::addVirtualDisplay(int64_t display, uint32_t outputBufferCacheSize) {
68 Display hwcDisplay;
69 a2h::translate(display, hwcDisplay);
70
71 Error hwcErr = mResources->addVirtualDisplay(hwcDisplay, outputBufferCacheSize);
72
73 int32_t err;
74 h2a::translate(hwcErr, err);
75 return err;
76 }
77
removeDisplay(int64_t display)78 int32_t ResourceManager::removeDisplay(int64_t display) {
79 Display hwcDisplay;
80 a2h::translate(display, hwcDisplay);
81
82 Error hwcErr = mResources->removeDisplay(hwcDisplay);
83
84 int32_t err;
85 h2a::translate(hwcErr, err);
86 return err;
87 }
88
setDisplayClientTargetCacheSize(int64_t display,uint32_t clientTargetCacheSize)89 int32_t ResourceManager::setDisplayClientTargetCacheSize(int64_t display,
90 uint32_t clientTargetCacheSize) {
91 Display hwcDisplay;
92 a2h::translate(display, hwcDisplay);
93
94 Error hwcErr = mResources->setDisplayClientTargetCacheSize(hwcDisplay, clientTargetCacheSize);
95
96 int32_t err;
97 h2a::translate(hwcErr, err);
98 return err;
99 }
100
getDisplayClientTargetCacheSize(int64_t display,size_t * outCacheSize)101 int32_t ResourceManager::getDisplayClientTargetCacheSize(int64_t display, size_t* outCacheSize) {
102 Display hwcDisplay;
103 a2h::translate(display, hwcDisplay);
104
105 Error hwcErr = mResources->getDisplayClientTargetCacheSize(hwcDisplay, outCacheSize);
106
107 int32_t err;
108 h2a::translate(hwcErr, err);
109 return err;
110 }
111
getDisplayOutputBufferCacheSize(int64_t display,size_t * outCacheSize)112 int32_t ResourceManager::getDisplayOutputBufferCacheSize(int64_t display, size_t* outCacheSize) {
113 Display hwcDisplay;
114 a2h::translate(display, hwcDisplay);
115
116 Error hwcErr = mResources->getDisplayOutputBufferCacheSize(hwcDisplay, outCacheSize);
117
118 int32_t err;
119 h2a::translate(hwcErr, err);
120 return err;
121 }
122
addLayer(int64_t display,int64_t layer,uint32_t bufferCacheSize)123 int32_t ResourceManager::addLayer(int64_t display, int64_t layer, uint32_t bufferCacheSize) {
124 Display hwcDisplay;
125 Layer hwcLayer;
126
127 a2h::translate(display, hwcDisplay);
128 a2h::translate(layer, hwcLayer);
129
130 Error hwcErr = mResources->addLayer(hwcDisplay, hwcLayer, bufferCacheSize);
131
132 int32_t err;
133 h2a::translate(hwcErr, err);
134 return err;
135 }
136
removeLayer(int64_t display,int64_t layer)137 int32_t ResourceManager::removeLayer(int64_t display, int64_t layer) {
138 Display hwcDisplay;
139 Layer hwcLayer;
140
141 a2h::translate(display, hwcDisplay);
142 a2h::translate(layer, hwcLayer);
143 Error hwcErr = mResources->removeLayer(hwcDisplay, hwcLayer);
144
145 int32_t err;
146 h2a::translate(hwcErr, err);
147 return err;
148 }
149
setDisplayMustValidateState(int64_t display,bool mustValidate)150 void ResourceManager::setDisplayMustValidateState(int64_t display, bool mustValidate) {
151 Display hwcDisplay;
152 a2h::translate(display, hwcDisplay);
153
154 mResources->setDisplayMustValidateState(hwcDisplay, mustValidate);
155 }
156
mustValidateDisplay(int64_t display)157 bool ResourceManager::mustValidateDisplay(int64_t display) {
158 Display hwcDisplay;
159 a2h::translate(display, hwcDisplay);
160
161 return mResources->mustValidateDisplay(hwcDisplay);
162 }
163
getDisplayReadbackBuffer(int64_t display,const buffer_handle_t handle,buffer_handle_t & outHandle,IBufferReleaser * bufReleaser)164 int32_t ResourceManager::getDisplayReadbackBuffer(int64_t display, const buffer_handle_t handle,
165 buffer_handle_t& outHandle,
166 IBufferReleaser* bufReleaser) {
167 Display hwcDisplay;
168 a2h::translate(display, hwcDisplay);
169
170 // dynamic_cast is not available
171 auto br = static_cast<BufferReleaser*>(bufReleaser);
172 Error hwcErr = mResources->getDisplayReadbackBuffer(hwcDisplay, handle, &outHandle,
173 br->getReplacedHandle());
174
175 int32_t err;
176 h2a::translate(hwcErr, err);
177 return err;
178 }
179
getDisplayClientTarget(int64_t display,uint32_t slot,bool fromCache,const buffer_handle_t handle,buffer_handle_t & outHandle,IBufferReleaser * bufReleaser)180 int32_t ResourceManager::getDisplayClientTarget(int64_t display, uint32_t slot, bool fromCache,
181 const buffer_handle_t handle,
182 buffer_handle_t& outHandle,
183 IBufferReleaser* bufReleaser) {
184 Display hwcDisplay;
185 a2h::translate(display, hwcDisplay);
186
187 auto br = static_cast<BufferReleaser*>(bufReleaser);
188 Error hwcErr = mResources->getDisplayClientTarget(hwcDisplay, slot, fromCache, handle,
189 &outHandle, br->getReplacedHandle());
190
191 int32_t err;
192 h2a::translate(hwcErr, err);
193 return err;
194 }
195
getDisplayOutputBuffer(int64_t display,uint32_t slot,bool fromCache,const buffer_handle_t handle,buffer_handle_t & outHandle,IBufferReleaser * bufReleaser)196 int32_t ResourceManager::getDisplayOutputBuffer(int64_t display, uint32_t slot, bool fromCache,
197 const buffer_handle_t handle,
198 buffer_handle_t& outHandle,
199 IBufferReleaser* bufReleaser) {
200 Display hwcDisplay;
201 a2h::translate(display, hwcDisplay);
202
203 auto br = static_cast<BufferReleaser*>(bufReleaser);
204 Error hwcErr = mResources->getDisplayOutputBuffer(hwcDisplay, slot, fromCache, handle,
205 &outHandle, br->getReplacedHandle());
206
207 int32_t err;
208 h2a::translate(hwcErr, err);
209 return err;
210 }
211
getLayerBuffer(int64_t display,int64_t layer,uint32_t slot,bool fromCache,const buffer_handle_t rawHandle,buffer_handle_t & outBufferHandle,IBufferReleaser * bufReleaser)212 int32_t ResourceManager::getLayerBuffer(int64_t display, int64_t layer, uint32_t slot,
213 bool fromCache, const buffer_handle_t rawHandle,
214 buffer_handle_t& outBufferHandle,
215 IBufferReleaser* bufReleaser) {
216 Display hwcDisplay;
217 a2h::translate(display, hwcDisplay);
218
219 Layer hwcLayer;
220 a2h::translate(layer, hwcLayer);
221
222 auto br = static_cast<BufferReleaser*>(bufReleaser);
223 Error hwcErr = mResources->getLayerBuffer(hwcDisplay, hwcLayer, slot, fromCache,
224 rawHandle, &outBufferHandle,
225 br->getReplacedHandle());
226
227 int32_t err;
228 h2a::translate(hwcErr, err);
229 return err;
230 }
231
getLayerSidebandStream(int64_t display,int64_t layer,const buffer_handle_t rawHandle,buffer_handle_t & outStreamHandle,IBufferReleaser * bufReleaser)232 int32_t ResourceManager::getLayerSidebandStream(int64_t display, int64_t layer,
233 const buffer_handle_t rawHandle,
234 buffer_handle_t& outStreamHandle,
235 IBufferReleaser* bufReleaser) {
236 Display hwcDisplay;
237 a2h::translate(display, hwcDisplay);
238
239 Layer hwcLayer;
240 a2h::translate(layer, hwcLayer);
241
242 auto br = static_cast<BufferReleaser*>(bufReleaser);
243 Error hwcErr = mResources->getLayerSidebandStream(hwcDisplay, hwcLayer, rawHandle,
244 &outStreamHandle, br->getReplacedHandle());
245
246 int32_t err;
247 h2a::translate(hwcErr, err);
248 return err;
249 }
250
251 } // namespace aidl::android::hardware::graphics::composer3::impl
252