summaryrefslogtreecommitdiff
path: root/libkms++/card.cpp
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@iki.fi>2015-09-28 17:59:52 +0300
committerTomi Valkeinen <tomi.valkeinen@iki.fi>2015-09-28 23:30:55 +0300
commit0bdc88a432d0b9581606e86e53d686b91def4002 (patch)
treec01c2fa346a648a6e6a73c100801effc2201baa5 /libkms++/card.cpp
parent205533cbeab897eec2a37411f0c9674ada9ee596 (diff)
Add Card::get_connected_pipelines()
Diffstat (limited to 'libkms++/card.cpp')
-rw-r--r--libkms++/card.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/libkms++/card.cpp b/libkms++/card.cpp
index aebd9a1..3dea542 100644
--- a/libkms++/card.cpp
+++ b/libkms++/card.cpp
@@ -4,6 +4,7 @@
#include <utility>
#include <stdexcept>
#include <string.h>
+#include <algorithm>
#include <xf86drm.h>
#include <xf86drmMode.h>
@@ -197,4 +198,34 @@ Crtc* Card::get_crtc_by_index(uint32_t idx) const
Crtc* Card::get_crtc(uint32_t id) const { return dynamic_cast<Crtc*>(get_object(id)); }
Encoder* Card::get_encoder(uint32_t id) const { return dynamic_cast<Encoder*>(get_object(id)); }
Property* Card::get_prop(uint32_t id) const { return dynamic_cast<Property*>(get_object(id)); }
+
+std::vector<kms::Pipeline> Card::get_connected_pipelines()
+{
+ vector<Pipeline> outputs;
+
+ for (auto conn : get_connectors())
+ {
+ if (conn->connected() == false)
+ continue;
+
+ Crtc* crtc = conn->get_current_crtc();
+
+ if (!crtc) {
+ for (auto possible : conn->get_possible_crtcs()) {
+ if (find_if(outputs.begin(), outputs.end(), [possible](Pipeline out) { return out.crtc == possible; }) == outputs.end()) {
+ crtc = possible;
+ break;
+ }
+ }
+ }
+
+ if (!crtc)
+ throw invalid_argument("fob");
+
+ outputs.push_back(Pipeline { crtc, conn });
+ }
+
+ return outputs;
+}
+
}