if (n > 1)
return;
- if ((signed int)fb->vi.yres_virtual <
- fb->gr_framebuffer[0].height * 2)
- fb->vi.yres_virtual = fb->gr_framebuffer[0].height * 2;
+ if(n == 0)
+ fb->vi.yoffset = 0;
+ else
+ fb->vi.yoffset = fb->vi.yres;
- fb->vi.yoffset = n * fb->gr_framebuffer[0].height;
- fb->vi.bits_per_pixel = fb->gr_framebuffer[0].pixel_bytes * 8;
if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb->vi) < 0)
perror("Active fb swap failed");
}
static gr_surface fbdev_init(gr_backend *backend) {
- size_t bufsize;
- fbdev_common *fb = (fbdev_common *)backend->data;
-
- if (!fbdev_init_common(backend))
- return NULL;
-
- bufsize = fb->vi.xres * fb->vi.yres * fb->vi.bits_per_pixel / 8;
-
- /* Double buffer allocated as single piece of memory */
- fb->gr_framebuffer[0].data = mmap(0, bufsize * 2,
- PROT_READ | PROT_WRITE, MAP_SHARED,
- fb->fd, 0);
-
- if (fb->gr_framebuffer[0].data == MAP_FAILED) {
- perror("Failed to mmap video memory");
- fbdev_exit(backend);
- return NULL;
- }
-
- fb->gr_framebuffer[1].data = fb->gr_framebuffer[0].data + bufsize;
- gr_fill_alpha(&fb->gr_framebuffer[0]);
- memcpy(fb->gr_framebuffer[1].data, fb->gr_framebuffer[0].data,
- bufsize);
- set_displayed_framebuffer(fb, 0);
-
- printf("Framebuffer: %dx%d, %d BPP\n", fb->gr_draw->width,
- fb->gr_draw->height, fb->vi.bits_per_pixel);
-
- fbdev_blank(backend, true);
- fbdev_blank(backend, false);
- return fb->gr_draw;
+ size_t bufsize;
+ size_t bufsize_for_mmap;
+ int nr_buffer;
+
+ fbdev_common *fb = (fbdev_common *)backend->data;
+
+ if (!fbdev_init_common(backend))
+ return NULL;
+
+ nr_buffer = fb->vi.yres_virtual / fb->vi.yres;
+ printf("Frame buffer nr = %d\n", nr_buffer);
+
+ bufsize = fb->fi.line_length * fb->vi.yres;
+ //TODO : Based on Kernel code, following code is right.
+ // : However, it is strange because of bufsize > bufsize_for_mmap
+ // : It should be re-checked later with other kernel's framebuffer.
+ bufsize_for_mmap = fb->vi.xres * fb->vi.yres * fb->vi.bits_per_pixel / 8;
+
+ fb->gr_framebuffer[0].data = mmap(0, bufsize_for_mmap * nr_buffer,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ fb->fd, 0);
+
+ if (fb->gr_framebuffer[0].data == MAP_FAILED) {
+ perror("Failed to mmap video memory");
+ fbdev_exit(backend);
+ return NULL;
+ }
+
+ fb->gr_framebuffer[1].data = fb->gr_framebuffer[0].data + bufsize;
+ gr_fill_alpha(&fb->gr_framebuffer[0]);
+ memcpy(fb->gr_framebuffer[1].data, fb->gr_framebuffer[0].data,
+ bufsize);
+ set_displayed_framebuffer(fb, 0);
+
+ printf("Framebuffer: %dx%d, %d BPP\n", fb->gr_draw->width,
+ fb->gr_draw->height, fb->vi.bits_per_pixel);
+
+ fbdev_blank(backend, true);
+ fbdev_blank(backend, false);
+ return fb->gr_draw;
}
static gr_surface fbdev_flip(gr_backend *backend) {