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