diff options
author | Tomi Valkeinen <tomi.valkeinen@iki.fi> | 2015-09-28 01:13:34 +0300 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@iki.fi> | 2015-09-28 01:13:34 +0300 |
commit | 009828beac9bfe9c36d336a4de0d297f90aece52 (patch) | |
tree | 3ea6b22f2036dcc0c23c459ce53bfc2ad282e3e7 /libkms++/encoder.cpp |
Initial version
Diffstat (limited to 'libkms++/encoder.cpp')
-rw-r--r-- | libkms++/encoder.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libkms++/encoder.cpp b/libkms++/encoder.cpp new file mode 100644 index 0000000..081177b --- /dev/null +++ b/libkms++/encoder.cpp @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <iostream> +#include <unistd.h> +#include <fcntl.h> +#include <cassert> +#include <xf86drm.h> +#include <xf86drmMode.h> + +#include "kms++.h" + +using namespace std; + +namespace kms +{ + +struct EncoderPriv +{ + drmModeEncoderPtr drm_encoder; +}; + +Encoder::Encoder(Card &card, uint32_t id) + :DrmObject(card, id, DRM_MODE_OBJECT_ENCODER) +{ + 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; +} + +void Encoder::print_short() const +{ + auto e = m_priv->drm_encoder; + + printf("Encoder %d, %d\n", id(), + e->encoder_type); +} + +Crtc* Encoder::get_crtc() const +{ + return card().get_crtc(m_priv->drm_encoder->crtc_id); +} + +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_crtc_by_index(idx); + crtcs.push_back(crtc); + } + + return crtcs; +} +} |