void plat_video_menu_enter(int is_rom_loaded) { g_menuscreen_ptr = vout_fbdev_resize(main_fb, g_menuscreen_w, g_menuscreen_h, 16, 0, 0, 0, 0, 3); if (g_menuscreen_ptr == NULL) fprintf(stderr, "warning: vout_fbdev_resize failed\n"); }
void plat_video_menu_leave(void) { /* have to get rid of panning so that plugins that * use fb0 and don't ever pan can work. */ vout_fbdev_clear(main_fb); g_menuscreen_ptr = vout_fbdev_resize(main_fb, g_menuscreen_w, g_menuscreen_h, 16, 0, 0, 0, 0, 1); if (g_menuscreen_ptr == NULL) fprintf(stderr, "warning: vout_fbdev_resize failed\n"); }
int vout_fbdev_init(struct vout_fbdev *fbdev, int *w, int *h, int bpp, int buffer_cnt) { int req_w, req_h; void *pret; int ret; ret = ioctl(fbdev->fd, FBIOGET_VSCREENINFO, &fbdev->fbvar_old); if (ret == -1) { perror(PFX "FBIOGET_VSCREENINFO ioctl"); return -1; } fbdev->fbvar_new = fbdev->fbvar_old; req_w = fbdev->fbvar_new.xres; if (*w != 0) req_w = *w; req_h = fbdev->fbvar_new.yres; if (*h != 0) req_h = *h; pret = vout_fbdev_resize(fbdev, req_w, req_h, bpp, 0, 0, 0, 0, buffer_cnt); if (pret == NULL) return -1; printf(PFX "%ix%i@%d\n", fbdev->fbvar_new.xres, fbdev->fbvar_new.yres, fbdev->fbvar_new.bits_per_pixel); *w = fbdev->fbvar_new.xres; *h = fbdev->fbvar_new.yres; memset(fbdev->mem, 0, fbdev->mem_size); // some checks ret = 0; ret = ioctl(fbdev->fd, FBIO_WAITFORVSYNC, &ret); if (ret != 0) fprintf(stderr, PFX "Warning: vsync doesn't seem to be supported\n"); if (fbdev->buffer_count > 1) { fbdev->buffer_write = 0; fbdev->fbvar_new.yoffset = fbdev->fbvar_new.yres * (fbdev->buffer_count - 1); ret = ioctl(fbdev->fd, FBIOPAN_DISPLAY, &fbdev->fbvar_new); if (ret != 0) { fbdev->buffer_count = 1; fprintf(stderr, PFX "Warning: can't pan display, doublebuffering disabled\n"); } } printf("fbdev initialized.\n"); return 0; }
void *pl_fbdev_set_mode(int w, int h, int bpp) { void *ret; if (w == pl_fbdev_w && h == pl_fbdev_h && bpp == pl_fbdev_bpp) return pl_fbdev_buf; pl_fbdev_w = w; pl_fbdev_h = h; pl_fbdev_bpp = bpp; vout_fbdev_clear(layer_fb); ret = vout_fbdev_resize(layer_fb, w, h, bpp, 0, 0, 0, 0, 3); if (ret == NULL) fprintf(stderr, "failed to set mode\n"); else pl_fbdev_buf = ret; menu_notify_mode_change(w, h, bpp); return pl_fbdev_buf; }
struct vout_fbdev *vout_fbdev_init(const char *fbdev_name, int *w, int *h, int bpp, int buffer_cnt) { struct vout_fbdev *fbdev; int req_w, req_h; void *pret; int ret; fbdev = calloc(1, sizeof(*fbdev)); if (fbdev == NULL) return NULL; fbdev->fd = open(fbdev_name, O_RDWR); if (fbdev->fd == -1) { fprintf(stderr, PFX "%s: ", fbdev_name); perror("open"); goto fail_open; } ret = ioctl(fbdev->fd, FBIOGET_VSCREENINFO, &fbdev->fbvar_old); if (ret == -1) { perror(PFX "FBIOGET_VSCREENINFO ioctl"); goto fail; } fbdev->fbvar_new = fbdev->fbvar_old; req_w = fbdev->fbvar_new.xres; if (*w != 0) req_w = *w; req_h = fbdev->fbvar_new.yres; if (*h != 0) req_h = *h; pret = vout_fbdev_resize(fbdev, req_w, req_h, bpp, 0, 0, 0, 0, buffer_cnt); if (pret == NULL) goto fail; printf(PFX "%s: %ix%i@%d\n", fbdev_name, fbdev->fbvar_new.xres, fbdev->fbvar_new.yres, fbdev->fbvar_new.bits_per_pixel); *w = fbdev->fbvar_new.xres; *h = fbdev->fbvar_new.yres; memset(fbdev->mem, 0, fbdev->mem_size); // some checks ret = 0; ret = ioctl(fbdev->fd, FBIO_WAITFORVSYNC, &ret); if (ret != 0) fprintf(stderr, PFX "Warning: vsync doesn't seem to be supported\n"); if (fbdev->buffer_count > 1) { fbdev->buffer_write = 0; fbdev->fbvar_new.yoffset = fbdev->fbvar_new.yres * (fbdev->buffer_count - 1); ret = ioctl(fbdev->fd, FBIOPAN_DISPLAY, &fbdev->fbvar_new); if (ret != 0) { fbdev->buffer_count = 1; fprintf(stderr, PFX "Warning: can't pan display, doublebuffering disabled\n"); } } printf("fbdev initialized.\n"); return fbdev; fail: close(fbdev->fd); fail_open: free(fbdev); return NULL; }