From: Felix Domke Date: Wed, 3 Jun 2009 16:28:38 +0000 (+0200) Subject: add bcm accel X-Git-Tag: 2.6.0~267 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/ecc23dd3be5128650082a594b7e2939922d7462c add bcm accel --- diff --git a/lib/gdi/Makefile.am b/lib/gdi/Makefile.am index e5430fab..1280556e 100644 --- a/lib/gdi/Makefile.am +++ b/lib/gdi/Makefile.am @@ -6,7 +6,7 @@ noinst_LIBRARIES = libenigma_gdi.a libenigma_gdi_a_SOURCES = \ region.cpp grc.cpp epng.cpp erect.cpp fb.cpp font.cpp font_arabic.cpp gfbdc.cpp \ glcddc.cpp gpixmap.cpp lcd.cpp gfont.cpp accel.cpp picload.cpp picexif.cpp \ - compositing.cpp + compositing.cpp bcm.cpp if WITH_SDL libenigma_gdi_a_SOURCES += sdl.cpp diff --git a/lib/gdi/accel.cpp b/lib/gdi/accel.cpp index f1ffe193..bf9a5a44 100644 --- a/lib/gdi/accel.cpp +++ b/lib/gdi/accel.cpp @@ -9,7 +9,7 @@ #include gAccel *gAccel::instance; -// #define BCM_ACCEL +#define BCM_ACCEL #ifdef ATI_ACCEL extern int ati_accel_init(void); @@ -50,7 +50,7 @@ gAccel::gAccel() ati_accel_init(); #endif #ifdef BCM_ACCEL - bcm_accel_init(); + m_bcm_accel_state = bcm_accel_init(); #endif } @@ -95,12 +95,15 @@ int gAccel::blit(gSurface *dst, const gSurface *src, const eRect &p, const eRect return 0; #endif #ifdef BCM_ACCEL - bcm_accel_blit( - src->data_phys, src->x, src->y, src->stride, - dst->data_phys, dst->x, dst->y, dst->stride, - area.left(), area.top(), area.width(), area.height(), - p.x(), p.y(), p.width(), p.height()); - return 0; + if (!m_bcm_accel_state) + { + bcm_accel_blit( + src->data_phys, src->x, src->y, src->stride, + dst->data_phys, dst->x, dst->y, dst->stride, + area.left(), area.top(), area.width(), area.height(), + p.x(), p.y(), p.width(), p.height()); + return 0; + } #endif return -1; } diff --git a/lib/gdi/accel.h b/lib/gdi/accel.h index b08ba661..bbb2e26a 100644 --- a/lib/gdi/accel.h +++ b/lib/gdi/accel.h @@ -24,6 +24,7 @@ private: int m_accel_phys_addr; int m_accel_size; // in blocks int *m_accel_allocation; + int m_bcm_accel_state; static gAccel *instance; }; diff --git a/lib/gdi/bcm.cpp b/lib/gdi/bcm.cpp new file mode 100644 index 00000000..bd820913 --- /dev/null +++ b/lib/gdi/bcm.cpp @@ -0,0 +1,116 @@ +/* + Interface to the Dreambox dm800/dm8000 proprietary accel interface. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#define FBIO_ACCEL 0x23 + +static unsigned int displaylist[1024]; +static int ptr; + +#define P(x, y) do { displaylist[ptr++] = x; displaylist[ptr++] = y; } while (0) +#define C(x) P(x, 0) + +static int fb_fd; +static int exec_list(void); + +int bcm_accel_init(void) +{ + fb_fd = open("/dev/fb/0", O_RDWR); + if (fb_fd < 0) + { + perror("/dev/fb/0"); + return 1; + } + if (exec_list()) + { + fprintf(stderr, "BCM accel interface not available - %m\n"); + close(fb_fd); + return 1; + } + return 0; +} + +void bcm_accel_close(void) +{ + close(fb_fd); +} + +static int exec_list(void) +{ + int ret; + struct + { + void *ptr; + int len; + } l; + + l.ptr = displaylist; + l.len = ptr; + ret = ioctl(fb_fd, FBIO_ACCEL, &l); + ptr = 0; + return ret; +} + +void bcm_accel_blit( + int src_addr, int src_width, int src_height, int src_stride, + 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) +{ + 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 + P(0x4, 0x7e48888); // format: ARGB 8888 + + 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 + + C(0x77); // do it + + 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) +{ +// printf("unimplemented bcm_accel_fill\n"); +} +