• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 "ComposerResources.h"
18 
19 #include <aidlcommonsupport/NativeHandle.h>
20 
21 namespace aidl::android::hardware::graphics::composer3::impl {
22 namespace {
23 
toHwc3Error(::android::hardware::graphics::composer::V2_1::Error error)24 HWC3::Error toHwc3Error(
25     ::android::hardware::graphics::composer::V2_1::Error error) {
26   switch (error) {
27     case ::android::hardware::graphics::composer::V2_1::Error::NONE:
28       return HWC3::Error::None;
29     case ::android::hardware::graphics::composer::V2_1::Error::BAD_CONFIG:
30       return HWC3::Error::BadConfig;
31     case ::android::hardware::graphics::composer::V2_1::Error::BAD_DISPLAY:
32       return HWC3::Error::BadDisplay;
33     case ::android::hardware::graphics::composer::V2_1::Error::BAD_LAYER:
34       return HWC3::Error::BadLayer;
35     case ::android::hardware::graphics::composer::V2_1::Error::BAD_PARAMETER:
36       return HWC3::Error::BadParameter;
37     case ::android::hardware::graphics::composer::V2_1::Error::NO_RESOURCES:
38       return HWC3::Error::NoResources;
39     case ::android::hardware::graphics::composer::V2_1::Error::NOT_VALIDATED:
40       return HWC3::Error::NotValidated;
41     case ::android::hardware::graphics::composer::V2_1::Error::UNSUPPORTED:
42       return HWC3::Error::Unsupported;
43   }
44 }
45 
toHwc2Display(int64_t displayId)46 ::android::hardware::graphics::composer::V2_1::Display toHwc2Display(
47     int64_t displayId) {
48   return static_cast<::android::hardware::graphics::composer::V2_1::Display>(
49       displayId);
50 }
51 
toHwc2Layer(int64_t layerId)52 ::android::hardware::graphics::composer::V2_1::Layer toHwc2Layer(
53     int64_t layerId) {
54   return static_cast<::android::hardware::graphics::composer::V2_1::Layer>(
55       layerId);
56 }
57 
58 }  // namespace
59 
createReleaser(bool isBuffer)60 std::unique_ptr<ComposerResourceReleaser> ComposerResources::createReleaser(
61     bool isBuffer) {
62   return std::make_unique<ComposerResourceReleaser>(isBuffer);
63 }
64 
init()65 HWC3::Error ComposerResources::init() {
66   mImpl = ::android::hardware::graphics::composer::V2_2::hal::
67       ComposerResources::create();
68   if (!mImpl) {
69     ALOGE("%s: failed to create underlying ComposerResources.", __FUNCTION__);
70     return HWC3::Error::NoResources;
71   }
72   return HWC3::Error::None;
73 }
74 
clear(::android::hardware::graphics::composer::V2_2::hal::ComposerResources::RemoveDisplay removeDisplay)75 void ComposerResources::clear(
76     ::android::hardware::graphics::composer::V2_2::hal::ComposerResources::
77         RemoveDisplay removeDisplay) {
78   mImpl->clear(removeDisplay);
79 }
80 
hasDisplay(int64_t displayId)81 bool ComposerResources::hasDisplay(int64_t displayId) {
82   ::android::hardware::graphics::composer::V2_1::Display display =
83       toHwc2Display(displayId);
84   return mImpl->hasDisplay(display);
85 }
86 
addPhysicalDisplay(int64_t displayId)87 HWC3::Error ComposerResources::addPhysicalDisplay(int64_t displayId) {
88   DEBUG_LOG("%s: display:%" PRId64, __FUNCTION__, displayId);
89   ::android::hardware::graphics::composer::V2_1::Display display =
90       toHwc2Display(displayId);
91   return toHwc3Error(mImpl->addPhysicalDisplay(display));
92 }
93 
addVirtualDisplay(int64_t displayId,uint32_t outputBufferCacheSize)94 HWC3::Error ComposerResources::addVirtualDisplay(
95     int64_t displayId, uint32_t outputBufferCacheSize) {
96   ::android::hardware::graphics::composer::V2_1::Display display =
97       toHwc2Display(displayId);
98   return toHwc3Error(mImpl->addVirtualDisplay(display, outputBufferCacheSize));
99 }
100 
removeDisplay(int64_t displayId)101 HWC3::Error ComposerResources::removeDisplay(int64_t displayId) {
102   ::android::hardware::graphics::composer::V2_1::Display display =
103       toHwc2Display(displayId);
104   return toHwc3Error(mImpl->removeDisplay(display));
105 }
106 
setDisplayClientTargetCacheSize(int64_t displayId,uint32_t clientTargetCacheSize)107 HWC3::Error ComposerResources::setDisplayClientTargetCacheSize(
108     int64_t displayId, uint32_t clientTargetCacheSize) {
109   ::android::hardware::graphics::composer::V2_1::Display display =
110       toHwc2Display(displayId);
111   return toHwc3Error(
112       mImpl->setDisplayClientTargetCacheSize(display, clientTargetCacheSize));
113 }
114 
getDisplayClientTargetCacheSize(int64_t displayId,size_t * outCacheSize)115 HWC3::Error ComposerResources::getDisplayClientTargetCacheSize(
116     int64_t displayId, size_t* outCacheSize) {
117   ::android::hardware::graphics::composer::V2_1::Display display =
118       toHwc2Display(displayId);
119   return toHwc3Error(
120       mImpl->getDisplayClientTargetCacheSize(display, outCacheSize));
121 }
122 
getDisplayOutputBufferCacheSize(int64_t displayId,size_t * outCacheSize)123 HWC3::Error ComposerResources::getDisplayOutputBufferCacheSize(
124     int64_t displayId, size_t* outCacheSize) {
125   ::android::hardware::graphics::composer::V2_1::Display display =
126       toHwc2Display(displayId);
127   return toHwc3Error(
128       mImpl->getDisplayOutputBufferCacheSize(display, outCacheSize));
129 }
130 
addLayer(int64_t displayId,int64_t layerId,uint32_t bufferCacheSize)131 HWC3::Error ComposerResources::addLayer(int64_t displayId, int64_t layerId,
132                                         uint32_t bufferCacheSize) {
133   DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
134             layerId);
135 
136   ::android::hardware::graphics::composer::V2_1::Display display =
137       toHwc2Display(displayId);
138   ::android::hardware::graphics::composer::V2_1::Layer layer =
139       toHwc2Layer(layerId);
140   return toHwc3Error(mImpl->addLayer(display, layer, bufferCacheSize));
141 }
142 
removeLayer(int64_t displayId,int64_t layerId)143 HWC3::Error ComposerResources::removeLayer(int64_t displayId, int64_t layerId) {
144   DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
145             layerId);
146 
147   ::android::hardware::graphics::composer::V2_1::Display display =
148       toHwc2Display(displayId);
149   ::android::hardware::graphics::composer::V2_1::Layer layer =
150       toHwc2Layer(layerId);
151 
152   return toHwc3Error(mImpl->removeLayer(display, layer));
153 }
154 
setDisplayMustValidateState(int64_t displayId,bool mustValidate)155 void ComposerResources::setDisplayMustValidateState(int64_t displayId,
156                                                     bool mustValidate) {
157   ::android::hardware::graphics::composer::V2_1::Display display =
158       toHwc2Display(displayId);
159   mImpl->setDisplayMustValidateState(display, mustValidate);
160 }
161 
mustValidateDisplay(int64_t displayId)162 bool ComposerResources::mustValidateDisplay(int64_t displayId) {
163   ::android::hardware::graphics::composer::V2_1::Display display =
164       toHwc2Display(displayId);
165   return mImpl->mustValidateDisplay(display);
166 }
167 
getDisplayReadbackBuffer(int64_t displayId,const aidl::android::hardware::common::NativeHandle & handle,buffer_handle_t * outHandle,ComposerResourceReleaser * releaser)168 HWC3::Error ComposerResources::getDisplayReadbackBuffer(
169     int64_t displayId,
170     const aidl::android::hardware::common::NativeHandle& handle,
171     buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
172   ::android::hardware::graphics::composer::V2_1::Display display =
173       toHwc2Display(displayId);
174   return toHwc3Error(mImpl->getDisplayReadbackBuffer(
175       display, ::android::makeFromAidl(handle), outHandle,
176       releaser->getReplacedHandle()));
177 }
178 
getDisplayClientTarget(int64_t displayId,const Buffer & buffer,buffer_handle_t * outHandle,ComposerResourceReleaser * releaser)179 HWC3::Error ComposerResources::getDisplayClientTarget(
180     int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle,
181     ComposerResourceReleaser* releaser) {
182   ::android::hardware::graphics::composer::V2_1::Display display =
183       toHwc2Display(displayId);
184 
185   const bool useCache = !buffer.handle.has_value();
186 
187   buffer_handle_t bufferHandle = nullptr;
188   if (buffer.handle.has_value()) {
189     bufferHandle = ::android::makeFromAidl(*buffer.handle);
190   }
191 
192   return toHwc3Error(mImpl->getDisplayClientTarget(
193       display, buffer.slot, useCache, bufferHandle, outHandle,
194       releaser->getReplacedHandle()));
195 }
196 
getDisplayOutputBuffer(int64_t displayId,const Buffer & buffer,buffer_handle_t * outHandle,ComposerResourceReleaser * releaser)197 HWC3::Error ComposerResources::getDisplayOutputBuffer(
198     int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle,
199     ComposerResourceReleaser* releaser) {
200   ::android::hardware::graphics::composer::V2_1::Display display =
201       toHwc2Display(displayId);
202 
203   const bool useCache = !buffer.handle.has_value();
204 
205   buffer_handle_t bufferHandle = nullptr;
206   if (buffer.handle.has_value()) {
207     bufferHandle = ::android::makeFromAidl(*buffer.handle);
208   }
209 
210   return toHwc3Error(mImpl->getDisplayOutputBuffer(
211       display, buffer.slot, useCache, bufferHandle, outHandle,
212       releaser->getReplacedHandle()));
213 }
214 
getLayerBuffer(int64_t displayId,int64_t layerId,const Buffer & buffer,buffer_handle_t * outHandle,ComposerResourceReleaser * releaser)215 HWC3::Error ComposerResources::getLayerBuffer(
216     int64_t displayId, int64_t layerId, const Buffer& buffer,
217     buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
218   DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
219             layerId);
220 
221   ::android::hardware::graphics::composer::V2_1::Display display =
222       toHwc2Display(displayId);
223   ::android::hardware::graphics::composer::V2_1::Layer layer =
224       toHwc2Layer(layerId);
225 
226   const bool useCache = !buffer.handle.has_value();
227 
228   buffer_handle_t bufferHandle = nullptr;
229   if (buffer.handle.has_value()) {
230     bufferHandle = ::android::makeFromAidl(*buffer.handle);
231   }
232 
233   DEBUG_LOG("%s fromCache:%s", __FUNCTION__, (useCache ? "yes" : "no"));
234   return toHwc3Error(mImpl->getLayerBuffer(display, layer, buffer.slot,
235                                            useCache, bufferHandle, outHandle,
236                                            releaser->getReplacedHandle()));
237 }
238 
getLayerSidebandStream(int64_t displayId,int64_t layerId,const aidl::android::hardware::common::NativeHandle & handle,buffer_handle_t * outHandle,ComposerResourceReleaser * releaser)239 HWC3::Error ComposerResources::getLayerSidebandStream(
240     int64_t displayId, int64_t layerId,
241     const aidl::android::hardware::common::NativeHandle& handle,
242     buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) {
243   DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId,
244             layerId);
245 
246   ::android::hardware::graphics::composer::V2_1::Display display =
247       toHwc2Display(displayId);
248   ::android::hardware::graphics::composer::V2_1::Layer layer =
249       toHwc2Layer(layerId);
250   return toHwc3Error(mImpl->getLayerSidebandStream(
251       display, layer, ::android::makeFromAidl(handle), outHandle,
252       releaser->getReplacedHandle()));
253 }
254 
255 }  // namespace aidl::android::hardware::graphics::composer3::impl