diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | kms++util/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | kms++util/src/testpat.cpp | 33 | 
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)  | 
