mirror of
https://github.com/tuxbox-fork-migrations/recycled-ni-neutrino.git
synced 2025-09-02 18:31:12 +02:00
fb_accel_sti: avoid additional BPA2 buffer
by increasing the framebuffer memory slightly, the additional BPA2
memory buffer can be avoided, which leads to less memory fragmentation
and the possibility to configure more memory for general system use.
Origin commit data
------------------
Commit: 2da6d13e25
Author: Stefan Seyfried <seife@tuxbox-git.slipkontur.de>
Date: 2021-10-18 (Mon, 18 Oct 2021)
This commit is contained in:
committed by
vanhofen
parent
8adb648085
commit
4efe2cfdcf
@@ -55,10 +55,14 @@
|
||||
#define DEFAULT_BPP 32
|
||||
|
||||
#define LOGTAG "[fb_accel_sti] "
|
||||
#if 0
|
||||
static int bpafd = -1;
|
||||
static size_t lbb_sz = 1920 * 1080; /* offset from fb start in 'pixels' */
|
||||
static size_t lbb_off = lbb_sz * sizeof(fb_pixel_t); /* same in bytes */
|
||||
static int backbuf_sz = 0;
|
||||
#endif
|
||||
#define BB_DIMENSION ( DEFAULT_XRES * DEFAULT_YRES )
|
||||
static size_t lfb_sz = 1920 * 1080; /* offset from fb start in 'pixels' */
|
||||
static size_t lbb_off = lfb_sz * sizeof(fb_pixel_t); /* same in bytes */
|
||||
static int backbuf_sz = BB_DIMENSION * sizeof(fb_pixel_t); /* size of blitting buffer in bytes */
|
||||
static size_t backbuf_off = lbb_off + backbuf_sz;
|
||||
|
||||
void CFbAccelSTi::waitForIdle(const char *)
|
||||
{
|
||||
@@ -94,21 +98,23 @@ void CFbAccelSTi::init(const char * const)
|
||||
memset(lfb, 0, available);
|
||||
|
||||
lbb = lfb; /* the memory area to draw to... */
|
||||
if (available < 12*1024*1024)
|
||||
if (available < 15*1024*1024)
|
||||
{
|
||||
/* for old installations that did not upgrade their module config
|
||||
* it will still work good enough to display the message below */
|
||||
fprintf(stderr, "[neutrino] WARNING: not enough framebuffer memory available!\n");
|
||||
fprintf(stderr, "[neutrino] I need at least 12MB.\n");
|
||||
fprintf(stderr, "[neutrino] I need at least 15MB.\n");
|
||||
FILE *f = fopen("/tmp/infobar.txt", "w");
|
||||
if (f) {
|
||||
fprintf(f, "NOT ENOUGH FRAMEBUFFER MEMORY!");
|
||||
fclose(f);
|
||||
}
|
||||
lbb_sz = 0;
|
||||
lfb_sz = 0;
|
||||
lbb_off = 0;
|
||||
}
|
||||
lbb = lfb + lbb_sz;
|
||||
lbb = lfb + lfb_sz;
|
||||
backbuffer = lbb + BB_DIMENSION;
|
||||
#if 0
|
||||
bpafd = open("/dev/bpamem0", O_RDWR | O_CLOEXEC);
|
||||
if (bpafd < 0)
|
||||
{
|
||||
@@ -149,6 +155,7 @@ void CFbAccelSTi::init(const char * const)
|
||||
bpafd = -1;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#ifdef PARTIAL_BLIT
|
||||
to_blit.xs = to_blit.ys = INT_MAX;
|
||||
to_blit.xe = to_blit.ye = 0;
|
||||
@@ -167,6 +174,7 @@ CFbAccelSTi::~CFbAccelSTi()
|
||||
blit(); /* wakes up the thread */
|
||||
OpenThreads::Thread::join();
|
||||
}
|
||||
#if 0
|
||||
if (backbuffer)
|
||||
{
|
||||
fprintf(stderr, LOGTAG "unmap backbuffer\n");
|
||||
@@ -178,6 +186,7 @@ CFbAccelSTi::~CFbAccelSTi()
|
||||
ioctl(bpafd, BPAMEMIO_FREEMEM);
|
||||
close(bpafd);
|
||||
}
|
||||
#endif
|
||||
if (lfb)
|
||||
munmap(lfb, available);
|
||||
if (fd > -1)
|
||||
@@ -299,7 +308,7 @@ void CFbAccelSTi::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_
|
||||
unsigned long ulFlags = 0;
|
||||
if (!transp) /* transp == false (default): use transparency from source alphachannel */
|
||||
ulFlags = BLT_OP_FLAGS_BLEND_SRC_ALPHA|BLT_OP_FLAGS_BLEND_DST_MEMORY; // we need alpha blending
|
||||
|
||||
#if 0
|
||||
STMFBIO_BLT_EXTERN_DATA blt_data;
|
||||
memset(&blt_data, 0, sizeof(STMFBIO_BLT_EXTERN_DATA));
|
||||
blt_data.operation = BLT_OP_COPY;
|
||||
@@ -339,6 +348,38 @@ void CFbAccelSTi::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_
|
||||
blt_data.src_left, blt_data.src_top, blt_data.src_right, blt_data.src_bottom,
|
||||
blt_data.srcOffset, blt_data.srcPitch, blt_data.srcMemSize);
|
||||
}
|
||||
#else
|
||||
STMFBIO_BLT_DATA blt_data;
|
||||
memset(&blt_data, 0, sizeof(STMFBIO_BLT_DATA));
|
||||
blt_data.operation = BLT_OP_COPY;
|
||||
blt_data.ulFlags = ulFlags;
|
||||
blt_data.srcOffset = backbuf_off;
|
||||
blt_data.srcPitch = width * 4;
|
||||
blt_data.dstOffset = lbb_off;
|
||||
blt_data.dstPitch = stride;
|
||||
blt_data.src_left = xp;
|
||||
blt_data.src_top = yp;
|
||||
blt_data.src_right = width;
|
||||
blt_data.src_bottom = bottom;
|
||||
blt_data.dst_left = x;
|
||||
blt_data.dst_top = y;
|
||||
blt_data.dst_right = x + dw;
|
||||
blt_data.dst_bottom = y + dh;
|
||||
blt_data.srcFormat = SURF_ARGB8888;
|
||||
blt_data.dstFormat = SURF_ARGB8888;
|
||||
blt_data.srcMemBase = STMFBGP_FRAMEBUFFER;
|
||||
blt_data.dstMemBase = STMFBGP_FRAMEBUFFER;
|
||||
|
||||
mark(x, y, blt_data.dst_right, blt_data.dst_bottom);
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
|
||||
ioctl(fd, STMFBIO_SYNC_BLITTER);
|
||||
if (fbbuff != tmpbuff)
|
||||
memmove(backbuffer, fbbuff, mem_sz);
|
||||
// icons are so small that they will still be in cache
|
||||
msync(backbuffer, backbuf_sz, MS_SYNC);
|
||||
if (ioctl(fd, STMFBIO_BLT, &blt_data ) < 0)
|
||||
perror(LOGTAG "blit2FB STMFBIO_BLT");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user