• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 
17 #ifndef ANDROID_DRM_CONNECTOR_H_
18 #define ANDROID_DRM_CONNECTOR_H_
19 
20 #include <xf86drmMode.h>
21 
22 #include <cstdint>
23 #include <string>
24 #include <vector>
25 
26 #include "DrmEncoder.h"
27 #include "DrmMode.h"
28 #include "DrmProperty.h"
29 #include "DrmUnique.h"
30 
31 namespace android {
32 
33 class DrmDevice;
34 
35 class DrmConnector : public PipelineBindable<DrmConnector> {
36  public:
37   static auto CreateInstance(DrmDevice &dev, uint32_t connector_id,
38                              uint32_t index) -> std::unique_ptr<DrmConnector>;
39 
40   DrmConnector(const DrmProperty &) = delete;
41   DrmConnector &operator=(const DrmProperty &) = delete;
42 
43   int UpdateEdidProperty();
44   auto GetEdidBlob() -> DrmModePropertyBlobUnique;
45 
46   auto GetDev() const -> DrmDevice & {
47     return *drm_;
48   }
49 
GetId()50   auto GetId() const {
51     return connector_->connector_id;
52   }
53 
GetIndexInResArray()54   auto GetIndexInResArray() const {
55     return index_in_res_array_;
56   }
57 
GetCurrentEncoderId()58   auto GetCurrentEncoderId() const {
59     return connector_->encoder_id;
60   }
61 
SupportsEncoder(DrmEncoder & enc)62   auto SupportsEncoder(DrmEncoder &enc) const {
63     for (int i = 0; i < connector_->count_encoders; i++) {
64       // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
65       if (connector_->encoders[i] == enc.GetId()) {
66         return true;
67       }
68     }
69 
70     return false;
71   }
72 
73   bool IsInternal() const;
74   bool IsExternal() const;
75   bool IsWriteback() const;
76   bool IsValid() const;
77 
78   std::string GetName() const;
79 
80   int UpdateModes();
81 
GetModes()82   auto &GetModes() const {
83     return modes_;
84   }
85 
GetActiveMode()86   auto &GetActiveMode() const {
87     return active_mode_;
88   }
89 
90   void SetActiveMode(DrmMode &mode);
91 
GetDpmsProperty()92   auto &GetDpmsProperty() const {
93     return dpms_property_;
94   }
95 
GetCrtcIdProperty()96   auto &GetCrtcIdProperty() const {
97     return crtc_id_property_;
98   }
99 
GetEdidProperty()100   auto &GetEdidProperty() const {
101     return edid_property_;
102   }
103 
IsConnected()104   auto IsConnected() const {
105     return connector_->connection == DRM_MODE_CONNECTED;
106   }
107 
GetMmWidth()108   auto GetMmWidth() const {
109     return connector_->mmWidth;
110   }
111 
GetMmHeight()112   auto GetMmHeight() const {
113     return connector_->mmHeight;
114   };
115 
116  private:
DrmConnector(DrmModeConnectorUnique connector,DrmDevice * drm,uint32_t index)117   DrmConnector(DrmModeConnectorUnique connector, DrmDevice *drm, uint32_t index)
118       : connector_(std::move(connector)),
119         drm_(drm),
120         index_in_res_array_(index){};
121 
122   DrmModeConnectorUnique connector_;
123   DrmDevice *const drm_;
124 
125   const uint32_t index_in_res_array_;
126 
127   DrmMode active_mode_;
128   std::vector<DrmMode> modes_;
129 
130   DrmProperty dpms_property_;
131   DrmProperty crtc_id_property_;
132   DrmProperty edid_property_;
133   DrmProperty writeback_pixel_formats_;
134   DrmProperty writeback_fb_id_;
135   DrmProperty writeback_out_fence_;
136 };
137 }  // namespace android
138 
139 #endif  // ANDROID_DRM_PLANE_H_
140