xref: /aosp_15_r20/external/drm_hwcomposer/hwc3/ComposerResources.cpp (revision 0a9764fe0a15e71ebbeb85e87e10990c23aab47f)
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