blob: a3958e10ad7cb9bb5981c79ef60514b222f7582b [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
70struct DrmDisplayPipeline {
71 static auto CreatePipeline(DrmConnector &connector)
72 -> std::unique_ptr<DrmDisplayPipeline>;
73
Roman Stratiienko9362cef2022-02-02 09:53:50 +020074 auto GetUsablePlanes()
75 -> std::vector<std::shared_ptr<BindingOwner<DrmPlane>>>;
76
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020077 DrmDevice *device;
78
79 std::shared_ptr<BindingOwner<DrmConnector>> connector;
80 std::shared_ptr<BindingOwner<DrmEncoder>> encoder;
81 std::shared_ptr<BindingOwner<DrmCrtc>> crtc;
82 std::shared_ptr<BindingOwner<DrmPlane>> primary_plane;
Roman Stratiienko19c162f2022-02-01 09:35:08 +020083
Roman Stratiienko4e994052022-02-09 17:40:35 +020084 std::unique_ptr<DrmAtomicStateManager> atomic_state_manager;
Roman Stratiienkocad8e0c2022-01-31 16:40:16 +020085};
86
87} // namespace android