#include <fcntl.h>
#include <sys/time.h>
#include <sys/mman.h>
+#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");
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);
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"