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