mirror of
https://github.com/tuxbox-fork-migrations/recycled-ni-neutrino.git
synced 2025-08-28 07:51:11 +02:00
framebuffer_ng: use hardware accel for blitBox2FB()
Origin commit data
------------------
Branch: ni/coolstream
Commit: 605eb0c831
Author: Michael Liebmann <tuxcode.bbg@gmail.com>
Date: 2016-01-28 (Thu, 28 Jan 2016)
------------------
No further description and justification available within origin commit message!
------------------
This commit was generated by Migit
This commit is contained in:
@@ -1325,4 +1325,59 @@ void CFbAccel::paintBoxRel(const int x, const int y, const int dx, const int dy,
|
|||||||
add_gxa_sync_marker();
|
add_gxa_sync_marker();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CFbAccel::blitBox2FB(const fb_pixel_t* boxBuf, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff)
|
||||||
|
{
|
||||||
|
uint32_t xc = (width > fb->getScreenWidth(true)) ? (uint32_t)fb->getScreenWidth(true) : width;
|
||||||
|
uint32_t yc = (height > fb->getScreenHeight(true)) ? (uint32_t)fb->getScreenHeight(true) : height;
|
||||||
|
|
||||||
|
#if defined(FB_HW_ACCELERATION)
|
||||||
|
if (!(width%4)) {
|
||||||
|
fb_image image;
|
||||||
|
image.dx = xoff;
|
||||||
|
image.dy = yoff;
|
||||||
|
image.width = xc;
|
||||||
|
image.height = yc;
|
||||||
|
image.cmap.len = 0;
|
||||||
|
image.depth = 32;
|
||||||
|
image.data = (const char*)boxBuf;
|
||||||
|
ioctl(fb->fd, FBIO_IMAGE_BLT, &image);
|
||||||
|
//printf("\033[33m>>>>\033[0m [%s:%s:%d] FB_HW_ACCELERATION x: %d, y: %d, w: %d, h: %d\n", __file__, __func__, __LINE__, xoff, yoff, xc, yc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("\033[31m>>>>\033[0m [%s:%s:%d] Not use FB_HW_ACCELERATION x: %d, y: %d, w: %d, h: %d\n", __file__, __func__, __LINE__, xoff, yoff, xc, yc);
|
||||||
|
#elif defined(USE_NEVIS_GXA)
|
||||||
|
void* uKva = cs_phys_addr((void*)boxBuf);
|
||||||
|
if(uKva != NULL) {
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
|
||||||
|
u32 cmd = GXA_CMD_BLT | GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(1) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(3);
|
||||||
|
_write_gxa(gxa_base, GXA_BMP1_TYPE_REG, (3 << 16) | width);
|
||||||
|
_write_gxa(gxa_base, GXA_BMP1_ADDR_REG, (unsigned int) uKva);
|
||||||
|
_write_gxa(gxa_base, cmd, GXA_POINT(xoff, yoff));
|
||||||
|
_write_gxa(gxa_base, cmd, GXA_POINT(xc, yc));
|
||||||
|
_write_gxa(gxa_base, cmd, GXA_POINT(0, 0));
|
||||||
|
//printf("\033[33m>>>>\033[0m [%s:%s:%d] USE_NEVIS_GXA x: %d, y: %d, w: %d, h: %d\n", __file__, __func__, __LINE__, xoff, yoff, xc, yc);
|
||||||
|
add_gxa_sync_marker();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("\033[31m>>>>\033[0m [%s:%s:%d] Not use USE_NEVIS_GXA x: %d, y: %d, w: %d, h: %d\n", __file__, __func__, __LINE__, xoff, yoff, xc, yc);
|
||||||
#endif
|
#endif
|
||||||
|
uint32_t swidth = fb->stride / sizeof(fb_pixel_t);
|
||||||
|
fb_pixel_t *fbp = fb->getFrameBufferPointer() + (swidth * yoff);
|
||||||
|
fb_pixel_t* data = (fb_pixel_t*)boxBuf;
|
||||||
|
|
||||||
|
uint32_t line = 0;
|
||||||
|
while (line < yc) {
|
||||||
|
fb_pixel_t *pixpos = &data[line * xc];
|
||||||
|
for (uint32_t pos = xoff; pos < xoff + xc; pos++) {
|
||||||
|
//don't paint backgroundcolor (*pixpos = 0x00000000)
|
||||||
|
if (*pixpos)
|
||||||
|
*(fbp + pos) = *pixpos;
|
||||||
|
pixpos++;
|
||||||
|
}
|
||||||
|
fbp += swidth;
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #if HAVE_COOL_HARDWARE
|
||||||
|
@@ -94,6 +94,7 @@ class CFbAccel
|
|||||||
void paintVLineRelInternal(int x, int y, int dy, const fb_pixel_t col);
|
void paintVLineRelInternal(int x, int y, int dy, const fb_pixel_t col);
|
||||||
void paintHLineRelInternal(int x, int dx, int y, const fb_pixel_t col);
|
void paintHLineRelInternal(int x, int dx, int y, const fb_pixel_t col);
|
||||||
void paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, int radius, int type);
|
void paintBoxRel(const int x, const int y, const int dx, const int dy, const fb_pixel_t col, int radius, int type);
|
||||||
|
void blitBox2FB(const fb_pixel_t* boxBuf, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -368,11 +368,13 @@ fprintf(stderr, "CFrameBuffer::setMode avail: %d active: %d\n", available, activ
|
|||||||
xRes = screeninfo.xres;
|
xRes = screeninfo.xres;
|
||||||
yRes = screeninfo.yres;
|
yRes = screeninfo.yres;
|
||||||
bpp = screeninfo.bits_per_pixel;
|
bpp = screeninfo.bits_per_pixel;
|
||||||
printf("FB: %dx%dx%d line length %d. %s nevis GXA accelerator.\n", xRes, yRes, bpp, stride,
|
printf("FB: %dx%dx%d line length %d. %s accelerator.\n", xRes, yRes, bpp, stride,
|
||||||
#ifdef USE_NEVIS_GXA
|
#if defined(USE_NEVIS_GXA)
|
||||||
"Using"
|
"Using nevis GXA"
|
||||||
|
#elif defined(BOXMODEL_APOLLO)
|
||||||
|
"Using fb hw graphics"
|
||||||
#else
|
#else
|
||||||
"Not using"
|
"Not using graphics"
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
accel->update(); /* just in case we need to update stuff */
|
accel->update(); /* just in case we need to update stuff */
|
||||||
@@ -1262,7 +1264,9 @@ void CFrameBuffer::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32
|
|||||||
void CFrameBuffer::blitBox2FB(const fb_pixel_t* boxBuf, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff)
|
void CFrameBuffer::blitBox2FB(const fb_pixel_t* boxBuf, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff)
|
||||||
{
|
{
|
||||||
checkFbArea(xoff, yoff, width, height, true);
|
checkFbArea(xoff, yoff, width, height, true);
|
||||||
|
#if HAVE_COOL_HARDWARE
|
||||||
|
accel->blitBox2FB(boxBuf, width, height, xoff, yoff);
|
||||||
|
#else
|
||||||
uint32_t swidth = stride / sizeof(fb_pixel_t);
|
uint32_t swidth = stride / sizeof(fb_pixel_t);
|
||||||
fb_pixel_t *fbp = getFrameBufferPointer() + (swidth * yoff);
|
fb_pixel_t *fbp = getFrameBufferPointer() + (swidth * yoff);
|
||||||
fb_pixel_t* data = (fb_pixel_t*)boxBuf;
|
fb_pixel_t* data = (fb_pixel_t*)boxBuf;
|
||||||
@@ -1280,7 +1284,7 @@ void CFrameBuffer::blitBox2FB(const fb_pixel_t* boxBuf, uint32_t width, uint32_t
|
|||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
accel->mark(xoff, yoff, xoff + width, yoff + height);
|
accel->mark(xoff, yoff, xoff + width, yoff + height);
|
||||||
|
#endif
|
||||||
checkFbArea(xoff, yoff, width, height, false);
|
checkFbArea(xoff, yoff, width, height, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,6 +45,8 @@ typedef struct gradientData_t
|
|||||||
fb_pixel_t* boxBuf;
|
fb_pixel_t* boxBuf;
|
||||||
bool direction;
|
bool direction;
|
||||||
int mode;
|
int mode;
|
||||||
|
int x;
|
||||||
|
int dx;
|
||||||
} gradientData_struct_t;
|
} gradientData_struct_t;
|
||||||
|
|
||||||
#define CORNER_NONE 0x0
|
#define CORNER_NONE 0x0
|
||||||
|
@@ -46,6 +46,7 @@
|
|||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include <driver/framebuffer.h>
|
||||||
#include <system/helpers.h>
|
#include <system/helpers.h>
|
||||||
#include <gui/update_ext.h>
|
#include <gui/update_ext.h>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
Reference in New Issue
Block a user