summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/db.cpp84
1 files changed, 51 insertions, 33 deletions
diff --git a/tests/db.cpp b/tests/db.cpp
index 62ebb75..e1c425f 100644
--- a/tests/db.cpp
+++ b/tests/db.cpp
@@ -15,27 +15,67 @@ using namespace kms;
static void main_loop(Card& card);
-class OutputFlipHandler : private PageFlipHandlerBase
+class Flipper
{
public:
- OutputFlipHandler(Connector* conn, Crtc* crtc, DumbFramebuffer* fb1, DumbFramebuffer* fb2)
- : m_connector(conn), m_crtc(crtc), m_fbs { fb1, fb2 }, m_front_buf(1), m_bar_xpos(0)
+ Flipper(Card& card, unsigned width, unsigned height)
+ : m_current(0), m_bar_xpos(0)
{
+ auto format = PixelFormat::XRGB8888;
+ m_fbs[0] = new DumbFramebuffer(card, width, height, format);
+ m_fbs[1] = new DumbFramebuffer(card, width, height, format);
}
- ~OutputFlipHandler()
+ ~Flipper()
{
delete m_fbs[0];
delete m_fbs[1];
}
+ Framebuffer* get_next()
+ {
+ m_current ^= 1;
+
+ const int bar_width = 20;
+ const int bar_speed = 8;
+
+ auto fb = m_fbs[m_current];
+
+ int current_xpos = m_bar_xpos;
+ int old_xpos = (current_xpos + (fb->width() - bar_width - bar_speed)) % (fb->width() - bar_width);
+ int new_xpos = (current_xpos + bar_speed) % (fb->width() - bar_width);
+
+ draw_color_bar(*fb, old_xpos, new_xpos, bar_width);
+
+ m_bar_xpos = new_xpos;
+
+ return fb;
+ }
+
+private:
+ DumbFramebuffer* m_fbs[2];
+
+ int m_current;
+ int m_bar_xpos;
+};
+
+class OutputFlipHandler : private PageFlipHandlerBase
+{
+public:
+ OutputFlipHandler(Connector* conn, Crtc* crtc, const Videomode& mode)
+ : m_connector(conn), m_crtc(crtc), m_mode(mode),
+ m_flipper(conn->card(), mode.hdisplay, mode.vdisplay)
+ {
+ }
+
OutputFlipHandler(const OutputFlipHandler& other) = delete;
OutputFlipHandler& operator=(const OutputFlipHandler& other) = delete;
void set_mode()
{
auto mode = m_connector->get_default_mode();
- int r = m_crtc->set_mode(m_connector, *m_fbs[0], mode);
+ auto fb = m_flipper.get_next();
+ int r = m_crtc->set_mode(m_connector, *fb, mode);
ASSERT(r == 0);
}
@@ -63,27 +103,11 @@ private:
void queue_next()
{
- m_front_buf = (m_front_buf + 1) % 2;
-
- const int bar_width = 20;
- const int bar_speed = 8;
-
auto crtc = m_crtc;
- auto fb = m_fbs[(m_front_buf + 1) % 2];
-
- ASSERT(crtc);
- ASSERT(fb);
-
- int current_xpos = m_bar_xpos;
- int old_xpos = (current_xpos + (fb->width() - bar_width - bar_speed)) % (fb->width() - bar_width);
- int new_xpos = (current_xpos + bar_speed) % (fb->width() - bar_width);
-
- draw_color_bar(*fb, old_xpos, new_xpos, bar_width);
-
- m_bar_xpos = new_xpos;
-
auto& card = crtc->card();
+ auto fb = m_flipper.get_next();
+
if (card.has_atomic()) {
int r;
@@ -105,13 +129,12 @@ private:
private:
Connector* m_connector;
Crtc* m_crtc;
- DumbFramebuffer* m_fbs[2];
-
- int m_front_buf;
- int m_bar_xpos;
+ Videomode m_mode;
int m_frame_num;
chrono::steady_clock::time_point m_t1;
+
+ Flipper m_flipper;
};
int main()
@@ -132,12 +155,7 @@ int main()
auto mode = conn->get_default_mode();
- auto fb1 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, PixelFormat::XRGB8888);
- auto fb2 = new DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, PixelFormat::XRGB8888);
-
- printf("conn %u, crtc %u, fb1 %u, fb2 %u\n", conn->id(), crtc->id(), fb1->id(), fb2->id());
-
- auto output = new OutputFlipHandler(conn, crtc, fb1, fb2);
+ auto output = new OutputFlipHandler(conn, crtc, mode);
outputs.push_back(output);
}