]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android/external-libkmsxx.git/blobdiff - libkms++/connector.cpp
Connector: prettier connector names
[android/external-libkmsxx.git] / libkms++ / connector.cpp
index 8ff5a5f8f4a264661084ce22289c37d3f54b6b02..cdeb02aa166e65967d2bb10a6284c9d6069f10f7 100644 (file)
@@ -9,36 +9,46 @@
 
 using namespace std;
 
-#define DEF_CONN(c) [DRM_MODE_CONNECTOR_##c] = #c
-
 namespace kms
 {
 
-static const char * connector_names[] = {
-       DEF_CONN(Unknown),
-       DEF_CONN(VGA),
-       DEF_CONN(DVII),
-       DEF_CONN(DVID),
-       DEF_CONN(DVIA),
-       DEF_CONN(Composite),
-       DEF_CONN(SVIDEO),
-       DEF_CONN(LVDS),
-       DEF_CONN(Component),
-       DEF_CONN(9PinDIN),
-       DEF_CONN(DisplayPort),
-       DEF_CONN(HDMIA),
-       DEF_CONN(HDMIB),
-       DEF_CONN(TV),
-       DEF_CONN(eDP),
-       DEF_CONN(VIRTUAL),
-       DEF_CONN(DSI),
+
+static const map<int, string> connector_names = {
+       { DRM_MODE_CONNECTOR_Unknown, "Unknown" },
+       { DRM_MODE_CONNECTOR_VGA, "VGA" },
+       { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
+       { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
+       { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
+       { DRM_MODE_CONNECTOR_Composite, "Composite" },
+       { DRM_MODE_CONNECTOR_SVIDEO, "S-Video" },
+       { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
+       { DRM_MODE_CONNECTOR_Component, "Component" },
+       { DRM_MODE_CONNECTOR_9PinDIN, "9-Pin-DIN" },
+       { DRM_MODE_CONNECTOR_DisplayPort, "DP" },
+       { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
+       { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
+       { DRM_MODE_CONNECTOR_TV, "TV" },
+       { DRM_MODE_CONNECTOR_eDP, "eDP" },
+       { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
+       { DRM_MODE_CONNECTOR_DSI, "DSI" },
+};
+
+static const map<int, string> connection_str = {
+       { 0, "<unknown>" },
+       { DRM_MODE_CONNECTED, "Connected" },
+       { DRM_MODE_DISCONNECTED, "Disconnected" },
+       { DRM_MODE_UNKNOWNCONNECTION, "Unknown" },
 };
 
-static const char *connection_str[] = {
-       [0] = "<unknown>",
-       [DRM_MODE_CONNECTED] = "Connected",
-       [DRM_MODE_DISCONNECTED] = "Disconnected",
-       [DRM_MODE_UNKNOWNCONNECTION] = "Unknown",
+static const map<int, string> subpix_str = {
+#define DEF_SUBPIX(c) { DRM_MODE_SUBPIXEL_##c, #c }
+       DEF_SUBPIX(UNKNOWN),
+       DEF_SUBPIX(HORIZONTAL_RGB),
+       DEF_SUBPIX(HORIZONTAL_BGR),
+       DEF_SUBPIX(VERTICAL_RGB),
+       DEF_SUBPIX(VERTICAL_BGR),
+       DEF_SUBPIX(NONE),
+#undef DEF_SUBPIX
 };
 
 struct ConnectorPriv
@@ -54,8 +64,8 @@ Connector::Connector(Card &card, uint32_t id, uint32_t idx)
        m_priv->drm_connector = drmModeGetConnector(this->card().fd(), this->id());
        assert(m_priv->drm_connector);
 
-       auto name = connector_names[m_priv->drm_connector->connector_type];
-       m_fullname = std::string(string(name) + std::to_string(m_priv->drm_connector->connector_type_id));
+       const auto& name = connector_names.at(m_priv->drm_connector->connector_type);
+       m_fullname = name + "-" + to_string(m_priv->drm_connector->connector_type_id);
 }
 
 
@@ -67,19 +77,21 @@ Connector::~Connector()
 
 void Connector::setup()
 {
-       if (m_priv->drm_connector->encoder_id != 0) {
-               auto enc = card().get_encoder(m_priv->drm_connector->encoder_id);
-               if (enc)
-                       m_current_crtc = enc->get_crtc();
-       }
+       if (m_priv->drm_connector->encoder_id != 0)
+               m_current_encoder = card().get_encoder(m_priv->drm_connector->encoder_id);
+       else
+               m_current_encoder = 0;
+
+       if (m_current_encoder)
+               m_saved_crtc = m_current_encoder->get_crtc();
+       else
+               m_saved_crtc = 0;
 }
 
-void Connector::print_short() const
+void Connector::restore_mode()
 {
-       auto c = m_priv->drm_connector;
-
-       printf("Connector %d, %s, %dx%dmm, %s\n", id(), m_fullname.c_str(),
-              c->mmWidth, c->mmHeight, connection_str[c->connection]);
+       if (m_saved_crtc)
+               m_saved_crtc->restore_mode(this);
 }
 
 Videomode Connector::get_default_mode() const
@@ -100,9 +112,29 @@ Videomode Connector::get_mode(const string& mode) const
         throw invalid_argument(mode + ": mode not found");
 }
 
+Videomode Connector::get_mode(unsigned xres, unsigned yres, unsigned refresh) const
+{
+       auto c = m_priv->drm_connector;
+
+       for (int i = 0; i < c->count_modes; i++) {
+               drmModeModeInfo& m = c->modes[i];
+
+               if (m.hdisplay != xres || m.vdisplay != yres)
+                       continue;
+
+               if (refresh && m.vrefresh != refresh)
+                       continue;
+
+               return drm_mode_to_video_mode(c->modes[i]);
+       }
+
+       throw invalid_argument("mode not found");
+}
+
 bool Connector::connected() const
 {
-       return m_priv->drm_connector->connection == DRM_MODE_CONNECTED;
+       return m_priv->drm_connector->connection == DRM_MODE_CONNECTED ||
+                       m_priv->drm_connector->connection == DRM_MODE_UNKNOWNCONNECTION;
 }
 
 vector<Crtc*> Connector::get_possible_crtcs() const
@@ -119,4 +151,65 @@ vector<Crtc*> Connector::get_possible_crtcs() const
 
        return crtcs;
 }
+
+Crtc* Connector::get_current_crtc() const
+{
+       if (m_current_encoder)
+               return m_current_encoder->get_crtc();
+       else
+               return 0;
+}
+
+uint32_t Connector::connector_type() const
+{
+       return m_priv->drm_connector->connector_type;
+}
+
+uint32_t Connector::connector_type_id() const
+{
+       return m_priv->drm_connector->connector_type_id;
+}
+
+uint32_t Connector::mmWidth() const
+{
+       return m_priv->drm_connector->mmWidth;
+}
+
+uint32_t Connector::mmHeight() const
+{
+       return m_priv->drm_connector->mmHeight;
+}
+
+uint32_t Connector::subpixel() const
+{
+       return m_priv->drm_connector->subpixel;
+}
+
+const string& Connector::subpixel_str() const
+{
+       return subpix_str.at(subpixel());
+}
+
+std::vector<Videomode> Connector::get_modes() const
+{
+       vector<Videomode> modes;
+
+       for (int i = 0; i < m_priv->drm_connector->count_modes; i++)
+               modes.push_back(drm_mode_to_video_mode(
+                                       m_priv->drm_connector->modes[i]));
+
+       return modes;
+}
+
+std::vector<Encoder*> Connector::get_encoders() const
+{
+       vector<Encoder*> encoders;
+
+       for (int i = 0; i < m_priv->drm_connector->count_encoders; i++) {
+               auto enc = card().get_encoder(m_priv->drm_connector->encoders[i]);
+               encoders.push_back(enc);
+       }
+       return encoders;
+}
+
 }