From dcb8a3f3fbeb73296580d73b6bf9c45c1a87c320 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 17 Jan 2021 20:53:41 -0800 Subject: [PATCH] [fb] Use double-buffering in fb driver Allocate and use a back buffer, so that draws to the screen are always a single memcpy() --- src/drivers/fb/main.cpp | 3 +++ src/drivers/fb/screen.cpp | 13 +++++++++++-- src/drivers/fb/screen.h | 4 +++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/drivers/fb/main.cpp b/src/drivers/fb/main.cpp index 2f02053..efedc50 100644 --- a/src/drivers/fb/main.cpp +++ b/src/drivers/fb/main.cpp @@ -60,6 +60,7 @@ main(int argc, const char **argv) screen::pixel_t fg = scr.color(0xb0, 0xb0, 0xb0); screen::pixel_t bg = scr.color(49, 79, 128); scr.fill(bg); + scr.update(); constexpr int margin = 2; const unsigned xstride = (margin + fnt.width()); @@ -85,11 +86,13 @@ main(int argc, const char **argv) scroll.add_line(e->message, eom); if (++pending > pending_threshold) { scroll.render(scr, fnt); + scr.update(); pending = 0; } } else { if (pending) { scroll.render(scr, fnt); + scr.update(); pending = 0; } } diff --git a/src/drivers/fb/screen.cpp b/src/drivers/fb/screen.cpp index a01823b..d7862f9 100644 --- a/src/drivers/fb/screen.cpp +++ b/src/drivers/fb/screen.cpp @@ -1,3 +1,5 @@ +#include +#include #include "screen.h" screen::screen(void *addr, unsigned hres, unsigned vres, pixel_order order) : @@ -6,6 +8,7 @@ screen::screen(void *addr, unsigned hres, unsigned vres, pixel_order order) : m_resx(hres), m_resy(vres) { + m_back = reinterpret_cast(malloc(hres*vres*sizeof(pixel_t))); } screen::pixel_t @@ -31,11 +34,17 @@ screen::fill(pixel_t color) { const size_t len = m_resx * m_resy; for (size_t i = 0; i < len; ++i) - m_fb[i] = color; + m_back[i] = color; } void screen::draw_pixel(unsigned x, unsigned y, pixel_t color) { - m_fb[x + y * m_resx] = color; + m_back[x + y * m_resx] = color; +} + +void +screen::update() +{ + memcpy(m_fb, m_back, m_resx*m_resy*sizeof(pixel_t)); } diff --git a/src/drivers/fb/screen.h b/src/drivers/fb/screen.h index a9766ec..8d338ce 100644 --- a/src/drivers/fb/screen.h +++ b/src/drivers/fb/screen.h @@ -19,8 +19,10 @@ public: void fill(pixel_t color); void draw_pixel(unsigned x, unsigned y, pixel_t color); + void update(); + private: - pixel_t *m_fb; + pixel_t *m_fb, *m_back; pixel_order m_order; unsigned m_resx, m_resy;