1 #include <cstdio>
2 #include <iostream>
3 #include <unistd.h>
4 #include <fcntl.h>
5 #include <cassert>
6 #include <xf86drm.h>
7 #include <xf86drmMode.h>
8
9 #include <kms++/kms++.h>
10
11 using namespace std;
12
13 namespace kms
14 {
15 struct EncoderPriv {
16 drmModeEncoderPtr drm_encoder;
17 };
18
19 static const map<int, string> encoder_types = {
20 #define DEF_ENC(c) \
21 { \
22 DRM_MODE_ENCODER_##c, #c \
23 }
24 DEF_ENC(NONE),
25 DEF_ENC(DAC),
26 DEF_ENC(TMDS),
27 DEF_ENC(LVDS),
28 DEF_ENC(TVDAC),
29 DEF_ENC(VIRTUAL),
30 DEF_ENC(DSI),
31 { 7, "DPMST" },
32 { 8, "DPI" },
33 #undef DEF_ENC
34 };
35
Encoder(Card & card,uint32_t id,uint32_t idx)36 Encoder::Encoder(Card& card, uint32_t id, uint32_t idx)
37 : DrmPropObject(card, id, DRM_MODE_OBJECT_ENCODER, idx)
38 {
39 m_priv = new EncoderPriv();
40 m_priv->drm_encoder = drmModeGetEncoder(this->card().fd(), this->id());
41 assert(m_priv->drm_encoder);
42 }
43
~Encoder()44 Encoder::~Encoder()
45 {
46 drmModeFreeEncoder(m_priv->drm_encoder);
47 delete m_priv;
48 }
49
refresh()50 void Encoder::refresh()
51 {
52 drmModeFreeEncoder(m_priv->drm_encoder);
53
54 m_priv->drm_encoder = drmModeGetEncoder(this->card().fd(), this->id());
55 assert(m_priv->drm_encoder);
56 }
57
get_crtc() const58 Crtc* Encoder::get_crtc() const
59 {
60 if (m_priv->drm_encoder->crtc_id)
61 return card().get_crtc(m_priv->drm_encoder->crtc_id);
62 else
63 return 0;
64 }
65
get_possible_crtcs() const66 vector<Crtc*> Encoder::get_possible_crtcs() const
67 {
68 unsigned bits = m_priv->drm_encoder->possible_crtcs;
69 vector<Crtc*> crtcs;
70
71 for (int idx = 0; bits; idx++, bits >>= 1) {
72 if ((bits & 1) == 0)
73 continue;
74
75 auto crtc = card().get_crtcs()[idx];
76 crtcs.push_back(crtc);
77 }
78
79 return crtcs;
80 }
81
get_encoder_type() const82 const string& Encoder::get_encoder_type() const
83 {
84 return encoder_types.at(m_priv->drm_encoder->encoder_type);
85 }
86
87 } // namespace kms
88