1*0a9764feSAndroid Build Coastguard Worker
2*0a9764feSAndroid Build Coastguard Worker /*
3*0a9764feSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
4*0a9764feSAndroid Build Coastguard Worker *
5*0a9764feSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*0a9764feSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*0a9764feSAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*0a9764feSAndroid Build Coastguard Worker *
9*0a9764feSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*0a9764feSAndroid Build Coastguard Worker *
11*0a9764feSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*0a9764feSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*0a9764feSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*0a9764feSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*0a9764feSAndroid Build Coastguard Worker * limitations under the License.
16*0a9764feSAndroid Build Coastguard Worker */
17*0a9764feSAndroid Build Coastguard Worker
18*0a9764feSAndroid Build Coastguard Worker #define LOG_TAG "drmhwc"
19*0a9764feSAndroid Build Coastguard Worker #define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
20*0a9764feSAndroid Build Coastguard Worker
21*0a9764feSAndroid Build Coastguard Worker #include "ComposerResources.h"
22*0a9764feSAndroid Build Coastguard Worker
23*0a9764feSAndroid Build Coastguard Worker #include <aidlcommonsupport/NativeHandle.h>
24*0a9764feSAndroid Build Coastguard Worker
25*0a9764feSAndroid Build Coastguard Worker #include "hardware/hwcomposer2.h"
26*0a9764feSAndroid Build Coastguard Worker #include "hwc3/Utils.h"
27*0a9764feSAndroid Build Coastguard Worker
28*0a9764feSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::impl {
29*0a9764feSAndroid Build Coastguard Worker
ToHwc2Display(uint64_t display_id)30*0a9764feSAndroid Build Coastguard Worker ::android::hardware::graphics::composer::V2_1::Display ToHwc2Display(
31*0a9764feSAndroid Build Coastguard Worker uint64_t display_id) {
32*0a9764feSAndroid Build Coastguard Worker return static_cast<::android::hardware::graphics::composer::V2_1::Display>(
33*0a9764feSAndroid Build Coastguard Worker display_id);
34*0a9764feSAndroid Build Coastguard Worker }
35*0a9764feSAndroid Build Coastguard Worker
ToHwc2Layer(int64_t layer_id)36*0a9764feSAndroid Build Coastguard Worker ::android::hardware::graphics::composer::V2_1::Layer ToHwc2Layer(
37*0a9764feSAndroid Build Coastguard Worker int64_t layer_id) {
38*0a9764feSAndroid Build Coastguard Worker return static_cast<::android::hardware::graphics::composer::V2_1::Layer>(
39*0a9764feSAndroid Build Coastguard Worker layer_id);
40*0a9764feSAndroid Build Coastguard Worker }
41*0a9764feSAndroid Build Coastguard Worker
42*0a9764feSAndroid Build Coastguard Worker std::unique_ptr<ComposerResourceReleaser>
CreateResourceReleaser(bool is_buffer)43*0a9764feSAndroid Build Coastguard Worker ComposerResources::CreateResourceReleaser(bool is_buffer) {
44*0a9764feSAndroid Build Coastguard Worker return std::make_unique<ComposerResourceReleaser>(is_buffer);
45*0a9764feSAndroid Build Coastguard Worker }
46*0a9764feSAndroid Build Coastguard Worker
Create()47*0a9764feSAndroid Build Coastguard Worker std::unique_ptr<ComposerResources> ComposerResources::Create() {
48*0a9764feSAndroid Build Coastguard Worker auto instance = std::unique_ptr<ComposerResources>(new ComposerResources);
49*0a9764feSAndroid Build Coastguard Worker if (instance->resources_ == nullptr) {
50*0a9764feSAndroid Build Coastguard Worker ALOGE("%s: Failed to initialise ComposerResources", __func__);
51*0a9764feSAndroid Build Coastguard Worker return nullptr;
52*0a9764feSAndroid Build Coastguard Worker }
53*0a9764feSAndroid Build Coastguard Worker
54*0a9764feSAndroid Build Coastguard Worker return instance;
55*0a9764feSAndroid Build Coastguard Worker }
56*0a9764feSAndroid Build Coastguard Worker
GetLayerBuffer(uint64_t display_id,int64_t layer_id,const Buffer & buffer,buffer_handle_t * out_buffer_handle,ComposerResourceReleaser * buf_releaser)57*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetLayerBuffer(
58*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, int64_t layer_id, const Buffer& buffer,
59*0a9764feSAndroid Build Coastguard Worker buffer_handle_t* out_buffer_handle,
60*0a9764feSAndroid Build Coastguard Worker ComposerResourceReleaser* buf_releaser) {
61*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
62*0a9764feSAndroid Build Coastguard Worker auto layer = ToHwc2Layer(layer_id);
63*0a9764feSAndroid Build Coastguard Worker
64*0a9764feSAndroid Build Coastguard Worker const bool use_cache = !buffer.handle.has_value();
65*0a9764feSAndroid Build Coastguard Worker buffer_handle_t buffer_handle = nullptr;
66*0a9764feSAndroid Build Coastguard Worker if (buffer.handle.has_value()) {
67*0a9764feSAndroid Build Coastguard Worker buffer_handle = ::android::makeFromAidl(*buffer.handle);
68*0a9764feSAndroid Build Coastguard Worker }
69*0a9764feSAndroid Build Coastguard Worker
70*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getLayerBuffer(display, layer, buffer.slot, use_cache,
71*0a9764feSAndroid Build Coastguard Worker buffer_handle, out_buffer_handle,
72*0a9764feSAndroid Build Coastguard Worker buf_releaser->GetReplacedHandle());
73*0a9764feSAndroid Build Coastguard Worker
74*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
75*0a9764feSAndroid Build Coastguard Worker }
76*0a9764feSAndroid Build Coastguard Worker
GetLayerSidebandStream(uint64_t display_id,int64_t layer_id,const aidl::android::hardware::common::NativeHandle & handle,buffer_handle_t * out_handle,ComposerResourceReleaser * releaser)77*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetLayerSidebandStream(
78*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, int64_t layer_id,
79*0a9764feSAndroid Build Coastguard Worker const aidl::android::hardware::common::NativeHandle& handle,
80*0a9764feSAndroid Build Coastguard Worker buffer_handle_t* out_handle, ComposerResourceReleaser* releaser) {
81*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
82*0a9764feSAndroid Build Coastguard Worker auto layer = ToHwc2Layer(layer_id);
83*0a9764feSAndroid Build Coastguard Worker
84*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getLayerSidebandStream(display, layer,
85*0a9764feSAndroid Build Coastguard Worker ::android::makeFromAidl(handle),
86*0a9764feSAndroid Build Coastguard Worker out_handle,
87*0a9764feSAndroid Build Coastguard Worker releaser->GetReplacedHandle());
88*0a9764feSAndroid Build Coastguard Worker
89*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
90*0a9764feSAndroid Build Coastguard Worker }
91*0a9764feSAndroid Build Coastguard Worker
AddLayer(uint64_t display_id,int64_t layer_id,uint32_t buffer_cache_size)92*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::AddLayer(uint64_t display_id, int64_t layer_id,
93*0a9764feSAndroid Build Coastguard Worker uint32_t buffer_cache_size) {
94*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
95*0a9764feSAndroid Build Coastguard Worker auto layer = ToHwc2Layer(layer_id);
96*0a9764feSAndroid Build Coastguard Worker
97*0a9764feSAndroid Build Coastguard Worker auto err = resources_->addLayer(display, layer, buffer_cache_size);
98*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
99*0a9764feSAndroid Build Coastguard Worker }
100*0a9764feSAndroid Build Coastguard Worker
RemoveLayer(uint64_t display_id,int64_t layer_id)101*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::RemoveLayer(uint64_t display_id,
102*0a9764feSAndroid Build Coastguard Worker int64_t layer_id) {
103*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
104*0a9764feSAndroid Build Coastguard Worker auto layer = ToHwc2Layer(layer_id);
105*0a9764feSAndroid Build Coastguard Worker
106*0a9764feSAndroid Build Coastguard Worker auto err = resources_->removeLayer(display, layer);
107*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
108*0a9764feSAndroid Build Coastguard Worker }
109*0a9764feSAndroid Build Coastguard Worker
HasDisplay(uint64_t display_id)110*0a9764feSAndroid Build Coastguard Worker bool ComposerResources::HasDisplay(uint64_t display_id) {
111*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
112*0a9764feSAndroid Build Coastguard Worker return resources_->hasDisplay(display);
113*0a9764feSAndroid Build Coastguard Worker }
114*0a9764feSAndroid Build Coastguard Worker
AddPhysicalDisplay(uint64_t display_id)115*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::AddPhysicalDisplay(uint64_t display_id) {
116*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
117*0a9764feSAndroid Build Coastguard Worker auto err = resources_->addPhysicalDisplay(display);
118*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
119*0a9764feSAndroid Build Coastguard Worker }
120*0a9764feSAndroid Build Coastguard Worker
AddVirtualDisplay(uint64_t display,uint32_t output_buffer_cache_size)121*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::AddVirtualDisplay(
122*0a9764feSAndroid Build Coastguard Worker uint64_t display, uint32_t output_buffer_cache_size) {
123*0a9764feSAndroid Build Coastguard Worker auto err = resources_->addVirtualDisplay(display, output_buffer_cache_size);
124*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
125*0a9764feSAndroid Build Coastguard Worker }
126*0a9764feSAndroid Build Coastguard Worker
RemoveDisplay(uint64_t display_id)127*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::RemoveDisplay(uint64_t display_id) {
128*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
129*0a9764feSAndroid Build Coastguard Worker auto err = resources_->removeDisplay(display);
130*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
131*0a9764feSAndroid Build Coastguard Worker }
132*0a9764feSAndroid Build Coastguard Worker
SetDisplayMustValidateState(uint64_t display_id,bool must_validate)133*0a9764feSAndroid Build Coastguard Worker void ComposerResources::SetDisplayMustValidateState(uint64_t display_id,
134*0a9764feSAndroid Build Coastguard Worker bool must_validate) {
135*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
136*0a9764feSAndroid Build Coastguard Worker resources_->setDisplayMustValidateState(display, must_validate);
137*0a9764feSAndroid Build Coastguard Worker }
138*0a9764feSAndroid Build Coastguard Worker
MustValidateDisplay(uint64_t display_id)139*0a9764feSAndroid Build Coastguard Worker bool ComposerResources::MustValidateDisplay(uint64_t display_id) {
140*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
141*0a9764feSAndroid Build Coastguard Worker return resources_->mustValidateDisplay(display);
142*0a9764feSAndroid Build Coastguard Worker }
143*0a9764feSAndroid Build Coastguard Worker
GetDisplayClientTarget(uint64_t display_id,const Buffer & buffer,buffer_handle_t * out_handle,ComposerResourceReleaser * releaser)144*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetDisplayClientTarget(
145*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, const Buffer& buffer, buffer_handle_t* out_handle,
146*0a9764feSAndroid Build Coastguard Worker ComposerResourceReleaser* releaser) {
147*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
148*0a9764feSAndroid Build Coastguard Worker
149*0a9764feSAndroid Build Coastguard Worker const bool use_cache = !buffer.handle.has_value();
150*0a9764feSAndroid Build Coastguard Worker buffer_handle_t buffer_handle = nullptr;
151*0a9764feSAndroid Build Coastguard Worker if (buffer.handle.has_value()) {
152*0a9764feSAndroid Build Coastguard Worker buffer_handle = ::android::makeFromAidl(*buffer.handle);
153*0a9764feSAndroid Build Coastguard Worker }
154*0a9764feSAndroid Build Coastguard Worker
155*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getDisplayClientTarget(display, buffer.slot, use_cache,
156*0a9764feSAndroid Build Coastguard Worker buffer_handle, out_handle,
157*0a9764feSAndroid Build Coastguard Worker releaser->GetReplacedHandle());
158*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
159*0a9764feSAndroid Build Coastguard Worker }
160*0a9764feSAndroid Build Coastguard Worker
SetDisplayClientTargetCacheSize(uint64_t display_id,uint32_t client_target_cache_size)161*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::SetDisplayClientTargetCacheSize(
162*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, uint32_t client_target_cache_size) {
163*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
164*0a9764feSAndroid Build Coastguard Worker auto err = resources_
165*0a9764feSAndroid Build Coastguard Worker ->setDisplayClientTargetCacheSize(display,
166*0a9764feSAndroid Build Coastguard Worker client_target_cache_size);
167*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
168*0a9764feSAndroid Build Coastguard Worker }
169*0a9764feSAndroid Build Coastguard Worker
GetDisplayClientTargetCacheSize(uint64_t display_id,size_t * out_cache_size)170*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetDisplayClientTargetCacheSize(
171*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, size_t* out_cache_size) {
172*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
173*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getDisplayClientTargetCacheSize(display,
174*0a9764feSAndroid Build Coastguard Worker out_cache_size);
175*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
176*0a9764feSAndroid Build Coastguard Worker }
177*0a9764feSAndroid Build Coastguard Worker
GetDisplayOutputBufferCacheSize(uint64_t display_id,size_t * out_cache_size)178*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetDisplayOutputBufferCacheSize(
179*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, size_t* out_cache_size) {
180*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
181*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getDisplayOutputBufferCacheSize(display,
182*0a9764feSAndroid Build Coastguard Worker out_cache_size);
183*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
184*0a9764feSAndroid Build Coastguard Worker }
185*0a9764feSAndroid Build Coastguard Worker
GetDisplayOutputBuffer(uint64_t display_id,const Buffer & buffer,buffer_handle_t * out_handle,ComposerResourceReleaser * releaser)186*0a9764feSAndroid Build Coastguard Worker hwc3::Error ComposerResources::GetDisplayOutputBuffer(
187*0a9764feSAndroid Build Coastguard Worker uint64_t display_id, const Buffer& buffer, buffer_handle_t* out_handle,
188*0a9764feSAndroid Build Coastguard Worker ComposerResourceReleaser* releaser) {
189*0a9764feSAndroid Build Coastguard Worker auto display = ToHwc2Display(display_id);
190*0a9764feSAndroid Build Coastguard Worker const bool use_cache = !buffer.handle.has_value();
191*0a9764feSAndroid Build Coastguard Worker
192*0a9764feSAndroid Build Coastguard Worker buffer_handle_t buffer_handle = nullptr;
193*0a9764feSAndroid Build Coastguard Worker if (buffer.handle.has_value()) {
194*0a9764feSAndroid Build Coastguard Worker buffer_handle = ::android::makeFromAidl(*buffer.handle);
195*0a9764feSAndroid Build Coastguard Worker }
196*0a9764feSAndroid Build Coastguard Worker
197*0a9764feSAndroid Build Coastguard Worker auto err = resources_->getDisplayOutputBuffer(display, buffer.slot, use_cache,
198*0a9764feSAndroid Build Coastguard Worker buffer_handle, out_handle,
199*0a9764feSAndroid Build Coastguard Worker releaser->GetReplacedHandle());
200*0a9764feSAndroid Build Coastguard Worker return Hwc2toHwc3Error(static_cast<HWC2::Error>(err));
201*0a9764feSAndroid Build Coastguard Worker }
202*0a9764feSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::graphics::composer3::impl