summaryrefslogtreecommitdiff
path: root/kms++util/src/testpat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kms++util/src/testpat.cpp')
-rw-r--r--kms++util/src/testpat.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/kms++util/src/testpat.cpp b/kms++util/src/testpat.cpp
index fee8d8c..8795cc6 100644
--- a/kms++util/src/testpat.cpp
+++ b/kms++util/src/testpat.cpp
@@ -4,6 +4,10 @@
#include <cstring>
#include <cassert>
+#ifdef HAS_PTHREAD
+#include <thread>
+#endif
+
#include <kms++/kms++.h>
#include <kms++util/kms++util.h>
@@ -152,7 +156,36 @@ static void draw_test_pattern_part(IFramebuffer& fb, unsigned start_y, unsigned
static void draw_test_pattern_impl(IFramebuffer& fb, YUVType yuvt)
{
+#ifdef HAS_PTHREAD
+ if (fb.height() < 20) {
+ draw_test_pattern_part(fb, 0, fb.height(), yuvt);
+ return;
+ }
+
+ // Create the mmaps before starting the threads
+ for (unsigned i = 0; i < fb.num_planes(); ++i)
+ fb.map(0);
+
+ unsigned num_threads = thread::hardware_concurrency();
+ vector<thread> workers;
+
+ unsigned part = (fb.height() / num_threads) & ~1;
+
+ for (unsigned n = 0; n < num_threads; ++n) {
+ unsigned start = n * part;
+ unsigned end = start + part;
+
+ if (n == num_threads - 1)
+ end = fb.height();
+
+ workers.push_back(thread([&fb, start, end, yuvt]() { draw_test_pattern_part(fb, start, end, yuvt); }));
+ }
+
+ for (thread& t : workers)
+ t.join();
+#else
draw_test_pattern_part(fb, 0, fb.height(), yuvt);
+#endif
}
void draw_test_pattern(IFramebuffer &fb, YUVType yuvt)