From efb8b5ccd329eff5127223cc29b6516a6f824429 Mon Sep 17 00:00:00 2001 From: redblue-pkt Date: Thu, 11 Jun 2020 13:10:40 +0200 Subject: [PATCH] CFbAccelARM::paintRect readded and for MIPS also added Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/06088b582039a59cbd31cb9dc87bce3d02ccd6d4 Author: redblue-pkt Date: 2020-06-11 (Thu, 11 Jun 2020) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- configure.ac | 10 ++ src/driver/fb_accel.h | 23 +++- src/driver/fb_accel_arm.cpp | 74 ++++++++++- src/driver/fb_accel_mips.cpp | 246 +++++++++++++++++++++++++++++++++++ src/gui/channellist.cpp | 6 +- 5 files changed, 345 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index 7b8c036d0..9c5a96889 100644 --- a/configure.ac +++ b/configure.ac @@ -238,6 +238,16 @@ if test "$enable_arm_acc" = "yes"; then fi AM_CONDITIONAL(ENABLE_ARM_ACC, test "$enable_arm_acc" = "yes") +AC_ARG_ENABLE(mips-acc, + AS_HELP_STRING([--enable-mips-acc], [enable mips hardware acceleration @<:@default=yes@:>@]]), + [enable_mips_acc="$enableval"], + [enable_mips_acc="yes"]) + +if test "$enable_mips_acc" = "yes"; then + AC_DEFINE(ENABLE_MIPS_ACC, 1, [enable mips hardware acceleration]) +fi +AM_CONDITIONAL(ENABLE_MIPS_ACC, test "$enable_mips_acc" = "yes") + AC_ARG_ENABLE(extupdate, AS_HELP_STRING([--enable-extupdate], [enable extended update routine @<:@default=no@:>@]), AC_DEFINE(ENABLE_EXTUPDATE, 1, [enable extended update routine])) diff --git a/src/driver/fb_accel.h b/src/driver/fb_accel.h index d6cf31d3c..49ec2b296 100644 --- a/src/driver/fb_accel.h +++ b/src/driver/fb_accel.h @@ -213,9 +213,16 @@ class CFbAccelTD }; class CFbAccelARM - : public CFbAccel + : public OpenThreads::Thread, public CFbAccel { private: + void run(void); + void blit(void); + void _blit(void); + bool blit_thread; + bool blit_pending; + OpenThreads::Condition blit_cond; + OpenThreads::Mutex blit_mutex; fb_pixel_t *backbuffer; public: CFbAccelARM(); @@ -226,16 +233,21 @@ class CFbAccelARM bool fullHdAvailable(); void setOsdResolutions(); #if ENABLE_ARM_ACC -#if BOXMODEL_HD51 || BOXMODEL_HD60 || BOXMODEL_BRE2ZE4K || BOXMODEL_H7 void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); #endif -#endif }; class CFbAccelMIPS - : public CFbAccel + : public OpenThreads::Thread, public CFbAccel { private: + void run(void); + void blit(void); + void _blit(void); + bool blit_thread; + bool blit_pending; + OpenThreads::Condition blit_cond; + OpenThreads::Mutex blit_mutex; fb_pixel_t *backbuffer; public: CFbAccelMIPS(); @@ -245,6 +257,9 @@ class CFbAccelMIPS int scale2Res(int size); bool fullHdAvailable(); void setOsdResolutions(); +#if ENABLE_MIPS_ACC + void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col); +#endif }; #endif diff --git a/src/driver/fb_accel_arm.cpp b/src/driver/fb_accel_arm.cpp index ebef37629..06cd00d0d 100644 --- a/src/driver/fb_accel_arm.cpp +++ b/src/driver/fb_accel_arm.cpp @@ -39,11 +39,13 @@ #include +#include #include #include #define LOGTAG "[fb_accel_arm] " +#define FBIO_BLIT 0x22 #define FBIO_ACCEL 0x23 static unsigned int displaylist[1024]; @@ -56,7 +58,6 @@ static bool supportblendingflags = true; static int fb_fd = -1; static int exec_list(void); -#if BOXMODEL_HD51 || BOXMODEL_HD60 || BOXMODEL_BRE2ZE4K || BOXMODEL_H7 static bool accumulateoperations = false; bool bcm_accel_has_alphablending() @@ -89,7 +90,6 @@ int bcm_accel_sync() return retval; } -#if 0 void bcm_accel_blit( int src_addr, int src_width, int src_height, int src_stride, int src_format, int dst_addr, int dst_width, int dst_height, int dst_stride, @@ -160,7 +160,6 @@ void bcm_accel_blit( if (!accumulateoperations) exec_list(); } -#endif //if 0 void bcm_accel_fill( int dst_addr, int dst_width, int dst_height, int dst_stride, @@ -224,7 +223,6 @@ void bcm_accel_fill( if (!accumulateoperations) exec_list(); } -#endif static int exec_list(void) { @@ -246,6 +244,7 @@ static int exec_list(void) CFbAccelARM::CFbAccelARM() { + blit_thread = false; fb_name = "armbox framebuffer"; fb_fd = open(FB_DEVICE, O_RDWR); if (fb_fd < 0) @@ -268,10 +267,18 @@ CFbAccelARM::CFbAccelARM() /* hardware doesn't allow us to detect whether the opcode is working */ supportblendingflags = false; #endif + OpenThreads::Thread::start(); } CFbAccelARM::~CFbAccelARM() { + if (blit_thread) + { + blit_thread = false; + blit(); /* wakes up the thread */ + OpenThreads::Thread::join(); + } + if (fb_fd >= 0) { close(fb_fd); @@ -390,16 +397,71 @@ bool CFbAccelARM::fullHdAvailable() return false; } +#define BLIT_INTERVAL_MIN 40 +#define BLIT_INTERVAL_MAX 250 +void CFbAccelARM::run() +{ + printf(LOGTAG "run start\n"); + int64_t last_blit = 0; + blit_pending = false; + blit_thread = true; + blit_mutex.lock(); + set_threadname("armfb::autoblit"); + while (blit_thread) { + blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX); + int64_t now = time_monotonic_ms(); + if (now - last_blit < BLIT_INTERVAL_MIN) + { + blit_pending = true; + //printf(LOGTAG "run: skipped, time %" PRId64 "\n", now - last_blit); + } + else + { + blit_pending = false; + blit_mutex.unlock(); + _blit(); + blit_mutex.lock(); + last_blit = now; + } + } + blit_mutex.unlock(); + printf(LOGTAG "run end\n"); +} + +void CFbAccelARM::blit() +{ + //printf(LOGTAG "blit\n"); + blit_mutex.lock(); + blit_cond.signal(); + blit_mutex.unlock(); +} + +void CFbAccelARM::_blit() +{ + if (ioctl(fd, FBIO_BLIT) < 0) + printf("FBIO_BLIT"); +} + #if ENABLE_ARM_ACC -#if BOXMODEL_HD51 || BOXMODEL_HD60 || BOXMODEL_BRE2ZE4K || BOXMODEL_H7 void CFbAccelARM::paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col) { if(dx <1 || dy <1 ) return; bcm_accel_fill(fix.smem_start, screeninfo.xres, screeninfo.yres, stride,x, y, dx, dy,col); + + int line = 0; + fb_pixel_t *fbp = getFrameBufferPointer() + (swidth * y); + int pos; + while (line < dy) + { + for (pos = x; pos < x + dx; pos++) + *(fbp + pos) = col; + fbp += swidth; + line++; + } + mark(x, y, x+dx, y+dy); blit(); } #endif -#endif diff --git a/src/driver/fb_accel_mips.cpp b/src/driver/fb_accel_mips.cpp index 26e500f09..d2800f896 100644 --- a/src/driver/fb_accel_mips.cpp +++ b/src/driver/fb_accel_mips.cpp @@ -39,11 +39,13 @@ #include +#include #include #include #define LOGTAG "[fb_accel_mips] " +#define FBIO_BLIT 0x22 #define FBIO_ACCEL 0x23 static unsigned int displaylist[1024]; @@ -56,6 +58,172 @@ static bool supportblendingflags = true; static int fb_fd = -1; static int exec_list(void); +static bool accumulateoperations = false; + +bool bcm_accel_has_alphablending() +{ + return supportblendingflags; +} + +int bcm_accel_accumulate() +{ +#ifdef SUPPORT_ACCUMULATED_ACCELERATION_OPERATIONS + accumulateoperations = true; + return 0; +#else + return -1; +#endif +} + +int bcm_accel_sync() +{ + int retval = 0; + if (accumulateoperations) + { + if (ptr) + { + dprintf(DEBUG_NORMAL,"bcm_accel_sync: ptr %d\n", ptr); + retval = exec_list(); + } + accumulateoperations = false; + } + return retval; +} + +void bcm_accel_blit( + int src_addr, int src_width, int src_height, int src_stride, int src_format, + int dst_addr, int dst_width, int dst_height, int dst_stride, + int src_x, int src_y, int width, int height, + int dst_x, int dst_y, int dwidth, int dheight, + int pal_addr, int flags) +{ + if (accumulateoperations) + { + if (((sizeof(displaylist) / sizeof(displaylist[0]) - ptr) / 2) < 40) + { + dprintf(DEBUG_NORMAL,"bcm_accel_blit: not enough space to accumulate\n"); + bcm_accel_sync(); + bcm_accel_accumulate(); + } + } + + C(0x43); // reset source + C(0x53); // reset dest + C(0x5b); // reset pattern + C(0x67); // reset blend + C(0x75); // reset output + + P(0x0, src_addr); // set source addr + P(0x1, src_stride); // set source pitch + P(0x2, src_width); // source width + P(0x3, src_height); // height + switch (src_format) + { + case 0: + P(0x4, 0x7e48888); // format: ARGB 8888 + break; + case 1: + P(0x4, 0x12e40008); // indexed 8bit + P(0x78, 256); + P(0x79, pal_addr); + P(0x7a, 0x7e48888); + break; + } + + C(0x5); // set source surface (based on last parameters) + + P(0x2e, src_x); // define rect + P(0x2f, src_y); + P(0x30, width); + P(0x31, height); + + C(0x32); // set this rect as source rect + + P(0x0, dst_addr); // prepare output surface + P(0x1, dst_stride); + P(0x2, dst_width); + P(0x3, dst_height); + P(0x4, 0x7e48888); + + C(0x69); // set output surface + + P(0x2e, dst_x); // prepare output rect + P(0x2f, dst_y); + P(0x30, dwidth); + P(0x31, dheight); + + C(0x6e); // set this rect as output rect + + if (supportblendingflags && flags) P(0x80, flags); /* blend flags... We'd really like some blending support in the drivers, to avoid punching holes in the osd */ + + C(0x77); // do it + + if (!accumulateoperations) exec_list(); +} + +void bcm_accel_fill( + int dst_addr, int dst_width, int dst_height, int dst_stride, + int x, int y, int width, int height, + unsigned long color) +{ + if (accumulateoperations) + { + if (((sizeof(displaylist) / sizeof(displaylist[0]) - ptr) / 2) < 40) + { + dprintf(DEBUG_NORMAL,"bcm_accel_fill: not enough space to accumulate\n"); + bcm_accel_sync(); + bcm_accel_accumulate(); + } + } + + C(0x43); // reset source + C(0x53); // reset dest + C(0x5b); // reset pattern + C(0x67); // reset blend + C(0x75); // reset output + + // clear dest surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x45); + + // clear src surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x5); + + P(0x2d, color); + + P(0x2e, x); // prepare output rect + P(0x2f, y); + P(0x30, width); + P(0x31, height); + C(0x6e); // set this rect as output rect + + P(0x0, dst_addr); // prepare output surface + P(0x1, dst_stride); + P(0x2, dst_width); + P(0x3, dst_height); + P(0x4, 0x7e48888); + C(0x69); // set output surface + + P(0x6f, 0); + P(0x70, 0); + P(0x71, 2); + P(0x72, 2); + C(0x73); // select color keying + + C(0x77); // do it + + if (!accumulateoperations) exec_list(); +} + static int exec_list(void) { int ret; @@ -76,6 +244,7 @@ static int exec_list(void) CFbAccelMIPS::CFbAccelMIPS() { + blit_thread = false; fb_name = "mipsbox framebuffer"; fb_fd = open(FB_DEVICE, O_RDWR); if (fb_fd < 0) @@ -99,10 +268,18 @@ CFbAccelMIPS::CFbAccelMIPS() /* hardware doesn't allow us to detect whether the opcode is working */ supportblendingflags = false; #endif + OpenThreads::Thread::start(); } CFbAccelMIPS::~CFbAccelMIPS() { + if (blit_thread) + { + blit_thread = false; + blit(); /* wakes up the thread */ + OpenThreads::Thread::join(); + } + if (fb_fd >= 0) { close(fb_fd); @@ -220,3 +397,72 @@ bool CFbAccelMIPS::fullHdAvailable() #endif return false; } + +#define BLIT_INTERVAL_MIN 40 +#define BLIT_INTERVAL_MAX 250 +void CFbAccelMIPS::run() +{ + printf(LOGTAG "run start\n"); + int64_t last_blit = 0; + blit_pending = false; + blit_thread = true; + blit_mutex.lock(); + set_threadname("mipsfb::autoblit"); + while (blit_thread) { + blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX); + int64_t now = time_monotonic_ms(); + if (now - last_blit < BLIT_INTERVAL_MIN) + { + blit_pending = true; + //printf(LOGTAG "run: skipped, time %" PRId64 "\n", now - last_blit); + } + else + { + blit_pending = false; + blit_mutex.unlock(); + _blit(); + blit_mutex.lock(); + last_blit = now; + } + } + blit_mutex.unlock(); + printf(LOGTAG "run end\n"); +} + +void CFbAccelMIPS::blit() +{ + //printf(LOGTAG "blit\n"); + blit_mutex.lock(); + blit_cond.signal(); + blit_mutex.unlock(); +} + +void CFbAccelMIPS::_blit() +{ + if (ioctl(fd, FBIO_BLIT) < 0) + printf("FBIO_BLIT"); +} + +#if ENABLE_MIPS_ACC +void CFbAccelMIPS::paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col) +{ + if(dx <1 || dy <1 ) + return; + + bcm_accel_fill(fix.smem_start, screeninfo.xres, screeninfo.yres, stride,x, y, dx, dy,col); + + int line = 0; + fb_pixel_t *fbp = getFrameBufferPointer() + (swidth * y); + int pos; + while (line < dy) + { + for (pos = x; pos < x + dx; pos++) + *(fbp + pos) = col; + fbp += swidth; + line++; + } + + mark(x, y, x+dx, y+dy); + blit(); +} +#endif diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 9f5816913..03a84868c 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -2532,10 +2532,8 @@ void CChannelList::paint_events(CChannelEventList &evtlist) ffheight = g_Font[eventFont]->getHeight(); frameBuffer->paintBoxRel(x+ width,y+ theight+pig_height, infozone_width, infozone_height,COL_MENUCONTENT_PLUS_0); -#if ENABLE_ARM_ACC -#if BOXMODEL_HD51 || BOXMODEL_HD60 || BOXMODEL_BRE2ZE4K || BOXMODEL_H7 - usleep(300); // because of CFbAccelARM::paintRect() -#endif +#if ENABLE_ARM_ACC || ENABLE_MIPS_ACC + usleep(300); // because of CFbAccelARM/MIPS::paintRect() #endif char startTime[10];