Mercurial > hg > Members > e085722 > Cerium
diff Renderer/Engine/viewerFB.cc @ 0:04e28d8d3c6f
first commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Nov 2010 01:23:25 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/viewerFB.cc Mon Nov 08 01:23:25 2010 +0900 @@ -0,0 +1,151 @@ +#include "viewerFB.h" +#include "fb.h" +#include <stdio.h> +#if 0 +#include <asm/ps3fb.h> +#endif + + +#define default_sdl_flag SDL_INIT_TIMER | SDL_INIT_JOYSTICK + +ViewerFB::ViewerFB() {} +ViewerFB::~ViewerFB() {} + +#if defined(__linux__) + +#define DEVICE_NAME "/dev/fb0" +#define DIV_BYTE 8 + + +ScreenInfo get_fbdev_addr(void) +{ + ScreenInfo info; + int fd_framebuffer ; + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; + long int screensize ; + //long int location; + char *fbptr ; + char tmp[DIV_BYTE*10]; + + //int x , y ; + int xres,yres,vbpp,line_len; + //unsigned short tcolor ; + + /* 読み書き用にファイルを開く */ + fd_framebuffer = open( DEVICE_NAME , O_RDWR); + if ( !fd_framebuffer ) { + send_current_error_msg("Framebuffer device open error !"); + exit(1); + } + send_current_information("The framebuffer device was opened !"); + + /* 固定スクリーン情報取得 */ + if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) { + send_current_error_msg("Fixed information not gotton !"); + exit(2); + } + + /* 変動スクリーン情報取得 */ + if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) { + send_current_error_msg("Variable information not gotton !"); + exit(3); + } + xres = vinfo.xres ; + yres = vinfo.yres ; + vbpp = vinfo.bits_per_pixel ; + line_len = finfo.line_length ; + sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp); + send_current_information( tmp ); + + /* バイト単位でのスクリーンのサイズを計算 */ + screensize = xres * yres * vbpp / DIV_BYTE ; + + /* デバイスをメモリにマップする */ + fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd_framebuffer,0); + if ( (int)fbptr == -1 ) { + send_current_error_msg("Don't get framebuffer device to memory !"); + exit(4); + } + send_current_information("The framebuffer device was mapped !"); + +#if 0 + // Take control of frame buffer from kernel + ioctl(fd_framebuffer, PS3FB_IOCTL_ON, 0); + int field_ndx = 0; + ioctl(fd_framebuffer , PS3FB_IOCTL_FSEL, &field_ndx ); +#endif + + + printf("fb: 0x%x \n", (unsigned int)fbptr); + info.xres = xres; + info.yres = yres; + info.vbpp = vbpp; + info.line_len = line_len; + info.fbptr[0] = (uint32_t *)fbptr; + + return info; + //munmap(fbptr,screensize); + //close(fd_framebuffer); + //return 0; +} + +void send_current_error_msg(const char *ptr) +{ + fprintf( stderr , "%s\n" , ptr ); +} + +void send_current_information(const char *ptr) +{ + fprintf( stdout , "%s\n" , ptr ); +} + +#else /* !defined(__linux__) */ +ScreenInfo get_fbdev_addr(void) { + ScreenInfo tmp = {0,0,0,0}; + return tmp; +} +#endif /* defined(__linux__) */ + + +Uint32 * +ViewerFB::video_init(TaskManager *manager, int bpp, int width, int height) +{ + Uint32 sdl_flag = default_sdl_flag | SDL_INIT_VIDEO; + + if (SDL_Init(sdl_flag) < 0) { + fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError()); + exit(1); + } + + screen_info = get_fbdev_addr(); + Uint32 *pixels = screen_info.fbptr[0]; + + if (pixels == 0) { + fprintf(stderr, "Cannot get frame buffer!\n"); + pixels = (new Uint32[width*height*32/8]); + } + this->width = screen_info.xres; + this->height = screen_info.yres; + this->bpp = screen_info.vbpp; + + return pixels; +} + +void +ViewerFB::clean_pixels() +{ +} + +void +ViewerFB::clear_screen() +{ +} + + +void +ViewerFB::free_device() +{ +} + +