mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-29 16:31:11 +02:00
framebuffer-ng: move hw-specific stuff into fbaccel
hardware initialization is platform specific, so put it into fbaccel instead.
This commit is contained in:
@@ -197,6 +197,7 @@ CFbAccel::CFbAccel(CFrameBuffer *_fb)
|
|||||||
{
|
{
|
||||||
blit_thread = false;
|
blit_thread = false;
|
||||||
fb = _fb;
|
fb = _fb;
|
||||||
|
init();
|
||||||
lastcol = 0xffffffff;
|
lastcol = 0xffffffff;
|
||||||
lbb = fb->lfb; /* the memory area to draw to... */
|
lbb = fb->lfb; /* the memory area to draw to... */
|
||||||
#ifdef HAVE_SPARK_HARDWARE
|
#ifdef HAVE_SPARK_HARDWARE
|
||||||
@@ -311,6 +312,12 @@ CFbAccel::~CFbAccel()
|
|||||||
if (devmem_fd != -1)
|
if (devmem_fd != -1)
|
||||||
close(devmem_fd);
|
close(devmem_fd);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef USE_OPENGL
|
||||||
|
if (fb->lfb)
|
||||||
|
munmap(fb->lfb, fb->available);
|
||||||
|
if (fb->fd > -1)
|
||||||
|
close(fb->fd);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFbAccel::update()
|
void CFbAccel::update()
|
||||||
@@ -928,3 +935,57 @@ void CFbAccel::mark(int, int, int, int)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool CFbAccel::init(void)
|
||||||
|
{
|
||||||
|
fb_pixel_t *lfb;
|
||||||
|
fb->lfb = NULL;
|
||||||
|
fb->fd = -1;
|
||||||
|
#ifdef USE_OPENGL
|
||||||
|
if (!glfb) {
|
||||||
|
fprintf(stderr, "CFbAccel::init: GL Framebuffer is not set up? we are doomed...\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fb->screeninfo = glfb->getScreenInfo();
|
||||||
|
fb->stride = 4 * fb->screeninfo.xres;
|
||||||
|
fb->available = glfb->getOSDBuffer()->size(); /* allocated in glfb constructor */
|
||||||
|
lfb = reinterpret_cast<fb_pixel_t*>(glfb->getOSDBuffer()->data());
|
||||||
|
#else
|
||||||
|
int fd;
|
||||||
|
#if HAVE_TRIPLEDRAGON
|
||||||
|
/* kernel is too old for O_CLOEXEC :-( */
|
||||||
|
fd = open("/dev/fb0", O_RDWR);
|
||||||
|
if (fd != -1)
|
||||||
|
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||||
|
#else
|
||||||
|
fd = open("/dev/fb0", O_RDWR|O_CLOEXEC);
|
||||||
|
#endif
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open /dev/fb0");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fb->fd = fd;
|
||||||
|
|
||||||
|
if (ioctl(fd, FBIOGET_VSCREENINFO, &fb->screeninfo) < 0) {
|
||||||
|
perror("FBIOGET_VSCREENINFO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl(fd, FBIOGET_FSCREENINFO, &fb->fix) < 0) {
|
||||||
|
perror("FBIOGET_FSCREENINFO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fb->available = fb->fix.smem_len;
|
||||||
|
printf("%dk video mem\n", fb->available / 1024);
|
||||||
|
lfb = (fb_pixel_t *)mmap(0, fb->available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
|
||||||
|
|
||||||
|
if (lfb == MAP_FAILED) {
|
||||||
|
perror("mmap");
|
||||||
|
return false;;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(lfb, 0, fb->available);
|
||||||
|
fb->lfb = lfb;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@@ -62,6 +62,7 @@ class CFbAccel
|
|||||||
fb_pixel_t *lbb;
|
fb_pixel_t *lbb;
|
||||||
CFbAccel(CFrameBuffer *fb);
|
CFbAccel(CFrameBuffer *fb);
|
||||||
~CFbAccel();
|
~CFbAccel();
|
||||||
|
bool init(void);
|
||||||
void paintPixel(int x, int y, const fb_pixel_t col);
|
void paintPixel(int x, int y, const fb_pixel_t col);
|
||||||
void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col);
|
void paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col);
|
||||||
void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col);
|
void paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col);
|
||||||
|
@@ -219,53 +219,10 @@ void CFrameBuffer::setupGXA(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void CFrameBuffer::init(const char * const fbDevice)
|
void CFrameBuffer::init(const char * const)
|
||||||
{
|
{
|
||||||
int tr = 0xFF;
|
int tr = 0xFF;
|
||||||
#ifdef USE_OPENGL
|
accel = new CFbAccel(this);
|
||||||
(void)fbDevice;
|
|
||||||
fd = -1;
|
|
||||||
if (!glfb) {
|
|
||||||
fprintf(stderr, "CFrameBuffer::init: GL Framebuffer is not set up? we are doomed...\n");
|
|
||||||
goto nolfb;
|
|
||||||
}
|
|
||||||
screeninfo = glfb->getScreenInfo();
|
|
||||||
stride = 4 * screeninfo.xres;
|
|
||||||
available = glfb->getOSDBuffer()->size(); /* allocated in glfb constructor */
|
|
||||||
lfb = reinterpret_cast<fb_pixel_t*>(glfb->getOSDBuffer()->data());
|
|
||||||
memset(lfb, 0x7f, stride * screeninfo.yres);
|
|
||||||
#else
|
|
||||||
fd = open(fbDevice, O_RDWR);
|
|
||||||
if(!fd) fd = open(fbDevice, O_RDWR);
|
|
||||||
|
|
||||||
if (fd<0) {
|
|
||||||
perror(fbDevice);
|
|
||||||
goto nolfb;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0) {
|
|
||||||
perror("FBIOGET_VSCREENINFO");
|
|
||||||
goto nolfb;
|
|
||||||
}
|
|
||||||
|
|
||||||
memmove(&oldscreen, &screeninfo, sizeof(screeninfo));
|
|
||||||
|
|
||||||
if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0) {
|
|
||||||
perror("FBIOGET_FSCREENINFO");
|
|
||||||
goto nolfb;
|
|
||||||
}
|
|
||||||
|
|
||||||
available=fix.smem_len;
|
|
||||||
printf("%dk video mem\n", available/1024);
|
|
||||||
lfb=(fb_pixel_t*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
|
|
||||||
|
|
||||||
if (lfb == MAP_FAILED) {
|
|
||||||
perror("mmap");
|
|
||||||
goto nolfb;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(lfb, 0, available);
|
|
||||||
#endif /* USE_OPENGL */
|
|
||||||
cache_size = 0;
|
cache_size = 0;
|
||||||
|
|
||||||
/* Windows Colors */
|
/* Windows Colors */
|
||||||
@@ -292,12 +249,7 @@ void CFrameBuffer::init(const char * const fbDevice)
|
|||||||
|
|
||||||
useBackground(false);
|
useBackground(false);
|
||||||
m_transparent = m_transparent_default;
|
m_transparent = m_transparent_default;
|
||||||
accel = new CFbAccel(this);
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nolfb:
|
|
||||||
printf("framebuffer not available.\n");
|
|
||||||
lfb=0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -322,19 +274,16 @@ CFrameBuffer::~CFrameBuffer()
|
|||||||
backupBackground = NULL;
|
backupBackground = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lfb)
|
|
||||||
munmap(lfb, available);
|
|
||||||
|
|
||||||
if (virtual_fb){
|
if (virtual_fb){
|
||||||
delete[] virtual_fb;
|
delete[] virtual_fb;
|
||||||
virtual_fb = NULL;
|
virtual_fb = NULL;
|
||||||
}
|
}
|
||||||
delete accel;
|
delete accel;
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CFrameBuffer::getFileHandle() const
|
int CFrameBuffer::getFileHandle() const
|
||||||
{
|
{
|
||||||
|
fprintf(stderr, "[fb]::%s: WARNING, this should never be used, please report!\n", __func__);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user