| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "ComposerResources.h" |
| |
| #include <aidlcommonsupport/NativeHandle.h> |
| |
| namespace aidl::android::hardware::graphics::composer3::impl { |
| namespace { |
| |
| HWC3::Error toHwc3Error( |
| ::android::hardware::graphics::composer::V2_1::Error error) { |
| switch (error) { |
| case ::android::hardware::graphics::composer::V2_1::Error::NONE: |
| return HWC3::Error::None; |
| case ::android::hardware::graphics::composer::V2_1::Error::BAD_CONFIG: |
| return HWC3::Error::BadConfig; |
| case ::android::hardware::graphics::composer::V2_1::Error::BAD_DISPLAY: |
| return HWC3::Error::BadDisplay; |
| case ::android::hardware::graphics::composer::V2_1::Error::BAD_LAYER: |
| return HWC3::Error::BadLayer; |
| case ::android::hardware::graphics::composer::V2_1::Error::BAD_PARAMETER: |
| return HWC3::Error::BadParameter; |
| case ::android::hardware::graphics::composer::V2_1::Error::NO_RESOURCES: |
| return HWC3::Error::NoResources; |
| case ::android::hardware::graphics::composer::V2_1::Error::NOT_VALIDATED: |
| return HWC3::Error::NotValidated; |
| case ::android::hardware::graphics::composer::V2_1::Error::UNSUPPORTED: |
| return HWC3::Error::Unsupported; |
| } |
| } |
| |
| ::android::hardware::graphics::composer::V2_1::Display toHwc2Display( |
| int64_t displayId) { |
| return static_cast<::android::hardware::graphics::composer::V2_1::Display>( |
| displayId); |
| } |
| |
| ::android::hardware::graphics::composer::V2_1::Layer toHwc2Layer( |
| int64_t layerId) { |
| return static_cast<::android::hardware::graphics::composer::V2_1::Layer>( |
| layerId); |
| } |
| |
| } // namespace |
| |
| std::unique_ptr<ComposerResourceReleaser> ComposerResources::createReleaser( |
| bool isBuffer) { |
| return std::make_unique<ComposerResourceReleaser>(isBuffer); |
| } |
| |
| HWC3::Error ComposerResources::init() { |
| mImpl = ::android::hardware::graphics::composer::V2_2::hal:: |
| ComposerResources::create(); |
| if (!mImpl) { |
| ALOGE("%s: failed to create underlying ComposerResources.", __FUNCTION__); |
| return HWC3::Error::NoResources; |
| } |
| return HWC3::Error::None; |
| } |
| |
| void ComposerResources::clear( |
| ::android::hardware::graphics::composer::V2_2::hal::ComposerResources:: |
| RemoveDisplay removeDisplay) { |
| mImpl->clear(removeDisplay); |
| } |
| |
| bool ComposerResources::hasDisplay(int64_t displayId) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return mImpl->hasDisplay(display); |
| } |
| |
| HWC3::Error ComposerResources::addPhysicalDisplay(int64_t displayId) { |
| DEBUG_LOG("%s: display:%" PRId64, __FUNCTION__, displayId); |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error(mImpl->addPhysicalDisplay(display)); |
| } |
| |
| HWC3::Error ComposerResources::addVirtualDisplay( |
| int64_t displayId, uint32_t outputBufferCacheSize) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error(mImpl->addVirtualDisplay(display, outputBufferCacheSize)); |
| } |
| |
| HWC3::Error ComposerResources::removeDisplay(int64_t displayId) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error(mImpl->removeDisplay(display)); |
| } |
| |
| HWC3::Error ComposerResources::setDisplayClientTargetCacheSize( |
| int64_t displayId, uint32_t clientTargetCacheSize) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error( |
| mImpl->setDisplayClientTargetCacheSize(display, clientTargetCacheSize)); |
| } |
| |
| HWC3::Error ComposerResources::getDisplayClientTargetCacheSize( |
| int64_t displayId, size_t* outCacheSize) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error( |
| mImpl->getDisplayClientTargetCacheSize(display, outCacheSize)); |
| } |
| |
| HWC3::Error ComposerResources::getDisplayOutputBufferCacheSize( |
| int64_t displayId, size_t* outCacheSize) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error( |
| mImpl->getDisplayOutputBufferCacheSize(display, outCacheSize)); |
| } |
| |
| HWC3::Error ComposerResources::addLayer(int64_t displayId, int64_t layerId, |
| uint32_t bufferCacheSize) { |
| DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId, |
| layerId); |
| |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| ::android::hardware::graphics::composer::V2_1::Layer layer = |
| toHwc2Layer(layerId); |
| return toHwc3Error(mImpl->addLayer(display, layer, bufferCacheSize)); |
| } |
| |
| HWC3::Error ComposerResources::removeLayer(int64_t displayId, int64_t layerId) { |
| DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId, |
| layerId); |
| |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| ::android::hardware::graphics::composer::V2_1::Layer layer = |
| toHwc2Layer(layerId); |
| |
| return toHwc3Error(mImpl->removeLayer(display, layer)); |
| } |
| |
| void ComposerResources::setDisplayMustValidateState(int64_t displayId, |
| bool mustValidate) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| mImpl->setDisplayMustValidateState(display, mustValidate); |
| } |
| |
| bool ComposerResources::mustValidateDisplay(int64_t displayId) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return mImpl->mustValidateDisplay(display); |
| } |
| |
| HWC3::Error ComposerResources::getDisplayReadbackBuffer( |
| int64_t displayId, |
| const aidl::android::hardware::common::NativeHandle& handle, |
| buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| return toHwc3Error(mImpl->getDisplayReadbackBuffer( |
| display, ::android::makeFromAidl(handle), outHandle, |
| releaser->getReplacedHandle())); |
| } |
| |
| HWC3::Error ComposerResources::getDisplayClientTarget( |
| int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle, |
| ComposerResourceReleaser* releaser) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| |
| const bool useCache = !buffer.handle.has_value(); |
| |
| buffer_handle_t bufferHandle = nullptr; |
| if (buffer.handle.has_value()) { |
| bufferHandle = ::android::makeFromAidl(*buffer.handle); |
| } |
| |
| return toHwc3Error(mImpl->getDisplayClientTarget( |
| display, buffer.slot, useCache, bufferHandle, outHandle, |
| releaser->getReplacedHandle())); |
| } |
| |
| HWC3::Error ComposerResources::getDisplayOutputBuffer( |
| int64_t displayId, const Buffer& buffer, buffer_handle_t* outHandle, |
| ComposerResourceReleaser* releaser) { |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| |
| const bool useCache = !buffer.handle.has_value(); |
| |
| buffer_handle_t bufferHandle = nullptr; |
| if (buffer.handle.has_value()) { |
| bufferHandle = ::android::makeFromAidl(*buffer.handle); |
| } |
| |
| return toHwc3Error(mImpl->getDisplayOutputBuffer( |
| display, buffer.slot, useCache, bufferHandle, outHandle, |
| releaser->getReplacedHandle())); |
| } |
| |
| HWC3::Error ComposerResources::getLayerBuffer( |
| int64_t displayId, int64_t layerId, const Buffer& buffer, |
| buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) { |
| DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId, |
| layerId); |
| |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| ::android::hardware::graphics::composer::V2_1::Layer layer = |
| toHwc2Layer(layerId); |
| |
| const bool useCache = !buffer.handle.has_value(); |
| |
| buffer_handle_t bufferHandle = nullptr; |
| if (buffer.handle.has_value()) { |
| bufferHandle = ::android::makeFromAidl(*buffer.handle); |
| } |
| |
| DEBUG_LOG("%s fromCache:%s", __FUNCTION__, (useCache ? "yes" : "no")); |
| return toHwc3Error(mImpl->getLayerBuffer(display, layer, buffer.slot, |
| useCache, bufferHandle, outHandle, |
| releaser->getReplacedHandle())); |
| } |
| |
| HWC3::Error ComposerResources::getLayerSidebandStream( |
| int64_t displayId, int64_t layerId, |
| const aidl::android::hardware::common::NativeHandle& handle, |
| buffer_handle_t* outHandle, ComposerResourceReleaser* releaser) { |
| DEBUG_LOG("%s: display:%" PRId64 " layer:%" PRId64, __FUNCTION__, displayId, |
| layerId); |
| |
| ::android::hardware::graphics::composer::V2_1::Display display = |
| toHwc2Display(displayId); |
| ::android::hardware::graphics::composer::V2_1::Layer layer = |
| toHwc2Layer(layerId); |
| return toHwc3Error(mImpl->getLayerSidebandStream( |
| display, layer, ::android::makeFromAidl(handle), outHandle, |
| releaser->getReplacedHandle())); |
| } |
| |
| } // namespace aidl::android::hardware::graphics::composer3::impl |