blob: ae0edf4fc5aab4142191df6437519279502ebeb9 [file] [log] [blame]
/*
* 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 <aidlcommonsupport/NativeHandle.h>
#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<ComposerResourceReleaser>
ComposerResources::CreateResourceReleaser(bool is_buffer) {
return std::make_unique<ComposerResourceReleaser>(is_buffer);
}
std::unique_ptr<ComposerResources> ComposerResources::Create() {
auto instance = std::unique_ptr<ComposerResources>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(err));
}
hwc3::Error ComposerResources::RemoveDisplay(uint64_t display_id) {
auto display = ToHwc2Display(display_id);
auto err = resources_->removeDisplay(display);
return Hwc2toHwc3Error(static_cast<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(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<HWC2::Error>(err));
}
} // namespace aidl::android::hardware::graphics::composer3::impl