X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffbdev%2Fmain.c;h=88c463885488cc1a1d87d3af5a983ff4ac061a1f;hb=c5bb70cf1235e4a2cc547c8fff0bff08ca2477d1;hp=3c5def60f0733d520ac4b77ef2ccc95d8fedeace;hpb=9328fd29e99532f6d603dc005f57560ac6b40362;p=retrobench diff --git a/src/fbdev/main.c b/src/fbdev/main.c index 3c5def6..88c4638 100644 --- a/src/fbdev/main.c +++ b/src/fbdev/main.c @@ -7,23 +7,22 @@ #include #include #include +#include "fbgfx.h" +#include "fbevents.h" #include "rbench.h" #include "util.h" - -static int init_fbdev(int xsz, int ysz, int bpp); -static void close_fbdev(void); +static void keyb(int key, int pressed, void *cls); static int parse_args(int argc, char **argv); -static int fbfd = -1; -static int fbsz; +static int quit; static void *fbmem; - int main(int argc, char **argv) { int num_frames = 0; struct timeval tv, tv0; + struct fbgfx_vmode *vm; read_config("rbench.cfg"); @@ -31,52 +30,58 @@ int main(int argc, char **argv) return 1; } - if(init_fbdev(opt.width, opt.height, opt.bpp) == -1) { + fbgfx_save_video_mode(); + if(!(fbmem = fbgfx_set_video_mode(opt.width, opt.height, opt.bpp))) { + fprintf(stderr, "failed to set video mode: %dx%d %dbpp\n", opt.width, + opt.height, opt.bpp); return 1; } - - fb_width = opt.width; - fb_height = opt.height; - fb_bpp = opt.bpp; - fb_pitch = opt.width * opt.bpp / 8; + vm = fbgfx_video_mode_info(); + + fb_width = vm->width; + fb_height = vm->height; + fb_bpp = vm->bpp; + fb_pitch = vm->pitch; + fb_rmask = vm->rmask; + fb_gmask = vm->gmask; + fb_bmask = vm->bmask; + fb_rshift = vm->rshift; + fb_gshift = vm->gshift; + fb_bshift = vm->bshift; if(!(framebuf = malloc(fb_pitch * fb_height))) { fprintf(stderr, "failed to allocate %dx%d (%d bpp) framebuffer\n", fb_width, fb_height, fb_bpp); return 1; } - /* - fb_rmask = ximg->red_mask; - fb_gmask = ximg->green_mask; - fb_bmask = ximg->blue_mask; - fb_rshift = mask_to_shift(fb_rmask); - fb_gshift = mask_to_shift(fb_gmask); - fb_bshift = mask_to_shift(fb_bmask); - */ - if(init() == -1) { + if(fbev_init() == -1) { goto end; } + fbev_keyboard(keyb, 0); - /* TODO: set terminal raw and disable cursor */ + if(init() == -1) { + goto end; + } gettimeofday(&tv0, 0); for(;;) { - /* TODO read input */ + fbev_update(); + if(quit) break; gettimeofday(&tv, 0); time_msec = (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; num_frames++; redraw(); - - /* TODO copy to fb */ + memcpy(fbmem, framebuf, fb_pitch * fb_height); } end: cleanup(); - close_fbdev(); + fbev_shutdown(); + fbgfx_restore_video_mode(); if(num_frames) { printf("avg framerate: %.1f fps\n", (10000 * num_frames / time_msec) / 10.0f); @@ -84,34 +89,15 @@ end: return 0; } -int init_fbdev(int xsz, int ysz, int bpp) +static void keyb(int key, int pressed, void *cls) { - if((fbfd = open("/dev/fb0", O_RDWR)) == -1) { - perror("failed to open framebuffer device"); - return -1; - } + if(!pressed) return; - /* TODO modeset ioctl */ - - fbsz = xsz * ysz * bpp / 8; /* XXX */ - - if((fbmem = mmap(0, fbsz, PROT_WRITE, MAP_SHARED, fbfd, 0)) == (void*)-1) { - perror("failed to map framebuffer"); - return -1; + if(key == 27 || key == 'q' || key == 'Q') { + quit = 1; } - - return 0; } -void close_fbdev(void) -{ - if(fbmem) { - munmap(fbmem, fbsz); - } - if(fbfd >= 0) { - close(fbfd); - } -} static const char *usage_str = "Usage: %s [options]\n"