/* * Copyright (C) 2024 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. */ #define LOG_TAG "drmhwc" #define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) #include "ComposerResources.h" #include #include "hardware/hwcomposer2.h" #include "hwc3/Utils.h" namespace aidl::android::hardware::graphics::composer3::impl { ::android::hardware::graphics::composer::V2_1::Display ToHwc2Display( uint64_t display_id) { return static_cast<::android::hardware::graphics::composer::V2_1::Display>( display_id); } ::android::hardware::graphics::composer::V2_1::Layer ToHwc2Layer( int64_t layer_id) { return static_cast<::android::hardware::graphics::composer::V2_1::Layer>( layer_id); } std::unique_ptr ComposerResources::CreateResourceReleaser(bool is_buffer) { return std::make_unique(is_buffer); } std::unique_ptr ComposerResources::Create() { auto instance = std::unique_ptr(new ComposerResources); if (instance->resources_ == nullptr) { ALOGE("%s: Failed to initialise ComposerResources", __func__); return nullptr; } return instance; } hwc3::Error ComposerResources::GetLayerBuffer( uint64_t display_id, int64_t layer_id, const Buffer& buffer, buffer_handle_t* out_buffer_handle, ComposerResourceReleaser* buf_releaser) { auto display = ToHwc2Display(display_id); auto layer = ToHwc2Layer(layer_id); const bool use_cache = !buffer.handle.has_value(); buffer_handle_t buffer_handle = nullptr; if (buffer.handle.has_value()) { buffer_handle = ::android::makeFromAidl(*buffer.handle); } auto err = resources_->getLayerBuffer(display, layer, buffer.slot, use_cache, buffer_handle, out_buffer_handle, buf_releaser->GetReplacedHandle()); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::GetLayerSidebandStream( uint64_t display_id, int64_t layer_id, const aidl::android::hardware::common::NativeHandle& handle, buffer_handle_t* out_handle, ComposerResourceReleaser* releaser) { auto display = ToHwc2Display(display_id); auto layer = ToHwc2Layer(layer_id); auto err = resources_->getLayerSidebandStream(display, layer, ::android::makeFromAidl(handle), out_handle, releaser->GetReplacedHandle()); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::AddLayer(uint64_t display_id, int64_t layer_id, uint32_t buffer_cache_size) { auto display = ToHwc2Display(display_id); auto layer = ToHwc2Layer(layer_id); auto err = resources_->addLayer(display, layer, buffer_cache_size); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::RemoveLayer(uint64_t display_id, int64_t layer_id) { auto display = ToHwc2Display(display_id); auto layer = ToHwc2Layer(layer_id); auto err = resources_->removeLayer(display, layer); return Hwc2toHwc3Error(static_cast(err)); } bool ComposerResources::HasDisplay(uint64_t display_id) { auto display = ToHwc2Display(display_id); return resources_->hasDisplay(display); } hwc3::Error ComposerResources::AddPhysicalDisplay(uint64_t display_id) { auto display = ToHwc2Display(display_id); auto err = resources_->addPhysicalDisplay(display); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::AddVirtualDisplay( uint64_t display, uint32_t output_buffer_cache_size) { auto err = resources_->addVirtualDisplay(display, output_buffer_cache_size); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::RemoveDisplay(uint64_t display_id) { auto display = ToHwc2Display(display_id); auto err = resources_->removeDisplay(display); return Hwc2toHwc3Error(static_cast(err)); } void ComposerResources::SetDisplayMustValidateState(uint64_t display_id, bool must_validate) { auto display = ToHwc2Display(display_id); resources_->setDisplayMustValidateState(display, must_validate); } bool ComposerResources::MustValidateDisplay(uint64_t display_id) { auto display = ToHwc2Display(display_id); return resources_->mustValidateDisplay(display); } hwc3::Error ComposerResources::GetDisplayClientTarget( uint64_t display_id, const Buffer& buffer, buffer_handle_t* out_handle, ComposerResourceReleaser* releaser) { auto display = ToHwc2Display(display_id); const bool use_cache = !buffer.handle.has_value(); buffer_handle_t buffer_handle = nullptr; if (buffer.handle.has_value()) { buffer_handle = ::android::makeFromAidl(*buffer.handle); } auto err = resources_->getDisplayClientTarget(display, buffer.slot, use_cache, buffer_handle, out_handle, releaser->GetReplacedHandle()); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::SetDisplayClientTargetCacheSize( uint64_t display_id, uint32_t client_target_cache_size) { auto display = ToHwc2Display(display_id); auto err = resources_ ->setDisplayClientTargetCacheSize(display, client_target_cache_size); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::GetDisplayClientTargetCacheSize( uint64_t display_id, size_t* out_cache_size) { auto display = ToHwc2Display(display_id); auto err = resources_->getDisplayClientTargetCacheSize(display, out_cache_size); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::GetDisplayOutputBufferCacheSize( uint64_t display_id, size_t* out_cache_size) { auto display = ToHwc2Display(display_id); auto err = resources_->getDisplayOutputBufferCacheSize(display, out_cache_size); return Hwc2toHwc3Error(static_cast(err)); } hwc3::Error ComposerResources::GetDisplayOutputBuffer( uint64_t display_id, const Buffer& buffer, buffer_handle_t* out_handle, ComposerResourceReleaser* releaser) { auto display = ToHwc2Display(display_id); const bool use_cache = !buffer.handle.has_value(); buffer_handle_t buffer_handle = nullptr; if (buffer.handle.has_value()) { buffer_handle = ::android::makeFromAidl(*buffer.handle); } auto err = resources_->getDisplayOutputBuffer(display, buffer.slot, use_cache, buffer_handle, out_handle, releaser->GetReplacedHandle()); return Hwc2toHwc3Error(static_cast(err)); } } // namespace aidl::android::hardware::graphics::composer3::impl