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