From 17d180891f1e237ea5d25835999a8b23a6e7946d Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Sat, 11 Jun 2016 20:17:35 +0300 Subject: rename dirs --- kms++/encoder.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 kms++/encoder.cpp (limited to 'kms++/encoder.cpp') diff --git a/kms++/encoder.cpp b/kms++/encoder.cpp new file mode 100644 index 0000000..1ed2d5c --- /dev/null +++ b/kms++/encoder.cpp @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "kms++.h" + +using namespace std; + +namespace kms +{ + +struct EncoderPriv +{ + drmModeEncoderPtr drm_encoder; +}; + +static const map 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 Encoder::get_possible_crtcs() const +{ + unsigned bits = m_priv->drm_encoder->possible_crtcs; + vector 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); +} + +} -- cgit v1.2.3