summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--kms++util/CMakeLists.txt5
-rw-r--r--kms++util/src/testpat.cpp33
3 files changed, 40 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 57088bc..f2f24fe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,6 +25,8 @@ set(KMSXX_PYTHON_VERSION "python3;python2" CACHE STRING "Python pkgconfig packag
set(KMSXX_ENABLE_KMSCUBE OFF CACHE BOOL "Enable kmscube")
+set(KMSXX_ENABLE_THREADING ON CACHE BOOL "Enable threading for parallelized drawing")
+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra -Wno-unused-parameter")
diff --git a/kms++util/CMakeLists.txt b/kms++util/CMakeLists.txt
index abee194..70f3b17 100644
--- a/kms++util/CMakeLists.txt
+++ b/kms++util/CMakeLists.txt
@@ -9,6 +9,11 @@ target_include_directories(kms++util PUBLIC
target_link_libraries(kms++util kms++)
+if (KMSXX_ENABLE_THREADING)
+ target_link_libraries(kms++util pthread)
+ add_definitions(-DHAS_PTHREAD)
+endif()
+
set_target_properties(kms++util PROPERTIES
PUBLIC_HEADER "${PUB_HDRS}")
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)