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