summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2016-05-25 17:30:07 +0300
committerTomi Valkeinen <tomi.valkeinen@ti.com>2016-05-25 17:30:07 +0300
commit8d50744ceb140019b805ed1b246194300e41a5f1 (patch)
treeb91a3551701fb23c77e7f07d112ca966664397f3
parent2ecf1e1d84bcec2fa77318a7e9a3ddf506a921f6 (diff)
parallelize drawing of test pattern
-rw-r--r--libkms++util/CMakeLists.txt2
-rw-r--r--libkms++util/testpat.cpp38
2 files changed, 34 insertions, 6 deletions
diff --git a/libkms++util/CMakeLists.txt b/libkms++util/CMakeLists.txt
index d08ec84..533b446 100644
--- a/libkms++util/CMakeLists.txt
+++ b/libkms++util/CMakeLists.txt
@@ -1,5 +1,5 @@
file(GLOB SRCS "*.cpp" "*.h")
add_library(kms++util ${SRCS})
-target_link_libraries(kms++util kms++)
+target_link_libraries(kms++util kms++ pthread)
target_include_directories(kms++util PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/libkms++util/testpat.cpp b/libkms++util/testpat.cpp
index cee6e85..7a15a35 100644
--- a/libkms++util/testpat.cpp
+++ b/libkms++util/testpat.cpp
@@ -4,6 +4,7 @@
#include <chrono>
#include <cstring>
#include <cassert>
+#include <thread>
#include <kms++.h>
#include <kms++util.h>
@@ -11,6 +12,8 @@
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+using namespace std;
+
namespace kms
{
static void draw_rgb_pixel(IMappedFramebuffer& buf, unsigned x, unsigned y, RGB color)
@@ -209,11 +212,10 @@ static RGB get_test_pattern_pixel(IMappedFramebuffer& fb, unsigned x, unsigned y
}
}
-static void draw_test_pattern_impl(IMappedFramebuffer& fb)
+static void draw_test_pattern_part(IMappedFramebuffer& fb, unsigned start_y, unsigned end_y)
{
unsigned x, y;
unsigned w = fb.width();
- unsigned h = fb.height();
switch (fb.format()) {
case PixelFormat::XRGB8888:
@@ -221,7 +223,7 @@ static void draw_test_pattern_impl(IMappedFramebuffer& fb)
case PixelFormat::ARGB8888:
case PixelFormat::ABGR8888:
case PixelFormat::RGB565:
- for (y = 0; y < h; y++) {
+ for (y = start_y; y < end_y; y++) {
for (x = 0; x < w; x++) {
RGB pixel = get_test_pattern_pixel(fb, x, y);
draw_rgb_pixel(fb, x, y, pixel);
@@ -233,7 +235,7 @@ static void draw_test_pattern_impl(IMappedFramebuffer& fb)
case PixelFormat::YUYV:
case PixelFormat::YVYU:
case PixelFormat::VYUY:
- for (y = 0; y < h; y++) {
+ for (y = start_y; y < end_y; y++) {
for (x = 0; x < w; x += 2) {
RGB pixel1 = get_test_pattern_pixel(fb, x, y);
RGB pixel2 = get_test_pattern_pixel(fb, x + 1, y);
@@ -244,7 +246,7 @@ static void draw_test_pattern_impl(IMappedFramebuffer& fb)
case PixelFormat::NV12:
case PixelFormat::NV21:
- for (y = 0; y < h; y += 2) {
+ for (y = start_y; y < end_y; y += 2) {
for (x = 0; x < w; x += 2) {
RGB pixel00 = get_test_pattern_pixel(fb, x, y);
RGB pixel10 = get_test_pattern_pixel(fb, x + 1, y);
@@ -261,6 +263,32 @@ static void draw_test_pattern_impl(IMappedFramebuffer& fb)
}
}
+static void draw_test_pattern_impl(IMappedFramebuffer& fb)
+{
+ if (fb.height() < 20) {
+ draw_test_pattern_part(fb, 0, fb.height());
+ return;
+ }
+
+ 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]() { draw_test_pattern_part(fb, start, end); }));
+ }
+
+ for (thread& t : workers)
+ t.join();
+}
+
void draw_test_pattern(IMappedFramebuffer &fb)
{
#ifdef DRAW_PERF_PRINT