blob: 0d05288ec823e46454f76502dde570e58afaafc2 [file] [log] [blame]
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +02001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Roman Stratiienkobde95662022-12-10 20:27:58 +020017#pragma once
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020018
19#include <memory>
20#include <vector>
21
22namespace android {
23
24class DrmConnector;
25class DrmDevice;
26class DrmPlane;
27class DrmCrtc;
28class DrmEncoder;
Roman Stratiienko4e994052022-02-09 17:40:35 +020029class DrmAtomicStateManager;
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020030
31struct DrmDisplayPipeline;
32
33template <class O>
34class BindingOwner;
35
36template <class O>
37class PipelineBindable {
38 friend class BindingOwner<O>;
39
40 public:
41 auto *GetPipeline() {
42 return bound_pipeline_;
43 }
44
45 auto BindPipeline(DrmDisplayPipeline *pipeline,
46 bool return_object_if_bound = false)
47 -> std::shared_ptr<BindingOwner<O>>;
48
49 private:
50 DrmDisplayPipeline *bound_pipeline_;
51 std::weak_ptr<BindingOwner<O>> owner_object_;
52};
53
54template <class B>
55class BindingOwner {
56 public:
57 explicit BindingOwner(B *pb) : bindable_(pb){};
58 ~BindingOwner() {
59 bindable_->bound_pipeline_ = nullptr;
60 }
61
62 B *Get() {
63 return bindable_;
64 }
65
66 private:
67 B *const bindable_;
68};
69
Andrew Wolfers7979d2a2025-02-27 14:44:41 +000070using UsablePlanes = std::pair<
71 std::vector<std::shared_ptr<BindingOwner<DrmPlane>>>,
72 std::shared_ptr<BindingOwner<DrmPlane>>>;
73
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020074struct DrmDisplayPipeline {
75 static auto CreatePipeline(DrmConnector &connector)
76 -> std::unique_ptr<DrmDisplayPipeline>;
77
Andrew Wolfers7979d2a2025-02-27 14:44:41 +000078 auto GetUsablePlanes() -> UsablePlanes;
Roman Stratiienko9362cef2022-02-02 09:53:50 +020079
Roman Stratiienkof818d4c2022-12-28 20:12:19 +020080 ~DrmDisplayPipeline();
81
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020082 DrmDevice *device;
83
84 std::shared_ptr<BindingOwner<DrmConnector>> connector;
85 std::shared_ptr<BindingOwner<DrmEncoder>> encoder;
86 std::shared_ptr<BindingOwner<DrmCrtc>> crtc;
87 std::shared_ptr<BindingOwner<DrmPlane>> primary_plane;
Roman Stratiienko19c162f2022-02-01 09:35:08 +020088
Roman Stratiienkof818d4c2022-12-28 20:12:19 +020089 std::shared_ptr<DrmAtomicStateManager> atomic_state_manager;
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020090};
91
92} // namespace android