summaryrefslogtreecommitdiff
path: root/kms++/src/encoder.cpp
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2016-06-11 21:46:24 +0300
committerTomi Valkeinen <tomi.valkeinen@ti.com>2016-06-11 21:46:24 +0300
commit9916712a62169606d845510028a3ea6f84bd442f (patch)
treeaca4e1bec39500812111c43a8ecee862edae0002 /kms++/src/encoder.cpp
parent736b295100ce441e800457bcbd08cb36db543ff2 (diff)
kms++: organize into subdirs
Diffstat (limited to 'kms++/src/encoder.cpp')
-rw-r--r--kms++/src/encoder.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/kms++/src/encoder.cpp b/kms++/src/encoder.cpp
new file mode 100644
index 0000000..2168f2f
--- /dev/null
+++ b/kms++/src/encoder.cpp
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <iostream>
+#include <unistd.h>
+#include <fcntl.h>
+#include <cassert>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include <kms++/kms++.h>
+
+using namespace std;
+
+namespace kms
+{
+
+struct EncoderPriv
+{
+ drmModeEncoderPtr drm_encoder;
+};
+
+static const map<int, string> encoder_types = {
+#define DEF_ENC(c) { DRM_MODE_ENCODER_##c, #c }
+ DEF_ENC(NONE),
+ DEF_ENC(DAC),
+ DEF_ENC(TMDS),
+ DEF_ENC(LVDS),
+ DEF_ENC(TVDAC),
+ DEF_ENC(VIRTUAL),
+ DEF_ENC(DSI),
+ { 7, "DPMST" },
+#undef DEF_ENC
+};
+
+Encoder::Encoder(Card &card, uint32_t id, uint32_t idx)
+ :DrmPropObject(card, id, DRM_MODE_OBJECT_ENCODER, idx)
+{
+ m_priv = new EncoderPriv();
+ m_priv->drm_encoder = drmModeGetEncoder(this->card().fd(), this->id());
+ assert(m_priv->drm_encoder);
+}
+
+Encoder::~Encoder()
+{
+ drmModeFreeEncoder(m_priv->drm_encoder);
+ delete m_priv;
+}
+
+Crtc* Encoder::get_crtc() const
+{
+ if (m_priv->drm_encoder->crtc_id)
+ return card().get_crtc(m_priv->drm_encoder->crtc_id);
+ else
+ return 0;
+}
+
+vector<Crtc*> Encoder::get_possible_crtcs() const
+{
+ unsigned bits = m_priv->drm_encoder->possible_crtcs;
+ vector<Crtc*> crtcs;
+
+ for (int idx = 0; bits; idx++, bits >>= 1) {
+ if ((bits & 1) == 0)
+ continue;
+
+ auto crtc = card().get_crtcs()[idx];
+ crtcs.push_back(crtc);
+ }
+
+ return crtcs;
+}
+
+const string& Encoder::get_encoder_type() const
+{
+ return encoder_types.at(m_priv->drm_encoder->encoder_type);
+}
+
+}