summaryrefslogtreecommitdiff
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
parent205533cbeab897eec2a37411f0c9674ada9ee596 (diff)
Add Card::get_connected_pipelines()
-rw-r--r--libkms++/card.cpp31
-rw-r--r--libkms++/card.h4
-rw-r--r--libkms++/kms++.h1
-rw-r--r--libkms++/pipeline.h11
-rw-r--r--tests/db.cpp23
-rw-r--r--tests/testpat.cpp36
6 files changed, 61 insertions, 45 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;
+}
+
}
diff --git a/libkms++/card.h b/libkms++/card.h
index fb45d04..fbfbe74 100644
--- a/libkms++/card.h
+++ b/libkms++/card.h
@@ -5,10 +5,10 @@
#include <map>
#include "decls.h"
+#include "pipeline.h"
namespace kms
{
-
class Card
{
public:
@@ -38,6 +38,8 @@ public:
std::vector<DrmObject*> get_objects() const;
std::vector<Plane*> get_planes() const;
+ std::vector<Pipeline> get_connected_pipelines();
+
private:
std::map<uint32_t, DrmObject*> m_obmap;
diff --git a/libkms++/kms++.h b/libkms++/kms++.h
index f9808ed..7d6788d 100644
--- a/libkms++/kms++.h
+++ b/libkms++/kms++.h
@@ -8,3 +8,4 @@
#include "framebuffer.h"
#include "plane.h"
#include "property.h"
+#include "pipeline.h"
diff --git a/libkms++/pipeline.h b/libkms++/pipeline.h
new file mode 100644
index 0000000..ef04ec1
--- /dev/null
+++ b/libkms++/pipeline.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "decls.h"
+
+namespace kms
+{
+struct Pipeline {
+ Crtc* crtc;
+ Connector* connector;
+};
+}
diff --git a/tests/db.cpp b/tests/db.cpp
index 576896e..5df104d 100644
--- a/tests/db.cpp
+++ b/tests/db.cpp
@@ -84,8 +84,6 @@ public:
}
}
- Crtc* crtc() const { return m_crtc; }
-
private:
Connector* m_connector;
Crtc* m_crtc;
@@ -106,28 +104,13 @@ int main()
vector<OutputFlipHandler*> outputs;
- for (auto conn : card.get_connectors())
+ for (auto pipe : card.get_connected_pipelines())
{
- if (conn->connected() == false)
- continue;
+ auto conn = pipe.connector;
+ auto crtc = pipe.crtc;
auto mode = conn->get_default_mode();
- Crtc* crtc = conn->get_current_crtc();
- if (!crtc) {
- for (auto c : conn->get_possible_crtcs()) {
- if (find_if(outputs.begin(), outputs.end(), [c](OutputFlipHandler* o) { return o->crtc() == c; }) == outputs.end()) {
- crtc = c;
- break;
- }
- }
- }
-
- if (!crtc) {
- printf("failed to find crtc\n");
- return -1;
- }
-
auto fb1 = new Framebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
auto fb2 = new Framebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
diff --git a/tests/testpat.cpp b/tests/testpat.cpp
index 27c1bc3..9980407 100644
--- a/tests/testpat.cpp
+++ b/tests/testpat.cpp
@@ -18,31 +18,14 @@ int main()
//card.print_short();
- auto connectors = card.get_connectors();
+ auto pipes = card.get_connected_pipelines();
vector<Framebuffer*> fbs;
- vector<Crtc*> used_crtcs;
- for (auto conn : connectors)
+ for (auto pipe : pipes)
{
- if (conn->connected() == false)
- continue;
-
- Crtc* crtc = conn->get_current_crtc();
- if (!crtc) {
- vector<Crtc*> list = conn->get_possible_crtcs();
- for (auto c : list) {
- if (find(used_crtcs.begin(), used_crtcs.end(), c) == used_crtcs.end()) {
- crtc = c;
- break;
- }
- }
- }
- used_crtcs.push_back(crtc);
-
- ASSERT(crtc);
-
- int r;
+ auto conn = pipe.connector;
+ auto crtc = pipe.crtc;
// RG16 XR24 UYVY YUYV NV12
@@ -52,10 +35,15 @@ int main()
draw_test_pattern(*fb);
fbs.push_back(fb);
- r = crtc->set_mode(conn, *fb, mode);
- ASSERT(r == 0);
+ printf("conn %u, crtc %u, fb %u\n", conn->id(), crtc->id(), fb->id());
+ int r = crtc->set_mode(conn, *fb, mode);
+ ASSERT(r == 0);
+ }
+ for (auto pipe: pipes)
+ {
+ auto crtc = pipe.crtc;
Plane* plane = 0;
@@ -71,7 +59,7 @@ int main()
draw_test_pattern(*planefb);
fbs.push_back(planefb);
- r = crtc->set_plane(plane, *planefb,
+ int r = crtc->set_plane(plane, *planefb,
0, 0, planefb->width(), planefb->height(),
0, 0, planefb->width(), planefb->height());